在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来使后端认为它实际安装在服务器的根目录中。

请注意,如果您也直接访问后端,会导致问题。在这种情况下,您需要修改上述内容,以便只有通过代理发送请求才能执行此操作。

+0

清除SCRIPT_NAME环境变量有诀窍。谢谢,格雷厄姆! – Thomas 2010-04-06 15:10:15