Gunicorn
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 <dossier contenant wsgi.py>.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 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
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")