我有一个Pyramid应用程序,它是由一个Paste 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 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
此配置位于Pyramid&pbsp; production.ini 中,以便我使用此命令为应用程序提供服务:
uwsgi --ini-paste-logged production.ini
所有这一切都很好。
一个简单的改变。我想将此应用程序作为子文件夹而不是作为根目录提供。我希望从http://localhost
提供服务,而不是从http://localhost/myapp
提供服务。
现在所有内容都已损坏。
如果我将nginx location
指令从/
更改为/myapp
或/myapp/
,我会得到404,因为WSGI应用程序会收到所有前缀为{{{ 1}}。
uWSGI解决方案似乎是mount the WSGI callable on the subfolder,然后传递/myapp
选项,此时uWSGI应该从uri中神奇地剥离子文件夹前缀并解决问题。
但是,我发现的文档和所有其他资源仅提供了表单示例:
--manage-script-name
我没有包含WSGI可调用的myapp.py,因为我的可调用是由PasteDeploy构建的。
那么,是否有可能从Paste ini中挂载可调用的WSGI?或者我是否必须将uwsgi配置从Paste ini中分离出来并定义一个单独的mount = /myapp=myapp.py
并调用wsgi.py
以生成可以挂载的wsgi callable?
或者是否有另一种方法可以将这个应用程序作为nginx的子文件夹提供,而不会弄乱网址反转?
答案 0 :(得分:0)
是的,绝对可以将您的Pyramid作为Nginx的子目录安装。您需要使用的是uWSGI的Modifier1选项,如下所示:
location /myapp {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /myapp;
uwsgi_modifier1 30;
uwsgi_pass localhost:8080;
}
30
的神奇值告诉uWSGI从请求中SCRIPT_NAME
的开头删除PATH_INFO
的参数。金字塔接收请求并正确处理它。
只要您使用标准金字塔机制在您的应用程序中生成URL或路径,SCRIPT_NAME
将自动合并,这意味着所有链接/资源的URL都是正确的。
文档并不是最清晰的,但有关修饰符的更多内容可在:https://uwsgi-docs.readthedocs.org/en/latest/Protocol.html
答案 1 :(得分:0)
我想做你的建议,但这是我能找到的最接近的解决方案:如果你愿意修改你的PasteDeploy配置,你可以按照以下步骤进行操作:http://docs.pylonsproject.org/docs/pyramid/en/1.0-branch/narr/vhosting.html
将[app:main]重命名为[app:mypyramidapp]并添加以下内容:
[composite:main]
use = egg:Paste#urlmap
/myapp = mypyramidapp
我还必须将此添加到我的nginx配置中:
uwsgi_param SCRIPT_NAME '';
并安装粘贴模块
sudo pip3 install paste
我想知道是否有一种方法可以“装载”PasteDeploy,原来问题是......
答案 2 :(得分:0)
从Python2切换到Python3后,我的部署遇到了这个问题。
在Python2中,我使用了uwsgi_modifier1 30;
技巧,但在Python3中不再起作用,如此处所述:https://github.com/unbit/uwsgi/issues/876
它的文档非常糟糕(根本没有?我通过阅读uWSGI
源代码知道了这一点),但是--mount
选项接受以下语法:
--mount=/app=config:/path/to/app.ini
请注意:对于--mount
,您还需要--manage-script-name
选项。
它还有其他问题:https://github.com/unbit/uwsgi/issues/2172
from paste.script.util.logging_config import fileConfig as configure_logging
from paste.deploy import loadapp as load_app
from os import environ
config_file = environ['INI_FILE']
configure_logging(config_file)
application = load_app('config:' + config_file)
将其保存到例如app.py
,并且您可以将其与--mount /app=app.py
一起使用,INI_FILE
环境变量应指向您的.ini
文件。
请注意-我考虑远离uWSGI
,因为它有很多错误,而且文档也很多。