Programmes pouvez écouter sur le port 80 et de servir les requêtes HTTP directement. Au lieu de cela, vous souhaiterez peut-être utiliser un reverse proxy en face de votre programme de Go, de sorte qu'il écoute sur le port 80 et et se connecte à votre programme sur le port, disons, 4000. Il y a beaucoup de raison pour faire la dernière: ne pas avoir à exécuter votre programme en tant que root, de servir d'autres sites web ou des services sur le même hôte, la terminaison SSL, l'équilibrage de charge, connexion, etc.
J'utilise HAProxy en face. Tout proxy inverse pourrait fonctionner. Nginx est également une excellente option (beaucoup plus populaire que HAProxy et capable de faire plus).
HAProxy est très facile à configurer si vous lisez sa documentation (version HTML). Toute ma haproxy.cfg
le fichier pour l'un de mes Go projets suit, dans le cas où vous avez besoin d'un pont 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.
Concernant le service de contrôle, je lance mon programme en tant que service système. Je pense que tout le monde fait ça. Mon serveur fonctionne Ubuntu, donc il utilise Upstart. J'ai mis cela à l' /etc/init/myapp.conf
pour les Ambitieux en contrôle de 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 de déploiement. Une option consiste à déployer par simple envoi d'un fichier binaire du programme et les éléments nécessaires. C'est une excellente solution de l'OMI. J'utilise l'autre option: la compilation sur le serveur. (Je vais passer pour le déploiement des fichiers binaires lorsque j'ai mis en place un soi-disant "d'Intégration Continue/Déploiement" du système.)
J'ai un petit script shell sur le serveur qui récupère le code de mon projet à distance à partir d'un dépôt Git, construit avec Go, copie les fichiers binaires et d'autres actifs d' ~/myapp/
, et redémarre le service.
Dans l'ensemble, la chose n'est pas très différent de tout autre serveur d'installation: vous devez disposer d'un moyen d'exécuter votre code et de le servir de requêtes HTTP. Dans la pratique, l'Aller s'est avéré pour être très stable pour ce genre de choses.