Puncte:0

Django / Gunicorn cu proxy invers Nginx - Redirecționare greșită către calea de bază

drapel in

Am o aplicație Django care rulează cu succes cu Gunicorn/Uvicorn, sub o cale secundară a domeniului meu (example.com/myapp).

Vhost-ul Nginx arată astfel:

Server {

    nume_server example.com;

    locație /myapp/ {
        proxy_pass http://myapp_gunicorn/;
        proxy_set_header Gazdă $gazdă;
        proxy_set_header X-Real-IP $adresă_la distanță;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $schema;
    }

    locație /myapp/static/ {
        alias /home/www/myapp/static/;
    }

    asculta 443 ssl; # gestionat de Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # gestionat de Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # gestionat de Certbot
    includ /etc/letsencrypt/options-ssl-nginx.conf; # gestionat de Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # gestionat de Certbot

}

în amonte myapp_gunicorn {
    server 127.0.0.1:8002;
}

Server {
    dacă ($gazdă = exemplu.com) {
        returnează 301 https://$host$request_uri;
    } # gestionat de Certbot
    nume_server example.com;
    asculta 80;
    întoarce 404; # gestionat de Certbot
}

Iată serviciul systemd cu comanda de pornire a lui Gunicorn:

[Unitate]
Descriere=myapp gunicorn daemon
După=rețea.țintă

[Serviciu]
Utilizator=www-date
Grup=www-date
WorkingDirectory=/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

[Instalare]
WantedBy=multi-user.target

Citind mai departe Deci despre Django în subfolder cu Nginx, am adăugat următoarele setări la Django settings.py:

FORCE_SCRIPT_NAME = '/myapp'
USE_X_FORWARDED_HOST = Adevărat
# Pentru ca Django să aibă încredere în https din proxy-ul Nginx
SECURE_PROXY_SSL_HEADER = („HTTP_X_FORWARDED_PROTO”, „https”)

Pot accesa cu succes aplicația mea și căile secundare ale acesteia, cum ar fi https://example.com/myapp/endpoint și pagina de administrare Django https://example.com/myapp/admin (rescris cu succes ca https://example.com/myapp/admin/login/?next=/admin/) de exemplu.

Cu toate acestea, când fac clic pe butonul de validare pagina de administrare Django, sunt redirecționat greșit către calea de bază (https://example.com/admin/login/?next=/admin/). De asemenea, primesc un 404 pentru toate fișierele statice, acestea fiind, de asemenea, servite sub calea de bază https://example.com/static/xxx în locul căii secundare https://example.com/myapp/static/xxx, deși am crezut că a fost configurat corect în vhost.

M-am uitat la probleme similare pe SO (inclusiv aceasta foarte asemanatoare), dar nu m-a ajutat.

Vreo idee?

Michael Hampton avatar
drapel cz
Ați spus aplicației dvs. care este calea de bază?
drapel in
În setarea Django, am setat constanta BASE_DIR: `BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))`, care este calea de bază de sistem a aplicației. Nu sunt sigur la asta te referi?
Michael Hampton avatar
drapel cz
Dar unde i-ai spus că baza tuturor rutelor tale este `/myapp`?
drapel in
Nicăieri, dar am crezut că Django se descurcă singur. Local funcționează bine. Ar trebui să setez ruta de bază? Cum?
drapel in
Din câte am înțeles, setarea FORCE_SCRIPT_NAME ar trebui să ocupe acest rol în acest caz precis. Seamănă foarte mult cu această problemă (nerezolvată): https://stackoverflow.com/questions/19103470/django-admin-force-script-name-login-redirects-incorrectly
drapel in
FYI Am renunțat, nu am găsit o soluție și se pare că nu există una conform acestui https://stackoverflow.com/questions/19103470/django-admin-force-script-name-login-redirects-incorrectly. Așa că am creat diferite vhost-uri și subdomenii pentru fiecare dintre aplicațiile mele Python.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.