====== Gunicorn ======
* [[https://zestedesavoir.com/tutoriels/598/developpez-votre-site-web-avec-le-framework-django/266_annexes/1538_deployer-votre-application-en-production/]]
==== Installation ====
Installer ''gunicorn'' avec Pip.
==== Script de lancement ====
Configurer un script pour lancer Gunicorn:
#!/bin/bash
set -e
LOGFILE=/var/log/gunicorn/plateforme_web.log
LOGDIR=$(dirname $LOGFILE)
LOGLEVEL=warning # debug; info ou warning une fois l'installation OK
NUM_WORKERS=13 # Règle : (2 x $num_cores) + 1
# user/group to run as
USER=rsr # root nécessaire pour lancer sur le port 80
GROUP=rsr
cd /home/rsr/plateformeduturfu
source venv/bin/activate # Cette ligne ne sert que si vous utilisez virtualenv
test -d $LOGDIR || mkdir -p $LOGDIR
exec gunicorn -w $NUM_WORKERS \
--user=$USER --group=$GROUP --log-level=$LOGLEVEL \
--log-file=$LOGFILE 2>>$LOGFILE -b 0.0.0.0:80 application:app
Dans le cas de Django, on remplace ''application:app'' par ''.wsgi''.
Si Nginx sera devant Gunicorn, on écoute seulement sur localhost, et sur un port supérieur à 1024 pour ne pas avoir besoin d'être root: ''-b 127.0.0.1:10030''.
Il est possible de définir des variables d’environnement pour Gunicorn, par exemple :
gunicorn -e DJANGO_SETTINGS_MODULE=core.settings.prod ...
==== Création d'un service ====
Créer un [[linux:service|service]] pour (re)lancer Gunicorn en cas de problème:
[Unit]
Description=Launch gunicorn to run web plateform
[Service]
Type=simple
User=root
ExecStart=/home/user/app/start_gunicorn.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
==== Application Django dans un sous-dossier avec Nginx ====
* [[https://www.digitalocean.com/community/questions/nginx-for-django-app-and-pelican-website?answer=41193]]
On souhaite que l'application Django soit disponible à l'adresse: ''http://example.com/foo/''.
Dans la configuration Nginx, dans le bloc ''server'' du domaine:
location /foo-static/ {
alias /home/user/django-app/static/;
}
location /foo/ {
rewrite ^/foo/(.*)$ /$1 break;
proxy_set_header X-Script-Name /foo;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
proxy_buffering off;
proxy_pass http://127.0.0.1:10030;
}
Les fichiers statiques, contenus dans le dossier ''/home/user/django-app/static/'' seront servis sous l'URL ''http://example.com/foo-static/''.
Dans ''settings.py'', ajouter la ligne suivante pour que les URLs générées par Django contiennent le préfixe:
FORCE_SCRIPT_NAME = "/foo"
Dans ce même fichier, préciser également les paramètres relatifs aux fichiers statiques:
STATIC_URL = '/foo-static/'
STATIC_ROOT = "/home/user/django-app/static/"
Les fichiers statiques se copient dans ce dossier avec la commande suivante:
python manage.py collectstatic
Il peut aussi être nécessaire de faire la même chose pour les fichiers ''MEDIA'':
MEDIA_URL = '/foo-data/'
''MEDIA_URL'' et ''STATIC_URL'' ne peuvent pas avoir la même valeur ! Penser aussi à rajouter les lignes nécessaires dans la configuration Nginx.
==== Générer des URLs absolues avec HTTPS ====
Si l'application génère des URLs absolues de la façon suivante :
{{ request.scheme }}://{{ request.get_host }}{% url 'route_name' %}
Pour que le protocole soit bien HTTPS, il faut que dans la configuration Nginx il y ait :
proxy_set_header X-Forwarded-Proto $scheme;
et dans les paramètres de Django :
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")