Nginx uWSGI:如何装载粘贴部署(金字塔)应用程序? 我所拥有的:

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

我有一个由粘贴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
uwsgi_param     SCRIPT_NAME '';
此配置位于Pyramid的production.ini中,因此我使用以下命令为应用程序提供服务:

uwsgi --ini-paste-logged production.ini
所有这些都很好

我想做的是: 一个简单的改变。我希望将此应用程序用作子文件夹,而不是根文件夹。而不是从
http://localhost
,我想从
http://localhost/myapp

现在一切都坏了

如果我将nginx
location
指令从
/
更改为
/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之后,我的部署遇到了这个问题

  • 对于Python2,我使用了
    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,事实上是不可取的: