www.RiffZone.net
code.RiffZone.net
login.RiffZone.net
Retour au Sommaire

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: CMD: apt-get install golang :CMD 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: CODE: package main .... func main() { .... mux := http.NewServeMux() mux.Handle("/", http.HandlerFunc(HandleHit)) log.Printf("Listening on port 80") log.Fatal(http.ListenAndServe(":80", mux)) } :CODE (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': CMD: cd /home/gotracker go build gotracker.go :CMD 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: CMD: apt-get install supervisor :CMD Editons maintenant le fichier de configuration '/etc/supervisor/supervisord.conf' de manière à refléter le contenu suivant: CODE: [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 :CODE Puis on relance Supervisor pour prendre en compte ces modifications: CMD: service supervisor restart :CMD 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: CMD: addgroup --system supervisor adduser gotracker (spécifiez un mot de passe) adduser gotracker supervisor :CMD On ajoute alors au répertoire '/etc/supervisor/conf.d' un fichier de configuration destiné à notre tracker: CODE: [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 :CODE (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: CMD: apt-get install libcap2-bin :CMD La commande d'autorisation en question est: CMD: setcap 'cap_net_bind_service=+ep' /home/gotracker/gotracker :CMD Demandons à Supervisor de charger sa nouvelle configuration: CMD: supervisorctl reload :CMD Puis vérifions que notre tracker a bien été lancé: CMD: supervisorctl status gotracker :CMD 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 : CMD: supervisorctl stop gotracker :CMD - /home/gotracker/start.sh : CMD: setcap 'cap_net_bind_service=+ep' /home/gotracker/gotracker supervisorctl start gotracker :CMD (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 : CMD: supervisorctl status gotracker :CMD 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.