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?