Os programas Go podem ouvir na porta 80 e atender a solicitações HTTP diretamente. Em vez disso, você pode querer usar um proxy reverso na frente do seu programa Go, para que ele escute na porta 80 e se conecte ao seu programa na porta, digamos, 4000. Há muitos motivos para fazer o último: não ter que executar seu programa Go como root, servindo outros sites / serviços no mesmo host, terminação SSL, balanceamento de carga, registro, etc.
Eu uso o HAProxy na frente. Qualquer proxy reverso pode funcionar. Nginx também é uma ótima opção (muito mais popular do que o HAProxy e capaz de fazer mais).
O HAProxy é muito fácil de configurar se você ler sua documentação ( versão HTML ). haproxy.cfg
Segue-se todo o meu arquivo de um dos meus projetos Go, caso você precise de um ponto 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 é ainda mais fácil.
Com relação ao controle de serviço, executo meu programa Go como um serviço do sistema. Acho que todo mundo faz isso. Meu servidor executa o Ubuntu, então ele usa o Upstart. Eu coloquei isso no /etc/init/myapp.conf
Upstart para controlar meu 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
Outro aspecto é a implantação. Uma opção é implantar apenas enviando o arquivo binário do programa e os ativos necessários. Esta é uma ótima solução IMO. Eu uso a outra opção: compilar no servidor. (Vou mudar para a implantação com arquivos binários quando configurar um sistema denominado “Integração / Implantação Contínua”.)
Eu tenho um pequeno script de shell no servidor que extrai o código do meu projeto de um repositório Git remoto, o constrói com Go, copia os binários e outros ativos ~/myapp/
e reinicia o serviço.
No geral, a coisa toda não é muito diferente de qualquer outra configuração de servidor: você precisa ter uma maneira de executar seu código e fazer com que ele atenda a solicitações HTTP. Na prática, Go provou ser muito estável para essas coisas.