Bereitstellen einer Go-Webanwendung mit Nginx unter Ubuntu 18.04

_Der Autor hat das Programm Tech Education Fund ausgewählt, um eine Spende im Rahmen des Programms Write for DOnations zu erhalten. _

Einführung

Go ist eine universelle Programmiersprache, die sich allmählich zu einer der beliebtesten Web-Back-End-Programmiersprachen entwickelt. Durch die Konzentration auf Einfachheit haben die Entwickler von Go eine Sprache entwickelt, die sowohl einfach zu erlernen als auch schneller als viele andere Sprachen für Webanwendungen ist. Dabei wurden effiziente Funktionen wie die Fähigkeit genutzt, aufgrund der gleichzeitigen Verwendung mehrere Anforderungen gleichzeitig zu bearbeiten. Aus diesem Grund ist die Bereitstellung einer Webanwendung in Go für viele Back-End-Entwickler hilfreich.

Nginx ist einer der beliebtesten Webserver der Welt, da die Ressourcennutzung gering und die Auslastung zuverlässig ist. Viele der größten und am häufigsten frequentierten Websites im Internet sind auf Nginx angewiesen, um ihre Inhalte bereitzustellen. Bei der Bereitstellung wird Nginx häufig als Load Balancer oder Reverse Proxy verwendet, um die Sicherheit zu erhöhen und die Anwendung robuster zu machen. In Verbindung mit einem Go-Web-Backend kann Nginx eine leistungsstarke und schnelle Webanwendung bereitstellen.

In diesem Tutorial erstellen Sie eine "+ Hello World +" - Webanwendung in Go und stellen sie auf einem Ubuntu 18.04-Server unter Verwendung von Nginx als Reverse-Proxy bereit.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie Folgendes:

Um eine produktive Bereitstellung Ihrer Go-Webanwendung zu erreichen, ist es außerdem wichtig, dass Sie Ihren Server durch die Installation eines TLS / SSL-Zertifikats schützen. Dieser Schritt wird dringend empfohlen. Folgen Sie zum Sichern Ihrer Go-Webanwendung How To Secure Nginx mit Let’s Encrypt unter Ubuntu 18.04 nach * Schritt 3 * dieses Tutorials, um das kostenlose TLS / SSL-Zertifikat zu erhalten.

Schritt 1 - Erstellen der Go-Webanwendung

In diesem Schritt erstellen Sie eine Beispiel-Go-Webanwendung, die "+ Hello World" bei "+" anzeigt und den Benutzer bei " / greet / +" begrüßt. Wenn Sie mehr über die Grundlagen der Programmierung in Go erfahren möchten, lesen Sie unsere How To Schreiben Sie Ihr erstes Programm in Go Artikel.

Erstellen Sie zunächst ein neues Verzeichnis in Ihrem https://www.digitalocean.com/community/tutorials/understanding-the-gopath [+ GOPATH +] -Verzeichnis, in dem sich die Quelldatei befindet. Sie können den Ordner beliebig benennen, in diesem Tutorial wird jedoch "++" verwendet:

mkdir $GOPATH/

Befolgen Sie die im vorausgesetzten Lernprogramm vorgeschlagene Dateistruktur https://www.digitalocean.com/community/tutorials/how-to-install-go-and-set-up-a-local-programming-environment-on-ubuntu-18 -04 [So installieren Sie Go und richten eine lokale Programmierumgebung unter Ubuntu 18.04 ein]. Dadurch erhält Ihr Verzeichnis den Pfad "+ ~ / go / go-web +".

Führen Sie als Nächstes Folgendes aus, um das Verzeichnis in Ihren neu erstellten Ordner in Ihrem + GOPATH + zu ändern:

cd $GOPATH/go-web

Verwenden Sie "+ nano " oder Ihren bevorzugten Texteditor, um eine Datei mit dem Namen " main.go +" zu erstellen, die den Quellcode für Ihre Webanwendung enthält:

nano main.go

Fügen Sie zum Erstellen der Funktionalität der Anwendung "+ Hello World " den folgenden Go-Code in die neu erstellte Datei " main.go +" ein:

~ / go / go-web / main.go

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 nun ab der ersten Zeile durchgehen, was das vorhergehende Code-Snippet tun wird.

Zuerst haben Sie den Einstiegspunkt in Ihre Anwendung geschrieben:

~ / go / go-web / main.go

package main
...

Das + package main + weist den Go-Compiler an, diese Datei nicht als gemeinsam genutzte Bibliothek, sondern als ausführbares Programm zu kompilieren.

Als nächstes haben Sie die + import + -Anweisungen:

