我正在运行 nginx 0.8.44,并且有两个 uwsgi (0.9.5.4) 实例。一个用于我的 Django 网站,另一个运行 Trac。
我将 Django 设置为location / { ... }
,Trac 为location /trac { ... }
但是当我转到 时http://mysite/trac
,它会为 Trac 提供 URL 的 /trac 部分。所以我基本上得到了 404,因为 Trac 正在其根目录下寻找 URL,即 /trac。它转到的页面显示
Error: Not Found
No handler matched request to /trac
而且 CSS 样式表在该页面上不起作用。但 Trac 的典型部分仍然存在,例如“查看票证”和“Wiki”链接。
但是,如果我将 Trac 的位置更改为 /,它就可以正常工作。nginx 或 uwsgi 中是否有某种方法可以不将 URL 的“位置”部分发送给应用程序?如果 Django 的位置不是 /,也会发生这种情况。
我之前使用过带有 mod_wsgi 的 Apache,它能够轻松完成此操作。
答案1
对于那些寻找的人来说,
使用 fastcgi(我想,对于 wsgi 也是类似的方法),也可以这样做,类似于http://wiki.nginx.org/FcgiZope:
location /trac {
fastcgi_pass unix:/path/to/socket;
if ($uri ~ ^/trac/(.*)) {
set $path_info /$1;
}
include fastcgi_params;
fastcgi_param SCRIPT_NAME "/trac";
fastcgi_param PATH_INFO $path_info;
}
;或者,不加任何额外内容if
:
location ~ ^/trac(?<path_info>/.*)$ {
fastcgi_pass unix:/path/to/socket;
include fastcgi_params;
fastcgi_param SCRIPT_NAME "/trac";
fastcgi_param PATH_INFO $path_info;
}
。
答案2
我最终设置了子域名。
因此对于 trac,我使用的是 trac.mydomain.com。
我没有找到不使用子域名来实现这一点的方法,但也许可以。这最终是最简单的方法。
对于任何阅读本文的人,您需要将任何子域添加到您的 DNS。对于 nginx 配置,您可以使用类似以下内容:
http {
upstream django {
ip_hash;
server 127.0.0.1:3030;
}
upstream trac {
ip_hash;
server 127.0.0.1:3031;
}
server {
listen 80;
server_name mydomain.com;
location / {
uwsgi_pass django;
include uwsgi_params;
}
}
server {
listen 80;
server_name trac.mydomain.com;
location / {
uwsgi_pass trac;
include uwsgi_params;
}
}