Para aquellos de ustedes que ejecutan Go backends en producción:
¿Cuál es su pila / configuración para ejecutar una aplicación web Go?
No he visto mucho sobre este tema además de personas que usan el paquete net / http de la biblioteca estándar para mantener un servidor en funcionamiento. Leí usando Nginx para pasar solicitudes a un servidor de Go - nginx con Go
Esto me parece un poco frágil. Por ejemplo, el servidor no se reiniciaría automáticamente si se reiniciara la máquina (sin scripts de configuración adicionales).
¿Existe una configuración de producción más sólida?
Un aparte sobre mi intención: estoy planeando un servidor backend REST con tecnología Go para mi próximo proyecto y quiero asegurarme de que Go será viable para lanzar el proyecto en vivo antes de invertir demasiado en él.
fuente
Respuestas:
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.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: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.
fuente
nginx para:
nginx hace que esto sea muy fácil, y aunque puede servir directamente desde Go gracias a
net/http
, hay muchas "reinventar la rueda" y cosas como los encabezados HTTP globales implican un texto repetitivo que probablemente pueda evitar.supervisor para administrar mi binario Go. Upstart de Ubuntu (como lo menciona Mostafa) también es bueno, pero me gusta supervisord ya que es relativamente independiente de la distribución y está bien documentado.
Supervisor, para mí:
fuente
Para aquellos que quieren una aplicación simple que se ejecute como un demonio, use systemd (compatible con muchas distribuciones de Linux) en lugar de Upstart.
Cree un archivo de servicio en
Entrar
Luego habilite e inicie el servicio
systemd tiene un sistema de registro por diario independiente que le permitirá realizar registros finales para facilitar la resolución de problemas.
fuente
Puede vincular su binario a un socket a puertos privilegiados de dominio de Internet (números de puerto inferiores a 1024) usando
setcap
setcap 'cap_net_bind_service=+ep' /path/to/binary
sudo
según sea necesariosetcap
setcap
documentacióncap_net_bind_service
documentaciónfuente