Go ist eine Open-Source-Mehrzweck-Programmiersprache. Sie wurde von der Produktivität von Python inspiriert, während sie gleichzeitig die Leistungsfähigkeit von C bietet. Sie wurde ursprünglich von Google entwickelt, um Probleme zu lösen, mit denen sie in ihrer Codebasis konfrontiert waren (Codekomplexität und lange Kompilierungszeiten). Wie jede andere moderne Programmiersprache eignet sich Go für alle möglichen Zwecke. Beispielsweise kann sie für die Webentwicklung, Befehlszeilen-Scripting, Netzwerk-Server-Anwendungen, Front-End-Entwicklung usw. verwendet werden.
In dieser Anleitung werden wir Sie durch die Schritte zur Bereitstellung einer einfachen Go-Webanwendung auf Ubuntu 22.04 LTS führen. Wir werden auch einen Nginx-Reverse-Proxy implementieren, um die Datenverkehrslast zu bewältigen.
Voraussetzungen
Um die in dieser Anleitung gezeigten Schritte auszuführen, müssen die folgenden Komponenten vorkonfiguriert sein:
- Ein ordnungsgemäß konfigurierter Ubuntu Erfahren Sie mehr über die Einrichtung Ihres eigenen Ubuntu-Servers auf CloudSigma.
- Go-Programmierumgebung mit den erforderlichen Umgebungsvariablen ( $GOROOT und $GOPATH). Lesen Sie die Anleitung zur Konfiguration der Go-Programmierumgebung unter Ubuntu.
- Nginx für den Reverse-Proxy. Diese Anleitung beschreibt ausführlich die Installation und Konfiguration von Nginx unter Ubuntu.
- Ein geeigneter Texteditor für die Arbeit mit dem Go-Code, zum Beispiel Atom, Sublime Text, Brackets, VS Code, Vim, etc. Für diese Anleitung ist VS Code der Texteditor unserer Wahl.
Wenn der Dienst über einen Domainnamen erreichbar sein soll, müssen Sie einen FQDN haben, der auf den Server zeigt. In diesem Fall wird empfohlen, Nginx mit SSL abzusichern. Mehr über die Absicherung von Nginx mit Let’s Encrypt unter Ubuntu erfahren Sie in unserem Tutorial.
Schritt 1 – Erstellen einer Go-Web-App
Wir werden eine einfache Go-Web-App erstellen, die beim Aufrufen der Domain “Hello World” auf dem Bildschirm ausgibt. Darüber hinaus begrüßt die App den Benutzer, wenn er auf <domain>/greet/<username>.
Beginnen Sie mit der Erstellung eines neuen Projekts unter $GOPATH. Erstellen Sie das Projektverzeichnis:
|
1 |
mkdir -pv $GOPATH/go-web |

Wechseln Sie in das aktuelle Verzeichnis:
|
1 |
cd $GOPATH/go-web |

Initiieren Sie dann ein Projekt:
|
1 |
go mod init <package_name> |

Erstellen Sie als Nächstes main.go das als Stammverzeichnis unserer Go-Anwendung dient. Es wird den Quellcode für unsere Web-App enthalten:
|
1 |
touch main.go |
Öffnen Sie das Projekt in VS Code:
|
1 |
code . |
Fügen Sie den folgenden Code in die Datei main.go:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") }) http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) { name:= r.URL.Path[len("/greet/"):] fmt.Fprintf(w, "Hello %s\n", name) }) http.ListenAndServe(":9990", nil) } |

Lassen Sie uns das soeben erstellte Go-Programm kurz analysieren:
- Der Begriff package main dient als Einstiegspunkt für unsere Anwendung. Er weist den Go-Compiler außerdem an, die Datei als ausführbare Datei anstelle einer gemeinsam genutzten Bibliothek zu kompilieren.
- Die import -Anweisung importiert alle zusätzlichen Module, die für das Funktionieren des Programms erforderlich sind. Hier haben wir die Pakete fmt (zum Drucken von Texten) und net/http (für Webserver-Anwendungen) importiert.
- Mit der Funktion
http.HandleFunc, haben wir zwei Routen eingerichtet:
- Die erste Route / dient als übergeordnete Route innerhalb von func main.
- Die zweite Route
/greet/ akzeptiert einen URL-Parameter (in diesem Fall eine Zeichenkette). Die Zeichenkette wird dann zusammen mit der Begrüßungsnachricht angezeigt.
- URL Pfad wird verwendet, um den Wert nach zu speichern/greet/. Der Wert wird dann als übergebenname des URL-Parameters.
- Die http.ListenAndServe-Funktion initiiert den Webserver. Hier lauscht er auf Port 9990.
Da unser Programm nun bereit ist, kompilieren Sie die Datei in eine ausführbare Datei:
|
1 |
go build main.go |
Der Go-Compiler erstellt eine ausführbare Datei mit demselben Namen wie die Datei. Sehen Sie sich die Ausgabe an:
|
1 |
ls -lh |
Schritt 2 – Konfigurieren einer systemd-Unit-Datei für die Ausführung im Hintergrund
Wenn sich der aktuelle Benutzer bisher vom System abmeldet, wird die Go-Web-App nicht mehr ausgeführt. Das ist ein schlechtes Design für einen Webserver. Um dieses Problem zu lösen, erstellen wir eine systemd-Unit-Datei, damit sie im Hintergrund weiterläuft, selbst wenn sich der Benutzer vom Server abmeldet. Dies bringt die Konfiguration einen Schritt näher an eine produktionsreife Bereitstellung.
Erstellen Sie eine dedizierte systemd-Datei goweb.service unter /lib/systemd/system:
|
1 |
sudo nano /lib/systemd/system/goweb.service |
Fügen Sie das folgende Snippet in die Unit-Datei ein:
|
1 2 3 4 5 6 7 8 9 10 11 |
[Unit] Description=goweb [Service] Type=simple Restart=always RestartSec=5s ExecStart=/home/<username>/go/go-web/main [Install] WantedBy=multi-user.target |

