как развернуть django под субурлом за nginx - PullRequest
21 голосов
/ 15 ноября 2011

У меня есть приложение django, работающее на http://localhost:12345.Я бы хотел, чтобы пользователь получил к нему доступ через URL http://my.server.com/myapp.Я использую nginx для обратного прокси к нему следующим образом:

... ...
server_name my.server.com;
location /myapp {
    rewrite /myapp(.*) $1 break;        
    ... ... # proxy param 
    proxy_pass http://localhost:12345;
}
... ...

Вопрос в том, как при настройке, как описано выше, как сделать так, чтобы URL-адреса на моих страницах ответов имели префикс «/ myapp», чтобычто nginx может направить их правильно в myapp.Например, URL-адреса на странице типа "/ foo / far" должны быть изменены на "/ myapp / foo / bar", чтобы позволить прокси nginx для myapp.Как правильно настроить nginx для достижения этой цели?

Я могу использовать переменные настройки django для указания префикса url-адреса root, но, на мой взгляд, он не является гибким, так как переменная должна быть изменена в соответствии с различнымиКонфигурация nginx (скажем, однажды nginx может изменить субурл с "/ myapp" на "/anotherapp").

Ответы [ 3 ]

14 голосов
/ 20 октября 2012

Поскольку префикс установлен в Nginx, веб-сервер, на котором размещено приложение Django, не может узнать префикс URL.Как сказал Орзел, если вы использовали apache + mod_wsgi даже nginx + gunicorn / uwsgi (с некоторой дополнительной конфигурацией), вы можете использовать значение WSGIScriptAlias, которое автоматически читается Django.

Когда мне нужно использоватьПрефикс URL, я обычно помещаю его сам в свой корневой urls.py, где у меня есть только одна строка, с префиксом префикса и включающая другой urls.py

(r'^/myapp/', include('myapp.urls')),

Но я предполагаю, что это то же самое узкое месточем установка префикса в settings.py, у вас есть избыточная конфигурация в nginx и Django.

Вам нужно сделать что-то на сервере, на котором размещено ваше приложение Django по адресу: 12345.Вы можете установить там префикс и передать его Django, используя WSGIScriptAlias ​​или его эквивалент за пределами mod_wsgi.Я не могу дать больше информации, так как не знаю, как работает ваше приложение Django.Также, возможно, вам следует рассмотреть возможность запуска приложения Django непосредственно из Django, используя uWSGI или gunicorn.

Чтобы передать префикс Django с веб-сервера, вы можете использовать это:

proxy_set_header SCRIPT_NAME /myapp;

Подробнееинформация здесь

9 голосов
/ 29 октября 2012

Вам необходимо обновить настройки:

USE_X_FORWARDED_HOST = True
FORCE_SCRIPT_NAME = /myapp

И обновите свои MEDIA_URL и STATIC_URL соответственно.

У меня не было опыта развертывания под nginx, но под apache он работает нормально см .: https://docs.djangoproject.com/en/dev/ref/settings/#use-x-forwarded-host

2 голосов
/ 10 января 2013

Вот часть моей конфигурации для nginx, которая по общему признанию не устанавливает FORCE_SCRIPT_NAME, но тогда я не использую подкаталог. Возможно, это будет полезно для настройки параметров, связанных с USE_X_FORWARDED_HOST в nginx, а не в Django.

upstream app_server_djangoapp {
    server localhost:8001 fail_timeout=0;
}

server  {
    listen xxx.xxx.xx.xx:80;
    server_name mydomain.com www.mydomain.com;
    if ($host = mydomain.com) {
        rewrite ^/(.*)$ http://www.mydomain.com/$1 permanent;
    }
    ...
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://app_server_djangoapp;
            break;
        }
    }
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...