Gunicorn et Django, le combos pour une app web de type python

undraw_unicorn_re_mi7i

Nous allons voir ici comment configurer gunicorn afin de pouvoir gérer plusieurs application du framework python Django.


Installation des prérequis

Configuration d'un vitualenv python

Dans un premier temps il nous faudra installer les prérequis permettant d'utiliser les fonctionnalité de virtualenv de python.
Un virtualenv permet d'installer des dépendances python dans une instance python cloisonner. Ainsi on ne touche pas le python du système et on peu faire cohabiter divers packages de différentes versions (si on utilise bien entendu plusieurs virtualenv).
Commande pour mettre en place un virtualenv (aussi appelé venv)


# Installation du package python virtualenv
python3 -m pip install virtualenv

# Deployer un virtualenv
python3 -m virtualenv NomDeMonVirtualEnv

# Activer le virtualenv
source NomDeMonVirtualEnv/bin/activate

# Enfin installer gunicorn
pip install gunicorn

A noter que pour sortir d'un virtualenv, il suffit de taper la commande "deactivate".


Installation de nginx

Généralement, on préfère faire du proxy pass sur gunicorn à l'aide d'un serveur nginx.
Pourquoi ? Parce que c'est extrêmement facile à configurer !
Commande pour installer nginx:


 # Selon distribution linux
 sudo apt-get update
 sudo apt-get install nginx

 # Selon distribution linux
 sudo yum update
 sudo yum install nginx

Il faudra vous référez au gestionnaire de package utilisé sur votre distribution linux.


Récupérer votre application Django (ou tout autre application wsgi)

Dernier prérequis, le plus évident me diriez-vous !
Il vous faudra donc récupérer vos scripts et les déposer sur votre serveur.
Profitez pendant que vous êtes dans votre virtualenv pour installer les dépendances de votre application (pip install -r requirements.txt).

Configuration de gunicorn

Création d'un fichier de type socket

Un socket permet de démarrer un service sous linux qui n'occupera pas un port, mais une sorte de fichier.


sudo vi /etc/systemd/system/NomDeMonSocket.socket

La configuration a y copier est la suivante:


[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/NomDeMonSocket.sock

[Install]
WantedBy=sockets.target


Création d'un fichier de type service

Un service n'est autre qu'un script permettant de démarrer une application, il a particularité de pouvoir intégrer des dépendances et de pouvoir démarrer en même temps que le système d'exploitation.


sudo vi /etc/systemd/system/NomDeMonService.service

La configuration a y copier est la suivante:


[Unit]
Description=gunicorn daemon
Requires=NomDeMonSocket.socket
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/Path/To/Your/DjangoApp's
ExecStart=/Path/To/Your/Virtualenv/bin/gunicorn --workers 3 --bind unix:/run/NomDeMonSocket.socket config.wsgi:application

[Install]
WantedBy=multi-user.target


Démarrer l'application

Il ne reste plus qu'a lancer le socket et démarrer le service.


# Certains systeme necessite le rechargement du systemctl
sudo systemctl daemon-reload
# On demarre le socket
sudo systemctl start NomDeMonSocket.socket
# On demande au systeme de demarrer le socket au lancement de la machine
sudo systemctl enable NomDeMonSocket.socket

# On demarre le service
sudo systemctl start NomDeMonService.service
# On demande au systeme de demarrer le service au lancement de la machine
sudo systemctl enable NomDeMonService.service

# On verifie le retour du service afin de valider que l'application est bien demarrer
sudo systemctl status NomDeMonService.service



Configuration de nginx en mode proxy_pass gunicorn

On va maintenant configurer nginx afin de mettre en place un proxy pass vers le socket de l'application.


sudo vi /etc/nginx/conf.d/NomDeMonApplication.conf

Copier la configuration du fichier ci-dessous:


server {
    listen 80;
    server_name mon.dns.ext;
    location = /favicon.ico {acces_log off; log_not_found off; }
    location / {
        include proxy_params;
        proxy_pass http://unix:/run/NomDeMonSocket.sock;
    }
}

Et enfin redémarrer nginx


# On valide la syntaxe des fichiers de configuration
sudo nginx -t

# Restart de nginx
sudo systemctl restart nginx

# On verifie le status
sudo systemctl status nginx

Vous pouvez maintenant tester votre application depuis un navigateur web.
Enjoy !