Dans le chapitre précédent vous avez appris à configurer le serveur HTTP Nginx pour diriger le trafic concernant Django vers l'adresse IP et le port adéquats.
Néanmoins, vous démarriez le serveur de développement ! En production, il faut impérativement utiliser un service plus robuste. De plus, vous l'avez vu, Nginx n'interprète pas de code Python. Il faut donc utiliser un service qui accepte les requêtes HTTP et qui les transfère au code Python écrit pour Django.
Il en existe plusieurs : uWSGI, mod_wsgi, Gunicorn... Le tout est de se décider ! Dans ce chapitre vous allez utiliser Gunicorn, un des serveurs HTTP Python les plus utilisés !
Gunicorn
Gunicorn est le diminutif de Green Unicorn. Il s'agit d'un serveur HTTP Python pour Unix qui utilise les spécifications WSGI (Web Server Gateway Interface). Particulièrement puissant, il est également rapide et facile à configurer. Vous verrez, vous serez épaté·e !
Gunicorn est un logiciel en ligne de commande qui se démarre directement depuis le terminal. Il s'agit d'une librairie Python en source ouverte. Elle s'installe via PyPI mais vous n'avez pas besoin de le faire : elle était présente dans le fichier requirements.txt
du projet !
Pour lancer le serveur Gunicorn, rien de plus simple : utilisez la commande gunicorn
et passez en paramètre le module de configuration. Encore une fois, vous n'avez rien à faire car Django a tout prévu. Le framework intègre un module WSGI dont les réglages par défaut sont tout à fait convenables. Vous êtes curieux ? Regardez le fichier disquaire_project/wsgi.py
. La configuration y figure !
Exécutez donc la commande suivante :
(env) celinems@disquaire:~/disquaire$ gunicorn disquaire_project.wsgi:application
[2017-09-11 23:03:46 +0000] [15335] [INFO] Starting gunicorn 19.7.1
[2017-09-11 23:03:46 +0000] [15335] [INFO] Listening at: http://127.0.0.1:8000 (15335)
[2017-09-11 23:03:46 +0000] [15335] [INFO] Using worker: sync
[2017-09-11 23:03:46 +0000] [15338] [INFO] Booting worker with pid: 15338
Le serveur tourne. Retournez sur l'URL de votre application et rechargez la page : tout fonctionne bien !
À présent, imaginez ce scénario catastrophe : après avoir ajouté des centaines de milliers de CD dans la base de données, le disquaire dont vous gérez le site passe sur une émission à très forte audience. Le nombre de requêtes explose ; en parallèle la base de données utilise énormément de mémoire. Au bout d'un moment, le serveur WSGI tombe à court de mémoire. Conséquence : le service s'arrête, purement et simplement. Vous devez immédiatement le redémarrer à la main ou les utilisateurs seront condamnés à admirer une erreur 502.
Et si un autre service pouvait surveiller que Gunicorn est bien lancé ? Et si ce même service pouvait redémarrer le serveur en cas de défaillance ? Comme la vie serait belle !
Supervisor
Supervisor est un système qui permet de contrôler un ensemble de processus vivant dans un environnement UNIX. Pour faire simple, Supervisor lance des services et les redémarre s'ils échouent. Plutôt sympa !
Avec Supervisor, vous n'auriez plus besoin d'exécuter Gunicorn à la main : il le ferait pour vous !
Il s'agit d'un logiciel qui n'est pas installé par défaut. Faites-le tout de suite :
sudo apt-get install supervisor
Tout comme Nginx, Supervisor lit un fichier de configuration situé dans etc/supervisor
. Chaque fichier finissant en .conf
et situé dans le chemin /etc/supervisor/conf.d
représente un processus qui est surveillé par Supervisor. Créez-en un nouveau :
$ sudo vi /etc/supervisor/conf.d/disquaire-gunicorn.conf
À l'intérieur, ajoutez la commande à exécuter pour démarrer Gunicorn :
disquaire-gunicorn.conf
command=/home/celinems/env/bin/gunicorn disquaire_project.wsgi:application
Mais ce n'est pas tout ! Vous pouvez ajouter très facilement plusieurs options telles que le nom du processus ou l'utilisateur Unix qui exécute la commande (root ou tout autre utilisateur).
De quoi avez-vous besoin pour exécuter Gunicorn ?
La commande exacte (ça, c'est bon ! ✅)
Le nom d'utilisateur qui a le droit d'exécuter la commande
Le chemin duquel est lancé la commande
Lisez la documentation et faites l'essai chez vous avant de lire ma correction !
disquaire-gunicorn.conf
[program:disquaire-gunicorn]
command = /home/celinems/env/bin/gunicorn disquaire_project.wsgi:application
user = celinems
directory = /home/celinems/disquaire
autostart = true
autorestart = true
L'option autostart=true
indique à Supervisor que vous souhaitez lancer ce processus au premier démarrage du serveur et autorestart=true
que la commande doit être exécutée si le processus est interrompu.
Vous pouvez également passer des variables d'environnement ! Profitez-en et ajoutez-les :
disquaire-gunicorn.conf
environment = ENV="PRODUCTION",SECRET_KEY="unenouvelleclésecrete"
Il est temps de dire à Supervisor de lancer les processus !
$ sudo supervisorctl reread
disquaire-gunicorn: available
$ sudo supervisorctl update
disquaire-gunicorn: added process group
Vérifiez que le processus a bien été ajouté en tapant la commande status
:
$ sudo supervisorctl status
disquaire-gunicorn RUNNING pid 16309, uptime 0:00:09
Hum, stocker la clé secrète dans le fichier de configuration de Supervisor n'est pas un peu étrange ?
Si ! Nous devrions la conserver dans les réglages de notre application, ce serait plus logique. Dans le prochain chapitre vous découvrirez comment réorganiser le fichier de configuration settings.py
pour mettre un peu d'ordre !
Bravo ! Vous pouvez naviguer sur l'URL de votre site et constater qu'il fonctionne de nouveau, même si le serveur Gunicorn n'apparaît plus dans la console !