Für diejenigen unter Ihnen, die Go-Backends in der Produktion ausführen:
Was ist Ihr Stack / Ihre Konfiguration zum Ausführen einer Go-Webanwendung?
Ich habe zu diesem Thema nicht viel gesehen, außer Leuten, die das Net / http-Paket der Standardbibliothek verwenden, um einen Server am Laufen zu halten. Ich habe mit Nginx gelesen, um Anfragen an einen Go-Server zu übergeben - Nginx mit Go
Das scheint mir ein wenig zerbrechlich zu sein. Beispielsweise würde der Server nicht automatisch neu gestartet, wenn der Computer neu gestartet würde (ohne zusätzliche Konfigurationsskripte).
Gibt es ein solideres Produktionssetup?
Abgesehen von meiner Absicht - ich plane einen Go-basierten REST-Backend-Server für mein nächstes Projekt und möchte sicherstellen, dass Go für den Live-Start des Projekts geeignet ist, bevor ich zu viel in ihn investiere.
quelle
Antworten:
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.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: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.
quelle
Nginx für:
nginx macht dies sehr einfach, und obwohl Sie dank Go direkt von Go aus bedienen können
net/http
, gibt es eine Menge "Neuerfindung des Rads" und Dinge wie globale HTTP-Header beinhalten einige Boilerplates, die Sie wahrscheinlich vermeiden können.Supervisor für die Verwaltung meiner Go-Binärdatei. Ubuntus Upstart (wie von Mostafa erwähnt) ist ebenfalls gut, aber ich mag Supervisord, da es relativ distro-agnostisch und gut dokumentiert ist.
Supervisord, für mich:
quelle
Für diejenigen, die eine einfache Go-App als Daemon ausführen möchten, verwenden Sie systemd (unterstützt von vielen Linux-Distributionen) anstelle von Upstart.
Erstellen Sie eine Servicedatei unter
Eingeben
Aktivieren und starten Sie dann den Dienst
systemd verfügt über ein separates Journaling-System, mit dem Sie Protokolle zur einfachen Fehlerbehebung erstellen können.
quelle
Sie können Ihre Binärdatei an einen Socket an privilegierte Ports mit Internetdomäne (Portnummern unter 1024) binden
setcap
setcap 'cap_net_bind_service=+ep' /path/to/binary
sudo
wie nötigsetcap
setcap
Dokumentationcap_net_bind_service
Dokumentationquelle