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.
global
log 127.0.0.1 local0
maxconn 10000
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
retries 3
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http
bind :80
acl is_stats hdr(host) -i hastats.myapp.com
use_backend stats if is_stats
default_backend myapp
capture request header Host len 20
capture request header Referer len 50
backend myapp
server main 127.0.0.1:4000
backend stats
mode http
stats enable
stats scope http
stats scope myapp
stats realm Haproxy\ Statistics
stats uri /
stats auth username:password
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:
start on runlevel [2345]
stop on runlevel [!2345]
chdir /home/myapp/myapp
setgid myapp
setuid myapp
exec ./myapp start 1>>_logs/stdout.log 2>>_logs/stderr.log
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.