I programmi Go possono ascoltare sulla porta 80 e servire direttamente le richieste HTTP. Invece, potresti voler utilizzare un proxy inverso di fronte al tuo programma Go, in modo che sia in ascolto sulla porta 80 e si connetta al tuo programma sulla porta, ad esempio 4000. Ci sono molte ragioni per farlo: non dover eseguire il tuo programma Go come root, che serve altri siti/servizi sullo stesso host, terminazione SSL, bilanciamento del carico, registrazione, ecc.
Io uso HAProxy di fronte. Qualsiasi proxy inverso potrebbe funzionare. Nginx è anche un'ottima opzione (molto più popolare di HAProxy e capace di fare di più).
HAProxy è molto facile da configurare se si legge il suo documentation (HTML version). Il mio intero file haproxy.cfg
per uno dei miei progetti Go segue, nel caso in cui sia necessario un pont 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 tutti lo facciano. Il mio server esegue Ubuntu, quindi usa Upstart. Ho messo questo a /etc/init/myapp.conf
per 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 è quella di distribuire semplicemente inviando il file binario del programma e le risorse necessarie. Questa è una soluzione piuttosto grande IMO. Io uso l'altra opzione: compilazione sul server. (Passerò alla distribuzione con file binari quando creerò un cosiddetto sistema "Integrazione/Distribuzione continua")
Ho un piccolo script di shell sul server che estrae il codice per il mio progetto da un Git remoto repository, lo crea con Go, copia i file binari e altre risorse su ~/myapp/
e riavvia il servizio.
Nel complesso, il tutto non è molto diverso da qualsiasi altra configurazione del server: è necessario disporre di un modo per eseguire il codice e farlo servire richieste HTTP. In pratica, Go ha dimostrato di essere molto stabile per questa roba.
"il server non si riavvierà automaticamente se la macchina è stata riavviata (senza script di configurazione aggiuntivi)." Non penso che questo possa essere fatto. Idealmente avresti creato script init/systemd/upstart per il servizio. Questo è il modo consigliato per controllare qualsiasi demone unix. – Intermernet
Proprio come te. Immagino di volerlo dire in contrasto con un server come Apache, che imposta automaticamente queste funzionalità al momento dell'installazione. – Chaseph