====== 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")