Go-Programme können Port 80 abhören und HTTP-Anforderungen direkt bedienen. Stattdessen möchten Sie möglicherweise einen Reverse-Proxy vor Ihrem Go-Programm verwenden, damit dieser Port 80 überwacht und über Port 4000 eine Verbindung zu Ihrem Programm herstellt. Es gibt viele Gründe, letzteres zu tun: Sie müssen nicht ausgeführt werden Ihr Go-Programm als Root, das andere Websites / Dienste auf demselben Host bereitstellt, SSL-Beendigung, Lastausgleich, Protokollierung usw.
Ich benutze HAProxy vorne. Jeder Reverse-Proxy könnte funktionieren. Nginx ist auch eine großartige Option (viel beliebter als HAProxy und in der Lage, mehr zu tun).
HAProxy ist sehr einfach zu konfigurieren, wenn Sie die Dokumentation ( HTML-Version ) lesen . Meine gesamte haproxy.cfg
Datei für eines meiner Go-Projekte folgt, falls Sie einen Startpunkt benötigen.
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 ist noch einfacher.
In Bezug auf die Dienststeuerung führe ich mein Go-Programm als Systemdienst aus. Ich denke, jeder macht das. Auf meinem Server wird Ubuntu ausgeführt, daher wird Upstart verwendet. Ich habe dies /etc/init/myapp.conf
für Upstart festgelegt, um mein Programm zu steuern:
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
Ein weiterer Aspekt ist die Bereitstellung. Eine Option ist die Bereitstellung, indem nur eine Binärdatei des Programms und der erforderlichen Assets gesendet wird. Dies ist eine ziemlich gute Lösung IMO. Ich benutze die andere Option: Kompilieren auf dem Server. (Ich werde auf die Bereitstellung mit Binärdateien umsteigen, wenn ich ein sogenanntes "Continuous Integration / Deployment" -System einrichte.)
Ich habe ein kleines Shell-Skript auf dem Server, das Code für mein Projekt aus einem entfernten Git-Repository abruft, ihn mit Go erstellt, die Binärdateien und andere Assets kopiert ~/myapp/
und den Dienst neu startet.
Insgesamt unterscheidet sich das Ganze nicht wesentlich von anderen Server-Setups: Sie müssen eine Möglichkeit haben, Ihren Code auszuführen und HTTP-Anforderungen bedienen zu lassen. In der Praxis hat sich Go für dieses Zeug als sehr stabil erwiesen.