Pour ceux d'entre vous exécutant des backends Go en production:
Quelle est votre pile / configuration pour exécuter une application Web Go?
Je n'ai pas vu grand-chose sur ce sujet à part les gens qui utilisent le package net / http de la bibliothèque standard pour maintenir un serveur en marche. J'ai lu en utilisant Nginx pour transmettre des demandes à un serveur Go - Nginx avec Go
Cela me semble un peu fragile. Par exemple, le serveur ne redémarrerait pas automatiquement si la machine était redémarrée (sans scripts de configuration supplémentaires).
Existe-t-il une configuration de production plus solide?
Un aparté sur mon intention - je prévois un serveur backend REST alimenté par Go pour mon prochain projet et je veux m'assurer que Go sera viable pour le lancement du projet en direct avant que j'investisse trop dans celui-ci.
la source
Réponses:
Les programmes Go peuvent écouter sur le port 80 et servir directement les requêtes HTTP. Au lieu de cela, vous voudrez peut-être utiliser un proxy inverse devant votre programme Go, afin qu'il écoute sur le port 80 et se connecte à votre programme sur le port, par exemple 4000. Il y a de nombreuses raisons pour faire ce dernier: ne pas avoir à exécuter votre programme Go en tant que root, servant d'autres sites Web / services sur le même hôte, terminaison SSL, équilibrage de charge, journalisation, etc.
J'utilise HAProxy en façade. Tout proxy inverse pourrait fonctionner. Nginx est également une excellente option (beaucoup plus populaire que HAProxy et capable d'en faire plus).
HAProxy est très simple à configurer si vous lisez sa documentation ( version HTML ). Mon
haproxy.cfg
dossier complet pour l'un de mes projets Go suit, au cas où vous auriez besoin d'un point de départ.Nginx est encore plus facile.
En ce qui concerne le contrôle des services, j'exécute mon programme Go en tant que service système. Je pense que tout le monde fait ça. Mon serveur exécute Ubuntu, il utilise donc Upstart. J'ai mis ceci à
/etc/init/myapp.conf
pour Upstart pour contrôler mon programme:Un autre aspect est le déploiement. Une option consiste à déployer en envoyant simplement le fichier binaire du programme et des ressources nécessaires. C'est une très bonne solution IMO. J'utilise l'autre option: la compilation sur serveur. (Je passerai au déploiement avec des fichiers binaires lorsque je configurerai un système dit d '«intégration / déploiement continu».)
J'ai un petit script shell sur le serveur qui extrait le code de mon projet à partir d'un référentiel Git distant, le construit avec Go, copie les binaires et autres actifs
~/myapp/
et redémarre le service.Dans l'ensemble, le tout n'est pas très différent de toute autre configuration de serveur: vous devez avoir un moyen d'exécuter votre code et de le faire servir des requêtes HTTP. En pratique, Go s'est avéré très stable pour ce genre de choses.
la source
nginx pour:
nginx rend cela très facile, et bien que vous puissiez servir directement à partir de Go grâce à
net/http
, il y a beaucoup de "réinventer la roue" et des choses comme les en-têtes HTTP globaux impliquent un passe-partout que vous pouvez probablement éviter.superviseur pour gérer mon binaire Go. Upstart d'Ubuntu (comme mentionné par Mostafa) est également bon, mais j'aime superviser car il est relativement indépendant de la distribution et est bien documenté.
Supervisord, pour moi:
la source
Pour ceux qui veulent une application go simple exécutée en tant que démon, utilisez systemd (pris en charge par de nombreuses distributions Linux) au lieu de Upstart.
Créez un fichier de service sur
Entrer
Puis activez et démarrez le service
systemd a un système de journalisation séparé qui vous permettra de suivre les journaux pour faciliter le dépannage.
la source
Vous pouvez lier votre binaire à une socket aux ports privilégiés du domaine Internet (numéros de port inférieurs à 1024) en utilisant
setcap
setcap 'cap_net_bind_service=+ep' /path/to/binary
sudo
le cas échéantsetcap
setcap
Documentationcap_net_bind_service
Documentationla source