python:gunicorn

Ceci est une ancienne révision du document !


Gunicorn

Installer gunicorn avec Pip.

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.


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

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.

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")
  • python/gunicorn.1643146050.txt.gz
  • Dernière modification : 2022/01/25 22:27
  • de phsw