I programmi Go possono ascoltare sulla porta 80 e servire direttamente le richieste HTTP. Invece, potresti voler usare un proxy inverso davanti al tuo programma Go, in modo che sia in ascolto sulla porta 80 e si connetta al tuo programma sulla porta, diciamo, 4000. Ci sono molte ragioni per fare quest'ultimo: non dover eseguire il tuo programma Go come root, che serve altri siti web / servizi sullo stesso host, terminazione SSL, bilanciamento del carico, registrazione, ecc.
Uso HAProxy davanti. Qualsiasi proxy inverso potrebbe funzionare. Nginx è anche un'ottima opzione (molto più popolare di HAProxy e in grado di fare di più).
HAProxy è molto facile da configurare se leggi la sua documentazione ( versione HTML ). haproxy.cfg
Segue il mio intero file per uno dei miei progetti Go, nel caso abbiate bisogno di un punto di partenza.
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 è ancora più semplice.
Per quanto riguarda il controllo del servizio, eseguo il mio programma Go come servizio di sistema. Penso che lo facciano tutti. Il mio server esegue Ubuntu, quindi utilizza Upstart. L'ho inserito in /etc/init/myapp.conf
Upstart per controllare il mio programma:
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 altro aspetto è la distribuzione. Un'opzione è distribuire inviando semplicemente il file binario del programma e le risorse necessarie. Questa è un'ottima soluzione IMO. Uso l'altra opzione: compilare sul server. (Passerò alla distribuzione con file binari quando imposterò un cosiddetto sistema di "integrazione / distribuzione continua".)
Ho un piccolo script di shell sul server che estrae il codice per il mio progetto da un repository Git remoto, lo compila con Go, copia i file binari e altre risorse ~/myapp/
e riavvia il servizio.
Nel complesso, l'intera cosa non è molto diversa da qualsiasi altra configurazione del server: devi avere un modo per eseguire il tuo codice e farlo servire alle richieste HTTP. In pratica, Go si è dimostrato molto stabile per queste cose.