Programy Go mogą nasłuchiwać na porcie 80 i bezpośrednio obsługiwać żądania HTTP. Zamiast tego możesz chcieć użyć odwrotnego proxy przed swoim programem Go, aby nasłuchiwał na porcie 80 i łączył się z twoim programem na porcie, powiedzmy, 4000. Jest wiele powodów, dla których warto to zrobić: nie trzeba uruchamiać Twój program Go jako root, obsługujący inne witryny / usługi na tym samym hoście, zakończenie SSL, równoważenie obciążenia, logowanie itp.
Używam HAProxy z przodu. Każdy zwrotny serwer proxy może działać. Nginx to również świetna opcja (znacznie bardziej popularna niż HAProxy i zdolna do więcej).
HAProxy jest bardzo łatwy w konfiguracji, jeśli przeczytasz jego dokumentację ( wersja HTML ). Mój cały haproxy.cfg
plik dla jednego z moich projektów Go, na wypadek gdybyś potrzebował ponta początkowego.
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 jest jeszcze łatwiejszy.
Jeśli chodzi o kontrolę usług, program Go uruchamiam jako usługę systemową. Myślę, że każdy to robi. Na moim serwerze działa Ubuntu, więc używa Upstart. Umieściłem to na /etc/init/myapp.conf
Upstart, aby kontrolować mój program:
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
Kolejnym aspektem jest wdrożenie. Jedną z opcji jest wdrożenie poprzez wysłanie pliku binarnego programu i niezbędnych zasobów. To całkiem świetne rozwiązanie IMO. Ja korzystam z drugiej opcji: kompilacja na serwerze. (Przełączę się na wdrażanie z plikami binarnymi, gdy skonfiguruję tak zwany system „ciągłej integracji / wdrażania”).
Mam mały skrypt powłoki na serwerze, który pobiera kod dla mojego projektu ze zdalnego repozytorium Git, buduje go za pomocą Go, kopiuje pliki binarne i inne zasoby do ~/myapp/
oraz ponownie uruchamia usługę.
Ogólnie rzecz biorąc, całość nie różni się zbytnio od jakiejkolwiek innej konfiguracji serwera: musisz mieć sposób na uruchomienie kodu i obsługę żądań HTTP. W praktyce Go okazał się bardzo stabilny w tym zakresie.