在Nginx反向代理中使用多个WSGI挂载点与Apache

1 投票
1 回答
1429 浏览
提问于 2025-04-15 21:16

我正在尝试在同一台服务器上使用Nginx和Apache设置多个虚拟主机,但遇到了一个奇怪的配置问题。

我已经把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项目,但每个URL的返回结果前面都加上了Apache的挂载点路径。所以,如果我访问foo.yoursite.com/wiki/biz/,Django似乎返回的是foo.yoursite.com/bar/wiki/biz/。同样地,如果我访问delta.yoursite.com/wiki/biz/,我得到的却是delta.yoursite.com/gamma/wiki/biz/。

有没有办法去掉Django和Apache返回的URL前缀呢?

1 个回答

1

最简单的方法是在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)

问题出在每个服务器的挂载地址不同。因此,你需要让后端认为它实际上是挂载在服务器的根目录下,这就需要清除SCRIPT_NAME。

请注意,如果你直接访问后端,这样做可能会引发问题。在这种情况下,你需要修改上面的内容,只在请求是通过代理发来的时候才执行这个操作。

撰写回答