Nous allons voir ici comment configurer gunicorn afin de pouvoir gérer plusieurs application du framework python Django.
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".
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.
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).
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
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
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
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 !