Nginx uWSGI:如何装载粘贴部署(金字塔)应用程序? 我所拥有的:
我有一个由粘贴ini构建的金字塔应用程序,由uWSGI提供服务,由nginx代理。它工作得很好。以下是nginx配置:Nginx uWSGI:如何装载粘贴部署(金字塔)应用程序? 我所拥有的:,nginx,pyramid,uwsgi,Nginx,Pyramid,Uwsgi,我有一个由粘贴ini构建的金字塔应用程序,由uWSGI提供服务,由nginx代理。它工作得很好。以下是nginx配置: server { listen 80; server_name localhost; access_log /var/log/myapp/nginx.access.log; error_log /var/log/myapp/nginx.error.log warn; location / { uwsgi_pass loc
server {
listen 80;
server_name localhost;
access_log /var/log/myapp/nginx.access.log;
error_log /var/log/myapp/nginx.error.log warn;
location / {
uwsgi_pass localhost:8080;
include uwsgi_params;
}
}
以下是uWSGI ini配置:
[uwsgi]
socket = 127.0.0.1:8080
virtualenv = /srv/myapp/venv
die-on-term = 1
master = 1
logto = /var/log/myapp/uwsgi.log
uwsgi_param SCRIPT_NAME '';
此配置位于Pyramid的production.ini中,因此我使用以下命令为应用程序提供服务:
uwsgi --ini-paste-logged production.ini
所有这些都很好
我想做的是:
一个简单的改变。我希望将此应用程序用作子文件夹,而不是根文件夹。而不是从http://localhost
,我想从http://localhost/myapp
现在一切都坏了
如果我将nginxlocation
指令从/
更改为/myapp
或/myapp/
,我将得到404,因为WSGI应用程序接收的URI都是以/myapp
开头的
uWSGI解决方案似乎是,然后传递--manage script name
选项,此时uWSGI应该神奇地从uri中删除子文件夹前缀,并修复该问题
但是,我找到的文档和其他资源仅给出了该表单的示例:
mount = /myapp=myapp.py
我没有包含WSGI可调用文件的myapp.py,因为我的可调用文件是由PasteDeploy构建的
那么,是否可以从粘贴ini中装载WSGI可调用?或者我必须将uwsgi配置从粘贴ini中分离出来,并通过调用Paste.deploy.loadapp
来定义一个单独的wsgi.py
,以生成一个我可以挂载的wsgi可调用文件
或者,是否有其他方法可以将此应用程序作为nginx的子文件夹提供,同时又不会弄乱url?是的,可以使用nginx将您的金字塔挂载为子目录。您需要使用uWSGI的Modifier1选项,如下所示:
location /myapp {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /myapp;
uwsgi_modifier1 30;
uwsgi_pass localhost:8080;
}
30
的神奇值告诉uWSGI从请求中的PATH\u INFO
开头删除SCRIPT\u NAME
的参数。金字塔接收请求并正确处理它
只要您使用标准金字塔机制在应用程序中生成URL或路径,SCRIPT\u NAME
将自动合并,这意味着链接/资源等的所有URL都是正确的
文档不是最清晰的,但有更多关于修改器的信息,请访问:我想按照您的建议做,但这是我能找到的最接近的解决方案:如果您愿意修改PasteDeploy配置,可以按照以下步骤操作: 将[app:main]重命名为[app:mypyramidapp],并添加一个部分,内容如下:
[composite:main]
use = egg:Paste#urlmap
/myapp = mypyramidapp
我还必须将此添加到我的nginx配置中:
[uwsgi]
socket = 127.0.0.1:8080
virtualenv = /srv/myapp/venv
die-on-term = 1
master = 1
logto = /var/log/myapp/uwsgi.log
uwsgi_param SCRIPT_NAME '';
并安装粘贴模块
sudo pip3 install paste
我想知道是否有一种方法可以“挂载”一个PasteDeploy,就像最初提出的问题一样…在从Python2切换到Python3之后,我的部署遇到了这个问题
uwsgi\u修饰符130代码>技巧,但它不再适用于Python3,如下所述:
uWSGI
源代码就知道了),但是--mount
选项接受以下语法:--mount
还需要--managescriptname
选项
它还有其他问题:
从paste.script.util.logging\u config导入fileConfig作为configure\u logging
从paste.deploy导入loadapp作为加载应用
从操作系统导入环境
config_file=environ['INI_file']
配置日志(配置文件)
应用程序=加载应用程序('config:'+配置文件)
将其保存到例如app.py
中,您可以将其与--mount/app=app.py
一起使用,INI\u文件
环境变量应指向您的.INI
文件
作为一个旁注-我考虑远离<代码> UWSGI,它是BGGY,文档缺乏很多。p> 不相关,但一般来说,通过在nginx和uWSGI之间使用UNIX套接字连接,uWSGI的性能会更好。请看,这篇文章讨论了一个极端情况,但在更典型的情况下仍然是有益的。它不适用于Python3,事实上是不可取的: