Afficher la pageAnciennes révisionsLiens de retourHaut de page Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur. ====== 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: <code bash> #!/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 </code> 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 : <code bash> gunicorn -e DJANGO_SETTINGS_MODULE=core.settings.prod ... </code> ==== Création d'un service ==== Créer un [[linux:service|service]] pour (re)lancer Gunicorn en cas de problème: <code bash> [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 </code> ==== 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: <code nginx> 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; } </code> 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: <code python> FORCE_SCRIPT_NAME = "/foo" </code> Dans ce même fichier, préciser également les paramètres relatifs aux fichiers statiques: <code python> STATIC_URL = '/foo-static/' STATIC_ROOT = "/home/user/django-app/static/" </code> <WRAP round info> Les fichiers statiques se copient dans ce dossier avec la commande suivante: <code bash> python manage.py collectstatic </code> </WRAP> Il peut aussi être nécessaire de faire la même chose pour les fichiers ''MEDIA'': <code python> MEDIA_URL = '/foo-data/' </code> <WRAP round important> ''MEDIA_URL'' et ''STATIC_URL'' ne peuvent pas avoir la même valeur ! Penser aussi à rajouter les lignes nécessaires dans la configuration Nginx. </WRAP> ==== Générer des URLs absolues avec HTTPS ==== Si l'application génère des URLs absolues de la façon suivante : <code> {{ request.scheme }}://{{ request.get_host }}{% url 'route_name' %} </code> Pour que le protocole soit bien HTTPS, il faut que dans la configuration Nginx il y ait : <code> proxy_set_header X-Forwarded-Proto $scheme; </code> et dans les paramètres de Django : <code python> SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") </code> python/gunicorn.txt Dernière modification : 2023/02/17 14:39de phsw