~ / go / go-web / main.go

...

import (
   "fmt"
   "net/http"
)
...

Dieses Snippet importiert die erforderlichen Module, damit dieser Code funktioniert. Dazu gehören das Standardpaket "+ fmt " und das Paket " net / http +" für Ihren Webserver.

Das nächste Snippet erstellt Ihre erste Route in der Funktion "+ main +", die der Einstiegspunkt für jede Go-Anwendung ist:

~ / go / go-web / main.go

...
func main () {
   http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
       fmt.Fprintf(w, "Hello World")
   })
 ...
}
...

In "+ func main " wird eine übergeordnete Route " / " erstellt, die auf Anforderung den Text " Hello World +" zurückgibt.

Die zweite Route, wie im folgenden Snippet gezeigt, akzeptiert einen URL-Parameter, in diesem Fall einen Namen, der zusammen mit einer Begrüßung angezeigt wird.

~ / go / go-web / main.go

...
func main () {
 ...
   http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) {
       name := r.URL.Path[len("/greet/"):]
       fmt.Fprintf(w, "Hello %s\n", name)
   })
...
}
...

Hiermit wird mit "+ URL.Path " von Go der Wert direkt nach " / greet / +" gespeichert und als Name aus dem URL-Parameter übergeben.

Zuletzt instanziieren Sie Ihren Server:

~ / go / go-web / main.go

...
func main () {
 ...
 http.ListenAndServe(":9990", nil)
}

Das vorstehende Snippet startet den Server und macht Ihre Anwendung über den Port "+ 9990 " verfügbar, wobei der von Go eingebaute " http +" - Server verwendet wird.

Wenn Sie den Code in "+ main.go +" überprüft haben, speichern Sie die Datei und beenden Sie Ihren Texteditor.

Erstellen Sie als Nächstes die ausführbare Binärdatei Ihrer Anwendung, indem Sie Folgendes ausführen:

go build main.go

Der vorhergehende Befehl kompiliert "+ main.go ", um eine ausführbare Datei mit dem Titel " main +" zu erzeugen.

Sie haben Ihre Beispiel-Go-Webanwendung erstellt. Als Nächstes erstellen Sie eine System-Unit-Datei, damit Ihre Anwendung auch dann im Hintergrund ausgeführt wird, wenn Sie nicht auf Ihren Server zugreifen.

Schritt 2 - Erstellen einer Systemd Unit-Datei

In diesem Schritt erstellen Sie eine systemd -Unit-Datei, damit Ihre Anwendung auch bei einem Benutzer im Hintergrund ausgeführt wird meldet sich vom Server ab. Dies macht Ihre Anwendung dauerhaft und bringt Sie einer produktiven Bereitstellung einen Schritt näher.

Erstellen Sie zunächst eine neue Datei mit dem Namen "+ web.services" im Verzeichnis "+ / lib / systemd / system", indem Sie "+ nano +" oder einen von Ihnen bevorzugten Texteditor verwenden:

sudo nano /lib/systemd/system/goweb.service

Fügen Sie der Datei das folgende Snippet hinzu, um die Parameter des Dienstes festzulegen.

/lib/systemd/system/goweb.service

[Unit]
Description=goweb

[Service]
Type=simple
Restart=always
RestartSec=5s
ExecStart=/home//go/go-web/main

[Install]
WantedBy=multi-user.target

Die Variable + ExecStart = / home // go / go-web / main + gibt an, dass der Einstiegspunkt für diesen Service über die ausführbare Datei + main + liegt, die sich in + / home // go / go-web + befindet Verzeichnis, wobei "+" der Benutzername des Nicht-Root-Sudo-Kontos des Servers ist. ` Neustart = immer ` stellt sicher, dass systemd immer versucht, das Programm neu zu starten, wenn es stoppt. In der nächsten Zeile legt ` RestartSec = 5s ` eine Wartezeit von fünf Sekunden zwischen den Neustartversuchen fest. ` WantedBy = multi-user.target +` gibt an, in welchem ​​Zustand Ihr Server den Dienst aktivieren wird.

Speichern und schließen Sie die Datei.

Nachdem Sie die Service-Unit-Datei geschrieben haben, starten Sie Ihren Go-Webdienst, indem Sie Folgendes ausführen:

sudo service goweb start

Verwenden Sie den folgenden Befehl, um zu überprüfen, ob der Dienst ausgeführt wird:

sudo service goweb status

Sie erhalten folgende Ausgabe:

Output● goweb.service - goweb
  Loaded: loaded (/lib/systemd/system/goweb.service; disabled; vendor preset: enabled)
  Active: active (running) since Wed 2019-07-17 23:28:57 UTC; 6s ago
