1

我正在尝试使用 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 url 条目,django 似乎正在返回 foo.yoursite.com/bar/wiki/biz/。同样,如果我调用 delta.yoursite.com/wiki/biz/ 的 url 条目,我会得到 delta.yoursite.com/gamma/wiki/biz/。

有没有办法摆脱 django 和 apache 在 url 条目上返回的前缀?

4

1 回答 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)

出现问题是因为每个服务器都安装在不同的 URL 上。因此,您必须通过清除 SCRIPT_NAME 使后端认为它实际上已安装在服务器的根目录。

请注意,如果您还直接访问后端,这将导致问题。在这种情况下,您需要在上面进行修改以仅在请求来自代理的情况下执行此操作。

于 2010-04-06T00:06:09.977 回答