Ce billet est une « mise à jour » du précédent, concernant le déploiement de Mercurial, sous forme d'application WSGI.
Le fait de passer par le script /etc/init.d/after.local
, pour lancer une telle application, ne m'a pas entièrement satisfait. C'est pourquoi j'ai décidé de me repencher sur ce point.
À la fin de l'article, j'évoqué, Gunicorn, comme serveur WSGI, en proposant même un exemple de fichier .service
. Je me suis donc inspiré de celui-ci pour en créer un.
Le but c'est de pouvoir exécuter le script, hgweb.wsgi
au démarrage.
Je vous propose donc, wsgi-hg.service
. Il permet de lancer (ou d'arrêter) notre script WSGI. Il n'y a rien de particulier, à part la condition ConditionPathExistsGlob, qui me sert à tester si un fichier .wsgi
(en réalité hgweb.wsgi
) est présent sur le serveur, si c'est le cas, le service pourra être lancé.
Il faut bien sur, avoir correctement configuré son serveur Web. Par exemple pour Nginx :
[...]
# Subdomain settings
#
# Mercurial
#
server {
listen 80;
server_name hg.errements.net;
access_log /var/log/nginx/access-hg.log;
location / {
root /srv/www/htdocs/vhosts/hg;
autoindex off;
proxy_path http://127.0.0.1:8500;
proxy_set_header Host $host;
}
}
[...]
Mais on peut aller encore plus loin, actuellement dans notre script wsgi, le socket réseau (le port, et l'adresse IP) sont codés en « dur ». On pourrait les passer en paramètre. Il faut pour cela utiliser le module argparse.
olivier@bornem:~ $ python hgweb-opts.wsgi -h
usage: hgweb-opts.wsgi [-h] host port
positional arguments:
host Add IP address
port Add port number
optional arguments:
-h, --help show this help message and exit
olivier@bornem:~ $
On peut voir que deux paramètres sont obligatoires, l'ordre à une importance.
- host, par exemple 127.0.0.1
- port, par exemple 8500
olivier@bornem:~ $ python hgweb-opts.wsgi 127.0.0.1 8500
serving on http://127.0.0.1:8500
On peut maintenant adapter le fichier wsgi-hg.service
, pour pouvoir passer ces paramètres à la ligne ExecStart.
Voici la ligne à copier.
[...]
ExecStart=/usr/bin/python2.7 /srv/www/htdocs/vhosts/hg/hgweb-opts.wsgi 127.0.0.1 8500
[...]
Pour lancer le service, on place ce fichier dans /etc/systemd/system/default.target.wants/
(ou /lib/systemd/system/
).
root@bornem:~ # systemctl start wsgi-hg.service
root@bornem:~ # systemctl status wsgi-hg.service
wsgi-hg.service - Starts WSGI script (mercurial)
Loaded: loaded (/lib/systemd/system/wsgi-hg.service; disabled)
Active: active (running) since Sun, 29 Jan 2012 21:26:45 +0100; 38s ago
Process: 17745 ExecStartPre=/bin/echo Starting WSGI script for mercurial (code=exited, status=0/SUCCESS)
Main PID: 17747 (python2.7)
CGroup: name=systemd:/system/wsgi-hg.service
└ 17747 /usr/bin/python2.7 /srv/www/htdocs/vhosts/hg/hgweb...
root@bornem:~ #