uWSGI:如何安装粘贴部署(金字塔)应用程序?

时间:2015-06-10 22:54:03

标签: nginx pyramid uwsgi

我拥有的是什么:

我有一个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的子文件夹提供,而不会弄乱网址反转?

3 个答案:

答案 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后,我的部署遇到了这个问题。

  1. 在Python2中,我使用了uwsgi_modifier1 30;技巧,但在Python3中不再起作用,如此处所述:https://github.com/unbit/uwsgi/issues/876

  2. 它的文档非常糟糕(根本没有?我通过阅读uWSGI源代码知道了这一点),但是--mount选项接受以下语法:

--mount=/app=config:/path/to/app.ini

请注意:对于--mount,您还需要--manage-script-name选项。

它还有其他问题:https://github.com/unbit/uwsgi/issues/2172

  1. 围绕Paste-Deploy应用程序编写包装器脚本很简单,这是我现在部署的方式:
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,因为它有很多错误,而且文档也很多。