Déploiement
Notre site n'est toujours pas complètement déployé :
- nous avons dû le lancer à la main avec
python hello.py, et il ne tourne que tant que la fenêtre de terminal est ouverte et la commande est lancée. - nous avons créé le code du serveur directement sur la machine, il serait beaucoup plus confortable de le faire sur notre machine de développement et de le transférer sur le serveur
gunicorn
Référence : https://bottlepy.org/docs/dev/deployment.html
Nous allons utiliser un serveur HTTP plus performant que le serveur de
développement de bottle, qui est prévu pour le développement et pas pour la
production. Nous allons utiliser gunicorn, qui est un serveur HTTP WSGI (Web
Server Gateway Interface) pour Python. Il est capable de gérer plusieurs
requêtes simultanément, ce qui le rend plus adapté pour un environnement de
production.
Pour l'installer, en tant que root :
apt install gunicorn
Une petite modification de notre code hello.py est nécessaire pour que
gunicorn puisse le lancer. Il faut ajouter une variable app qui contient
l'application bottle, et qui permet d'exporter l'application pour un serveur
externe.
from bottle import default_app, #...
app = default_app()
Pour lancer le serveur avec gunicorn, il faut se placer dans le répertoire où
se trouve le fichier hello.py et lancer la commande suivante :
gunicorn hello:app
Cela va lancer le serveur sur le port 8000 par défaut. On peut changer ce port et beaucoup d'autres options avec des arguments de la ligne de commande.
- pour changer le port, on peut utiliser l'option
-b(bind) :-b localhost:8080pour le port 8080 par exemple. - pour changer le nombre de workers (processus) à lancer, on peut utiliser
l'option
-w(workers) :-w 4pour 4 workers par exemple. - pour lancer le serveur en arrière-plan, on peut utiliser l'option
--daemon:--daemonpour le lancer en arrière-plan. - ... (
man gunicornpour les xxx autres options)
gunicorn -b localhost:8080 -w 4 hello:app
Il est possible de mettre toutes ces options dans un fichier de configuration
gunicorn.conf.py :
bind = 'localhost:8080'
workers = 4
daemon = True
On peut ensuite lancer le serveur avec la commande :
gunicorn -c gunicorn.conf.py hello:app
Lancement automatique
Pour que le serveur se relance automatiquement après un redémarrage de la
machine, on peut utiliser systemd, qui est un système d'initialisation et de
gestion de services installé par défaut sur la plupart des distributions Linux.
Il faut créer un fichier de configuration pour le service dans le répertoire
/etc/systemd/system/. En tant que root, on peut créer un fichier
hello.service :
[Unit]
# Description du service
Description=Hello World service
# On attend que le réseau soit démarré avant de lancer le service
After=network.target
# On attend que le service nginx soit démarré avant de lancer le service (pas obligatoire)
After=nginx.service
[Service]
# La commande à exécuter pour lancer le service (elle doit rester au premier plan)
ExecStart=/usr/bin/gunicorn -b localhost:8080 -w 4 hello:app
# On indique que le service doit être lancé dans le répertoire où se trouve le fichier hello.py
WorkingDirectory=/home/webapp/test
# On indique l'utilisateur sous lequel le service doit s'exécuter
User=webapp
# On indique le groupe sous lequel le service doit s'exécuter
Group=webapp
# On indique que le service doit être redémarré automatiquement dans tous les cas
Restart=always
Il faut ensuite recharger la configuration de systemd :
systemctl daemon-reload
Puis on peut démarrer le service :
systemctl start hello
On peut vérifier que le service est bien démarré avec la commande :
systemctl status hello
On peut aussi activer le service pour qu'il se lance automatiquement au démarrage de la machine :
systemctl enable hello