Назад | Перейти на главную страницу

Как переписать URL-адреса с двумя nginx в качестве обратного прокси для Gunicorn / Django

У меня есть приложение 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.

Было бы неплохо иметь решение, в котором бэкэнд не нужно настраивать с помощью пути, возможно, передав имя скрипта из внешнего интерфейса в бэкэнд и имея некоторую магию для статических файлов. Но эй, это работает!