У меня есть приложение Django, развернутое с помощью gunicorn на порту 8000, на виртуальной машине с серверной частью nginx, порт 80, на той же виртуальной машине. Конфигурация nginx:
location / {
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://localhost:8000/;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header REMOTE_USER $remote_user;
}
location /static/ {
}
На стороне интерфейса есть еще один nginx, порт 443, переводящий URL-адреса, видимые пользователем. https://myserver.com/myapplication/
во внутренний http://myvm/
. Конфигурация nginx:
location /myapplication/ {
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://myvm/;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header REMOTE_USER $remote_user;
}
Хотя я могу получить доступ к любому URL-адресу, например https://myserver.com/myapplication/
без проблем все ссылки в приложении Django не имеют /myapplication/
компонент пути. Что не так с моими настройками nginx? Неправильный ли фронтенд или бэкэнд?
Конфигурация внешнего интерфейса в порядке, но сервер нуждается в изменении:
location / {
...
proxy_set_header SCRIPT_NAME /myapplication;
}
location /myapplication/static/ {
alias /path/to/myapplication/static/;
}
Соответствующий бит устанавливался SCRIPT_NAME
который, похоже, интерпретируется Django.
Было бы неплохо иметь решение, в котором бэкэнд не нужно настраивать с помощью пути, возможно, передав имя скрипта из внешнего интерфейса в бэкэнд и имея некоторую магию для статических файлов. Но эй, это работает!