Рейтинг:0

Django/Gunicorn с обратным прокси-сервером Nginx — неправильное перенаправление на базовый путь

флаг in

У меня есть приложение Django, успешно работающее с Gunicorn/Uvicorn по подпути моего домена (example.com/myapp).

Виртуальный хост Nginx выглядит так:

сервер {

    имя_сервера пример.com;

    местоположение /myapp/ {
        прокси_пасс http://myapp_gunicorn/;
        proxy_set_header Хост $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $ схема;
    }

    местоположение /myapp/static/ {
        псевдоним /home/www/myapp/static/;
    }

    слушать 443 ssl; # под управлением Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # под управлением Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # под управлением Certbot
    включить /etc/letsencrypt/options-ssl-nginx.conf; # под управлением Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # под управлением Certbot

}

вверх по течению myapp_gunicorn {
    сервер 127.0.0.1:8002;
}

сервер {
    если ($host = example.com) {
        вернуть 301 https://$host$request_uri;
    } # управляется Certbot
    имя_сервера пример.com;
    слушать 80;
    вернуть 404; # под управлением Certbot
}

Вот служба systemd с командой запуска Gunicorn:

[Ед. изм]
Description=демон myapp gunicorn
После=network.target

[Оказание услуг]
Пользователь=www-данные
Группа=www-данные
Рабочий каталог=/home/www/myapp
ExecStart=/home/venvs/myapp/bin/gunicorn myapp.asgi:application -b 0.0.0.0:8002 -w 8 -k uvicorn.workers.UvicornWorker --log-file /home/www/myapp.log

[Установить]
WantedBy=многопользовательская.цель

Читаю дальше ТАК о Django в подпапке с Nginx, я добавил следующие настройки в свой Django settings.py:

FORCE_SCRIPT_NAME = '/myapp'
USE_X_FORWARDED_HOST = Истина
# Чтобы Django доверял https от прокси-сервера Nginx
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

Я могу успешно получить доступ к моему приложению и его подпутям, например https://example.com/myapp/endpoint и страница администратора Django https://example.com/myapp/admin (успешно переписан как https://example.com/myapp/admin/login/?next=/admin/) Например.

Однако при нажатии кнопки проверки на странице администратора Django меня ошибочно перенаправляют на базовый путь (https://example.com/admin/логин/?next=/admin/). Кроме того, я получаю 404 для всех статических файлов, они также обслуживаются по базовому пути. https://example.com/static/xxx вместо подпути https://example.com/myapp/static/xxx, хотя я думал, что это правильно настроено в vhost.

Я рассматривал аналогичные проблемы на SO (включая этот очень похожий), но мне это не помогло.

Есть идеи?

Michael Hampton avatar
флаг cz
Вы сообщили своему приложению, что такое базовый путь?
флаг in
В настройках Django я установил константу BASE_DIR: `BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))`, которая является системным базовым путем приложения. Я не уверен, что это то, что вы имеете в виду?
Michael Hampton avatar
флаг cz
Но где вы сказали, что основой всех ваших маршрутов является `/myapp`?
флаг in
Нигде, но я думал, что Django справляется с этим самостоятельно. Локально работает нормально. Должен ли я установить базовый маршрут? Как?
флаг in
Насколько я понимаю, параметр FORCE_SCRIPT_NAME должен выполнять эту роль именно в этом случае. Очень похоже на эту (нерешенную) проблему: https://stackoverflow.com/questions/19103470/django-admin-force-script-name-login-redirects-incorrectly
флаг in
К вашему сведению, я сдался, не нашел решения, и, похоже, его нет в соответствии с этим https://stackoverflow.com/questions/19103470/django-admin-force-script-name-login-redirects-incorrectly. Поэтому я создал разные виртуальные хосты и субдомены для каждого из моих приложений Python.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.