Hier,
- Die Variable ExecStart gibt den Einstiegspunkt für den Dienst über die ausführbare Hauptdatei in unserem Projektverzeichnis an ( $GOPATH/go-web). Beachten Sie, dass wir anstelle von $GOPATH den vollständigen Pfad zur ausführbaren Datei eingegeben haben. Das liegt daran, dass die Variable $GOPATH nur für den Benutzer sichtbar ist.
- Die Variable Restart teilt systemd mit, was zu tun ist, falls das Programm nicht mehr läuft. Der Wert always teilt systemd mit, das Programm jedes Mal neu zu starten, wenn es die Ausführung beendet.
- Die Variable RestartSec teilt systemd mit, eine bestimmte Zeitspanne zu warten, bevor versucht wird, das Programm neu zu starten. Hier ist der Wert auf 5s (5 Sekunden) festgelegt.
- Die Anweisung WantedBy=multi-user.target gibt an, in welchem Zustand systemd den Dienst aktivieren wird.
Speichern Sie die Datei und schließen Sie den Editor. Starten Sie den Dienst:
|
1 |
sudo service goweb start |

Überprüfen Sie, ob der Dienst aktiv ist und läuft:
|
1 |
sudo service goweb status |

Wie die Ausgabe andeutet, ist die Anwendung aktiv und läuft. Wir sind nun bereit, Nginx als Reverse-Proxy zu verwenden.
Schritt 3 – Konfigurieren von Nginx als Reverse-Proxy
Nun erstellen wir einen Server-Block für Nginx, damit dieser als Reverse-Proxy fungiert. Die Web-App wird über den Reverse-Proxy im Internet freigegeben (für zusätzliche Leistung und Sicherheit).
Wechseln Sie das aktuelle aktive Verzeichnis zu sites-available:
|
1 |
cd /etc/nginx/sites-available |

Erstellen Sie nun eine Datei mit dem Domainnamen, unter dem Sie Ihre Anwendung freigeben möchten. Zur Demonstration verwenden wir example.com:
|
1 |
sudo nano example.com |
Geben Sie den folgenden Code in die Block-Datei ein:
|
1 2 3 4 5 6 |
server { server_name example.com www.example.com; location / { proxy_pass http: //localhost:9990; } } |

Hier verwenden wir proxy_pass, um die Go-Web-App auf der IP-Adresse des Servers (localhost) auf Port bereitzustellen9990.
Um den Nginx-Block zu aktivieren, erstellen Sie einen Symlink (auch bekannt als Softlink) der Datei im Ordner sites-enabled:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |

Laden Sie die Nginx-Konfiguration neu, damit die Änderungen wirksam werden:
|
1 |
sudo nginx -s reload |
Schritt 4 – Überprüfung
Wenn alles wie erwartet verlaufen ist, sollte die Webanwendung nun erreichbar sein unter localhost:9990 und der von uns konfigurierten Domain. Öffnen Sie die URL in einem Webbrowser:
|
1 |
localhost:9990 |

Wie erwartet gibt die Anwendung “Hello World” auf dem Bildschirm aus. Dies ist die Aufgabe der primären Route. Testen Sie als Nächstes die zweite Route, indem Sie die folgende URL aufrufen:
|
1 |
localhost:9990/greet/<name> |

Die Anwendung gibt erfolgreich die einfache Begrüßungsnachricht mit dem Namen aus dem über die URL empfangenen Parameter zurück.
Voila! Wir haben erfolgreich eine Go-Webanwendung auf unserem lokalen Server bereitgestellt!
Schlussgedanken
In dieser Anleitung haben wir die Bereitstellung einer einfachen Go-Webanwendung mithilfe von Go-Standardbibliotheken demonstriert. Wir haben auch einen Reverse-Proxy mit Nginx bereitgestellt. Obwohl die Demonstration auf einem lokalen Server durchgeführt wurde, wird für einen öffentlichen Server dringend empfohlen, ein SSL-Zertifikat zu implementieren für eine sichere Freigabe im Internet. Für weitere Go-Programmierung können Sie sich unser Tutorial zu Erstellen und Installieren von Go-Programmen.
Viel Spaß beim Computing!


Kommentare
Noch keine Kommentare. Schreiben Sie den ersten.