Un service web en Go, monitoré par Supervisor
Pour des besoins particuliers, tel qu'un serveur de tracking, une architecture Apache/PHP/MySQL peut vite atteindre ses limites. Un serveur plus simple en Go peut suffire, retourner un pixel en enregistrant toutes les requêtes ne demande pas une sophistication extraordinaire.
Nous partirons d'un serveur Debian nu, notamment sans Apache ou équivalent.
Commençons par installer Go:
apt-get install golang
Nous allons héberger notre système de tracking sous '/home/gotracker', créons donc le répertoire nécessaire qui contiendra d'abord le code source du serveur:
package main

....

func main() {

....

    mux := http.NewServeMux()
    mux.Handle("/", http.HandlerFunc(HandleHit))
    log.Printf("Listening on port 80")
    log.Fatal(http.ListenAndServe(":80", mux))
}
(le code complet importe peu dans le cadre de cet article)
Pour générer l'exécutable correspondant, il suffira d'exécuter les commandes suivantes que l'on place dès maintenant dans un script '/home/gotracker/build.sh':
cd /home/gotracker
go build gotracker.go
Notre serveur est maintenant terminé, nous pouvons le lancer depuis la ligne de commande, 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
Editons maintenant le fichier de configuration '/etc/supervisor/supervisord.conf' de manière à refléter le contenu suivant:
[unix_http_server]
file=/var/run/supervisor.sock
chmod=0770                       # ensure our group has read/write privs
chown=root:supervisor            # add our group

[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
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 'gotracker', lequel sera utilisé pour exécuter le serveur:
addgroup --system supervisor
adduser gotracker (spécifiez un mot de passe)
adduser gotracker supervisor
On ajoute alors au répertoire '/etc/supervisor/conf.d' un fichier de configuration destiné à notre tracker:
[program:gotracker]
command=/home/gotracker/gotracker
autostart=true
autorestart=true
startretries=10
user=gotracker
directory=/home/gotracker
environment=APP_SETTINGS="/home/gotracker/gotracker.toml"
redirect_stderr=true
stdout_logfile=/var/log/supervisor/gotracker.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
(créez un fichier vide '/home/gotracker/gotracker.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' /home/gotracker/gotracker
Demandons à Supervisor de charger sa nouvelle configuration:
supervisorctl reload
Puis vérifions que notre tracker a bien été lancé:
supervisorctl status gotracker
Notre tracker est maintenant opérationnel, nous allons pour terminer mettre en place trois scripts pour stopper, lancer ou vérifier son état:
- /home/gotracker/stop.sh :
supervisorctl stop gotracker
- /home/gotracker/start.sh :
setcap 'cap_net_bind_service=+ep' /home/gotracker/gotracker
supervisorctl start gotracker
(nous réautorisons le tracker à écouter sur le port 80 pour le cas où il aurait été mis à jour entre temps)
- /home/gotracker/status.sh :
supervisorctl status gotracker
Notre système est maintenant complet. Il peut servir de base à tout autre serveur cousu main (en Node.js par exemple) et pour lequel on aurait besoin d'un mécanisme de lancement et supervision similaire.