【发布时间】:2015-08-26 10:25:57
【问题描述】:
我有什么:
我有一个 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 的 production.ini 中,因此我使用以下命令为应用程序提供服务:
uwsgi --ini-paste-logged production.ini
所有这些都很好。
我想做什么:
一个简单的改变。我想将此应用程序作为子文件夹提供服务,而不是作为根。我不想从http://localhost 提供服务,而是从http://localhost/myapp 提供服务。
现在一切都坏了。
如果我将 nginx location 指令从 / 更改为 /myapp 或 /myapp/,我会得到 404,因为 WSGI 应用程序接收到的 uris 都以 /myapp 开头。
uWSGI 的解决方案似乎是 mount the WSGI callable on the subfolder,然后传递 --manage-script-name 选项,此时 uWSGI 应该神奇地从 uri 中去除子文件夹前缀并修复问题。
但是,我发现的文档和所有其他资源仅给出了以下形式的示例:
mount = /myapp=myapp.py
我没有包含 WSGI 可调用对象的 myapp.py,因为我的可调用对象是由 PasteDeploy 构建的。
那么,是否有可能从 Paste ini 中挂载 WSGI 可调用对象?还是我必须将 uwsgi 配置从 Paste ini 中拆分出来,并通过调用 paste.deploy.loadapp 来定义一个单独的 wsgi.py 以生成我可以挂载的 wsgi 可调用对象?
或者是否有另一种方法可以将此应用程序作为 nginx 的子文件夹提供服务,同时又不会弄乱 url 反转?
【问题讨论】:
-
不相关,但一般来说,通过在 nginx 和 uWSGI 之间使用 UNIX 套接字连接,uWSGI 会表现得更好。请参阅blog.dscpl.com.au/2015/05/… 该帖子讨论了一个极端情况,但在更典型的情况下仍然有益。