在Apache中使用多个WSGI挂载点和Nginx反向代理
问题描述:
我正尝试在Nginx和Apache的同一台服务器上设置多个虚拟主机,并且遇到了一个奇怪的配置问题。在Apache中使用多个WSGI挂载点和Nginx反向代理
我有nginx配置了一个通用的上游到Apache。
upstream backend {
server 1.1.1.1:8080;
}
我试图在nginx中设置多个子域,这些子域在apache中命中不同的挂载点。每个人都像下面的例子。
server {
listen 80;
server_name foo.yoursite.com;
location/{
proxy_pass http://backend/bar/;
include /etc/nginx/proxy.conf;
}
...
}
server {
listen 80;
server_name delta.yoursite.com;
location/{
proxy_pass http://backend/gamma/;
include /etc/nginx/proxy.conf;
}
...
}
这些挂载点指向Django的项目,但每个网址条目都回来了与Apache安装点路径前缀。所以,如果我为foo.yoursite.com/wiki/biz/调用django url条目,则django似乎将返回foo.yoursite.com/bar/wiki/biz/。同样,如果我要求delta.yoursite.com/wiki/biz/的url条目,我可以获得delta.yoursite.com/gamma/wiki/biz/。
有什么办法摆脱由django和apache在url条目上返回的前缀?
答
最简单的方法是使用WSGI脚本文件如下:
... existing stuff
import django.core.handlers.wsgi
_application = django.core.handlers.wsgi.WSGIHandler()
def application(environ, start_response):
# Wrapper to clear SCRIPT_NAME..
environ['SCRIPT_NAME'] = ''
return _application(environ, start_response)
问题就来了约,因为在不同的URL每个服务器坐骑。因此,您必须通过清除SCRIPT_NAME来使后端认为它实际安装在服务器的根目录中。
请注意,如果您也直接访问后端,会导致问题。在这种情况下,您需要修改上述内容,以便只有通过代理发送请求才能执行此操作。
清除SCRIPT_NAME环境变量有诀窍。谢谢,格雷厄姆! – Thomas 2010-04-06 15:10:15