Подтвердить что ты не робот

Как развернуть django под suburl за nginx

У меня есть приложение 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-префикса, но это не гибко, поскольку переменная должна быть изменена в соответствии с другой конфигурацией nginx (скажем, в один прекрасный день nginx может изменить suburl из "/myapp" to "/anotherapp" ).

4b9b3361

Ответ 1

Поскольку префикс установлен в 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;

Дополнительная информация здесь

Ответ 2

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

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

Ответ 3

Вот часть моей конфигурации для 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;
        }
    }
    ...
}