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

gee*_*des 5 nginx uwsgi pyramid

是)我有的:

我有一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

此配置位于Pyramid的production.ini中,因此我使用以下命令为应用程序提供服务:

uwsgi --ini-paste-logged production.ini
Run Code Online (Sandbox Code Playgroud)

所有这一切都很好.

我想做的事:

一个简单的改变.我想将此应用程序作为子文件夹而不是作为根目录提供.http://localhost我希望从中提供服务,而不是从中提供服务http://localhost/myapp.

现在一切都破了.

如果我将nginx location指令更改//myapp/myapp/,我得到404,因为WSGI应用程序接收所有前缀的uris /myapp.

uWSGI解决方案似乎是将WSGI callable挂载到子文件夹上,然后传递--manage-script-name选项,此时uWSGI应该从uri中神奇地剥离子文件夹前缀并修复问题.

但是,我发现的文档和所有其他资源只给出了表单的示例:

mount = /myapp=myapp.py
Run Code Online (Sandbox Code Playgroud)

我没有包含WSGI可调用的myapp.py,因为我的可调用是由PasteDeploy构建的.

那么,是否可以从Paste ini中挂载WSGI callable?或者我是否必须将Uwsgi配置从Paste ini中拆分出来并定义一个单独wsgi.py的调用paste.deploy.loadapp来生成一个可以挂载的wsgi callable?

或者是否有另一种方法可以将此应用程序作为nginx的子文件夹提供服务,同时不会弄乱网址反转?

dav*_*djb -1

是的,绝对可以使用 Nginx 将 Pyramid 挂载为子目录。您需要使用 uWSGI 中的 Modifier1 选项,如下所示:

location /myapp {
    include uwsgi_params;
    uwsgi_param SCRIPT_NAME /myapp;
    uwsgi_modifier1 30;
    uwsgi_pass localhost:8080;
}
Run Code Online (Sandbox Code Playgroud)

的神奇值告诉uWSGI从请求的开头30删除参数。Pyramid 接收请求并正确处理它。 SCRIPT_NAMEPATH_INFO

只要您使用标准金字塔机制在应用程序中生成 URL 或路径,SCRIPT_NAME就会自动合并,这意味着链接/资源等的所有 URL 都是正确的。

该文档不是最清晰的,但有更多关于修饰符的信息,请访问: https: //uwsgi-docs.readthedocs.org/en/latest/Protocol.html