Используйте несколько точек монтирования WSGI в Apache с обратным прокси-сервером Nginx - PullRequest
1 голос
/ 06 апреля 2010

Я пытаюсь настроить несколько виртуальных хостов на одном сервере с 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. Итак, если я позвонил в django url-запись для foo.yoursite.com/wiki/biz/, django, похоже, возвращает foo.yoursite.com/bar/wiki/biz/ Аналогичным образом, если я призываю ввести URL-адрес для delta.yoursite.com/wiki/biz/, я получу delta.yoursite.com/gamma/wiki/biz/.

Есть ли способ избавиться от префикса, возвращаемого в записях URL-адресов django и apache?

1 Ответ

1 голос
/ 06 апреля 2010

Самый простой способ - использовать в файле сценария 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.

Обратите внимание, что это вызовет проблемы, если вы также обращаетесь к бэкэнду напрямую. В этой ситуации вам нужно изменить выше, чтобы сделать это, только если запрос пришел через прокси.

...