Un service web en NodeJS, monitoré par Supervisor
NodeJS permet de construire des services web plus efficaces pour certains usages; le problème classique étant de faire fonctionner cette application javascript en mode serveur.
Laissons de côté l'installation de NodeJS, vous trouverez tous les éléments sur le site nodejs.org suivant votre distribution.
Prenons l'exemple d'un script app.js logé dans '/home/mynodeapp'. Notre serveur est parfaitement fonctionnel, nous pouvons le lancer depuis la ligne de commande (par 'node app.js'), mais il va s'arrêter dès qu'on fermera notre session; nous voudrions non seulement pouvoir le lancer en tâche de fond, indépendamment d'une session ouverte, mais qu'il puisse se relancer automatiquement en cas de problème grave, de redémarrage de la machine, etc... Supervisor est un outil (écrit en Python) précisément fait pour ça, voyons maintenant comment le mettre en oeuvre pour piloter notre tracker en Go.
On commence par installer Supervisor:
apt-get install supervisor
Pour des raisons de sécurité, on ne veut pas exécuter notre tracker en root, nous allons donc créer un groupe 'supervisor' auquel appartiendra un utilisateur spécifique 'mynodeapp', lequel sera utilisé pour exécuter le serveur:
addgroup --system supervisor
adduser mynodeapp (spécifiez un mot de passe)
adduser mynodeapp supervisor
Editons maintenant le fichier de configuration '/etc/supervisor/supervisord.conf' de manière à refléter le contenu suivant (je n'ai changé que les lignes chmod et chown de la configuration par défaut):
[unix_http_server]
file=/var/run/supervisor.sock
chmod=0770
chown=root:supervisor

[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisor

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[include]
files = /etc/supervisor/conf.d/*.conf
Puis on relance Supervisor pour prendre en compte ces modifications:
service supervisor restart
On ajoute alors au répertoire '/etc/supervisor/conf.d' un fichier de configuration destiné à notre tracker:
[program:mynodeapp]
command=/usr/local/bin/node /home/mynodeapp/mynodeapp.js
autostart=true
autorestart=true
startretries=10
user=mynodeapp
directory=/home/mynodeapp
environment=APP_SETTINGS="/home/mynodeapp/mynodeapp.toml"
redirect_stderr=true
stdout_logfile=/var/log/supervisor/mynodeapp.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
(créez un fichier vide '/home/mynodeapp/mynodeapp.toml', nous n'aurons pas besoin de variables d'environnement ici)
Nous avons encore un détail à régler, un logiciel serveur ne peut écouter sur le port 80 sans qu'on lui accorde d'abord explicitement l'autorisation de le faire, avec l'utilitaire 'setcap'. Au besoin, il faudra l'installer:
apt-get install libcap2-bin
La commande d'autorisation en question est:
setcap 'cap_net_bind_service=+ep' /usr/local/bin/node
Demandons à Supervisor de charger sa nouvelle configuration:
supervisorctl reload
Puis vérifions que notre service a bien été lancé:
supervisorctl status mynodeapp
Notre service est maintenant opérationnel, nous allons pour terminer mettre en place trois scripts pour stopper, lancer ou vérifier son état:
- /home/mynodeapp/stop.sh :
supervisorctl stop mynodeapp
- /home/mynodeapp/start.sh :
supervisorctl start mynodeapp
- /home/mynodeapp/status.sh :
supervisorctl status mynodeapp