Los programas Go pueden escuchar en el puerto 80 y atender solicitudes HTTP directamente. En su lugar, es posible que desee utilizar un proxy inverso delante de su programa Go, de modo que escuche en el puerto 80 y se conecte a su programa en el puerto, digamos 4000. Hay muchas razones para hacer esto último: no tener que ejecutar su programa Go como root, sirviendo otros sitios web / servicios en el mismo host, terminación SSL, equilibrio de carga, registro, etc.
Yo uso HAProxy en frente. Cualquier proxy inverso podría funcionar. Nginx también es una gran opción (mucho más popular que HAProxy y capaz de hacer más).
HAProxy es muy fácil de configurar si lees su documentación ( versión HTML ). A continuación se muestra todo el haproxy.cfg
archivo de uno de mis proyectos de Go, en caso de que necesite un pont inicial.
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 es aún más fácil.
Con respecto al control del servicio, ejecuto mi programa Go como un servicio del sistema. Creo que todo el mundo hace eso. Mi servidor ejecuta Ubuntu, por lo que usa Upstart. He puesto esto en /etc/init/myapp.conf
Upstart para controlar mi programa:
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
Otro aspecto es el despliegue. Una opción es implementar simplemente enviando un archivo binario del programa y los activos necesarios. Esta es una gran solución en mi opinión. Yo uso la otra opción: compilar en el servidor. (Cambiaré a la implementación con archivos binarios cuando configure un sistema llamado "Integración / Implementación continua").
Tengo un pequeño script de shell en el servidor que extrae el código para mi proyecto desde un repositorio Git remoto, lo compila con Go, copia los binarios y otros activos ~/myapp/
y reinicia el servicio.
En general, todo no es muy diferente de cualquier otra configuración de servidor: debe tener una forma de ejecutar su código y hacer que sirva solicitudes HTTP. En la práctica, Go ha demostrado ser muy estable para estas cosas.