Main PID: 1891 (main)
   Tasks: 4 (limit: 1152)
  CGroup: /system.slice/goweb.service
          └─1891 /home//go/go-web/main

Weitere Informationen zum Arbeiten mit Systemd-Einheitendateien finden Sie unter Understanding Systemd Units and Unit Files.

Nachdem Sie Ihre Anwendung eingerichtet und ausgeführt haben, können Sie den Nginx-Reverse-Proxy einrichten.

Schritt 3 - Einrichten eines Reverse Proxy mit Nginx

In diesem Schritt erstellen Sie einen Nginx-Serverblock und richten einen Nginx-Reverseproxy ein, um Ihre Anwendung für das Internet verfügbar zu machen.

Ändern Sie zunächst Ihr Arbeitsverzeichnis in das Verzeichnis Nginx + sites-available +:

cd /etc/nginx/sites-available

Erstellen Sie eine neue Datei mit dem Namen der Domäne, für die Sie Ihre Anwendung verfügbar machen möchten. In diesem Tutorial wird "++" verwendet:

sudo nano

Fügen Sie die folgenden Zeilen in die Datei ein, um die Einstellungen für ++ festzulegen:

/ etc / nginx / sites-available / your_domain

server {
   server_name  ;

   location / {
       proxy_pass http://localhost:9990;
   }
}

Dieser Nginx-Serverblock verwendet http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass [+ proxy_pass +], um die Go-Webanwendung auf der IP-Adresse Ihres Servers bereitzustellen, die als + localhost + angegeben ist Laufen Sie auf Port "+ 9990 ". " Servername +" gibt den Ihrer IP-Adresse zugeordneten Domainnamen an, in diesem Fall "" und "".

Erstellen Sie als Nächstes einen Symlink dieser Nginx-Konfiguration im Ordner "+ sites-enabled +", indem Sie den folgenden Befehl ausführen:

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

Ein Symlink ist eine Verknüpfung einer Datei an einem anderen Ort. Die neu erstellte Verknüpfung verweist immer auf die Originaldatei, um sie bei Änderungen an Aktualisierungen anzupassen. Nginx benötigt eine Kopie der Konfiguration in beiden Verzeichnissen.

Laden Sie als Nächstes Ihre Nginx-Konfigurationen neu, indem Sie den Befehl reload ausführen:

sudo nginx -s reload

Um sicherzustellen, dass Ihre Bereitstellung funktioniert, rufen Sie in Ihrem Browser "+ http: // +" auf. Sie werden mit einer * Hello World * -Textzeichenfolge begrüßt.

Sie haben jetzt den Nginx-Reverseproxy so eingerichtet, dass Ihre Anwendung unter Ihrem Domainnamen verfügbar gemacht wird, und Ihre Go-Webanwendung mit SSL / TLS gesichert. Im nächsten Schritt testen Sie Ihre Anwendung über eine sichere Verbindung.

Schritt 4 - Testen der Anwendung

In diesem Schritt testen Sie Ihre Anwendung über eine sichere Verbindung, um sicherzustellen, dass alles funktioniert.

Öffnen Sie Ihren bevorzugten Webbrowser und besuchen Sie "+ https: // +":

Sie erhalten eine einfache "+ Hello World" -Nachricht. Der Empfang dieser Nachricht bei Verwendung von "+ https: // +" in der URL zeigt an, dass Ihre Anwendung über eine sichere Verbindung bereitgestellt wird.

Versuchen Sie als nächstes, die zweite Route zu besuchen: "+ https: /// greet / " und ersetzen Sie "+" durch den Namen, den Ihre App begrüßen soll:

image: https://assets.digitalocean.com/articles/66224/Greet.png [Anzeige der Begrüßungsseite]

Die Anwendung gibt eine einfache Begrüßung zusammen mit "++" zurück, die auf dem an die URL übergebenen Parameter basiert.

Sobald Sie diese Ergebnisse erhalten haben, haben Sie Ihre Go-Webanwendung erfolgreich implementiert.

Fazit

In diesem Lernprogramm haben Sie eine einfache Webanwendung mit Go unter Verwendung der Standardbibliotheken erstellt, einen Reverse-Proxy mit Nginx eingerichtet und ein SSL-Zertifikat für Ihre Domain verwendet, um Ihre App zu schützen. Weitere Informationen zu Go finden Sie unter official documentation. Weitere Informationen zum Programmieren in dieser effizienten Sprache finden Sie auch in unserer Reihe How To Code in Go.