Teil 2.2 – Installieren von Nginx und Konfigurieren als Reverseproxyserver
Gilt für: .NET Core 2.1, .NET Core 3.1, .NET 5
In diesem Artikel wird erläutert, wie Sie Nginx installieren und als Reverseproxyserver konfigurieren.
Voraussetzungen
Um den Übungen in diesem Teil zu folgen, müssen Sie eine ASP.NET Core Webanwendung erstellt und im Ordner "/var" bereitgestellt haben.
Ziel dieses Teils
Im vorherigen Teil haben Sie eine ASP.NET Core Webanwendung mithilfe des .NET CLI-Tools erstellt, und die Anwendung wird im Ordner "/var" bereitgestellt. Die Anwendung wurde auch für das Überwachen von Port 5000 auf HTTP-Anforderungen konfiguriert, und die HTTPS-Umleitung wurde entfernt.
An diesem Punkt sollten die Clients die Portnummer angeben, wenn Sie eine Verbindung mit der Anwendung herstellen (z. B. http://localhost:5000 ). Dies ist jedoch nicht das gewünschte Verhalten.
Unsere Ziele in diesem Teil sind:
- Clients sollten in der Lage sein, zu navigieren, ohne eine Portnummer angeben zu müssen. Clients sollten z. B. eine Verbindung mithilfe von
http://localhostherstellen. - Die Webanwendung sollte automatisch gestartet werden, wenn sie aus irgendeinem Grund oder nach dem Neustart des Computers beendet wird.
Im nächsten Abschnitt verwenden Sie Nginx als Proxyserver, um die HTTP-Anforderungen weiterzuleiten, die stattdessen an portieren 80 an unsere .NET-Anwendung gesendet werden. Außerdem konfigurieren Sie Ihre Anwendung so, dass sie automatisch gestartet wird.
Was ist Nginx?
Nginx ist ein beliebter, einfacher und schneller Webserver. Es kann sowohl unter Linux als auch unter Windows ausgeführt werden und kann als Reverseproxyserver konfiguriert werden.
Was ist ein Daemon?
Nginx wird als Daemonausgeführt. Ein Daemon ist ein alternativer Begriff für einen Dienst, der im Hintergrund ausgeführt wird. Genau wie die Dienste, die auf Windows ausgeführt werden, können Daemons so konfiguriert werden, dass sie während des Starts automatisch gestartet werden. Sie konfigurieren Ihre ASP.NET Core-Anwendung so, dass sie als Daemon ausgeführt wird.
Installieren von Nginx mithilfe von APT
Die Installation von Nginx ist einfach. Führen Sie den sudo apt install nginx Befehl aus, um das Programm auf dem virtuellen Ubuntu-Computer zu installieren.
Führen Sie nach Abschluss der Installation die Ausführung aus, whereis nginx um zu ermitteln, wo das Programm installiert ist. Sie können sehen, wo sich die Nginx-Konfigurationsdateien befinden, indem Sie die Ausgabe überprüfen. Der folgende Screenshot zeigt, dass sich die Konfigurationsdateien im Ordner "/etc/nginx" befinden.
Hinweis
Wenn Sie eine andere Distribution als Ubuntu oder Ubuntu ausführen, finden Sie den entsprechenden Installationsbefehl des Paket-Managers oder Anweisungen in der offiziellen Nginx-Installationsdokumentation.
Verwalten von Diensten mithilfe von systemctl
Wenn Sie nicht sehen, dass Nginx ausgeführt wird, können Sie es explizit durch Ausführen sudo systemctl start nginx starten. Obwohl in dieser Übung die systemctl Befehle für Nginx veranschaulicht werden, werden diese Befehle verwendet, um die Webanwendung so zu konfigurieren, dass sie automatisch als Daemon gestartet wird.
Nach Abschluss der Installation ist Nginx bereits so konfiguriert, dass es automatisch gestartet wird. Nginx wird als Daemon ausgeführt. Sie können den Status des Daemon mithilfe von systemctlüberprüfen.
Der systemctl Befehl wird verwendet, um "Dienste" für Aufgaben wie das Anzeigen des Status des Diensts oder das Starten und Beenden des Diensts zu verwalten. Einige verfügbare Parameter sind "Start", "Beenden", "Neu starten", "Aktivieren", "Deaktivieren" und "Status". Um den Status von Nginx zu überprüfen, führen Sie systemctl status nginx .
Dieser Befehl generiert einige nützliche Informationen. Wie dieser Screenshot zeigt, befindet sich Nginx im active (running) Status, und die Prozess-ID der Nginx-Instanz lautet 8539. Beachten Sie auch die enabled vendor preset: enabled Und-Anweisungen. Enabled bedeutet, dass dieser Daemon beim Neustart des Computers gestartet wird und vendor preset: enabled bedeutet, dass Nginx bei der Installation standardmäßig aktiviert ist. Daher wird Nginx automatisch gestartet, wenn der Server gestartet wird.
Testen der Nginx-Installation
Standardmäßig überwacht Nginx port 80. Da es ausgeführt wird, sollten Sie in der Lage sein, auf die Hauptseite von Nginx zuzugreifen, wenn Sie localhost durchsuchen. Wird curl zum Testen von Nginx durch Ausführen von curl localhost . Der gelb hervorgehobene Text im folgenden Screenshot zeigt die Nginx-Standardwebseite. Daher wird Nginx ausgeführt:
Systemctl-Befehlsoptionen
Dienste oder Daemons können mithilfe des Befehls verwaltet systemctl werden. Für das Starten, Beenden oder Vornehmen von Änderungen ist ein Überbenutzerzugriff erforderlich. Daher müssen Sie sudo diesen Befehlen das Präfix hinzufügen.
Daemons neu starten
Möglicherweise müssen Sie die Daemons von Zeit zu Zeit neu starten. Um einen Daemon neu zu starten, führen Sie sudo systemctl restart <daemon_name> . Um Nginx neu zu starten, führen Sie sudo systemctl restart nginx . Stellen Sie sicher, dass Sie den Status von Nginx vor und nach dem Ausführen dieses Befehls überprüfen, um Änderungen an der Prozess-ID zu überwachen.
Beenden von Daemons
Um einen Daemon zu beenden, führen Sie sudo systemctl stop <daemon_name> . Führen Sie zum Beenden von Nginx sudo systemctl stop nginx den Status von Nginx aus, und überprüfen Sie dann den Status von Nginx, indem Sie systemctl status nginx es erneut ausführen. Dieses Mal wird der Dienst als inaktiv (inaktiv) angezeigt, aber dennoch aktiviert. Dies bedeutet, dass der Dienst zwar nicht ausgeführt wird, aber automatisch gestartet wird, nachdem der Server neu gestartet wurde.
Hinweis
Der systemctl status Befehl zeigt auch mehrere Zeilen der vorherigen Protokolleinträge für den Daemon an.
Nachdem Sie Nginx beendet haben, führen Sie curl localhost es erneut aus.
Hinweis
Die Verbindung wird abgelehnt, da auf eingehenden Datenverkehr an Port 80 nichts überwacht wird.
Deaktivieren von Daemons
Das Deaktivieren eines Daemon unterscheidet sich vom Beenden eines Daemons. Ein deaktivierter Daemon kann ausgeführt werden, wird aber nach dem Neustart des Servers nicht automatisch gestartet. Führen Sie zum Deaktivieren des Nginx-Daemon sudo systemctl disable nginx den Status von Nginx aus, und überprüfen Sie dann den Status von Nginx.
Dieser Screenshot zeigt, dass Nginx nicht ausgeführt wird und deaktiviert ist. Dies bedeutet, dass Nginx nach einem Neustart nicht automatisch gestartet wird.
Startdaemons
Um einen Daemon zu starten, führen Sie sudo systemctl start <daemon_name> . Führen Sie zum Starten von Nginx den Dienst sudo systemctl start nginx aus, und überprüfen Sie dann den Status des Diensts erneut.
Dieser Screenshot zeigt, dass Nginx gestartet, aber weiterhin deaktiviert ist. Obwohl der Dienst ausgeführt wird, wird Nginx nach einem Neustart nicht automatisch gestartet, da es sich um einen deaktivierten Dienst handelt.
Aktivieren von Daemons
Das Aktivieren eines Diensts bedeutet, dass er nach einem Neustart automatisch gestartet wird. Führen Sie zum Aktivieren von Nginx sudo systemctl enable nginx den Status von Nginx aus, und überprüfen Sie den Status von Nginx erneut.
Dieser Screenshot zeigt, dass Nginx ausgeführt wird und nach dem Neustart des Servers gestartet wird.
Konfigurieren von Nginx als Reverseproxy, um die Anforderungen an Ihre ASP.NET Core Anwendung weiterzuleiten
Nachdem Sie nun gelernt haben, wie Sie den Nginx-Dienst starten, beenden und neu starten, konfigurieren Sie Nginx als Reverseproxy, um die Anforderungen, die an Port 80 gestellt werden, an Ihre ASP.NET Core Anwendung weiterzuleiten, die auf Port 5000 lauscht.
Hier sehen Sie die erforderliche Konfiguration. Einige der wichtigsten Teile sind hervorgehoben.
server {
listen 80;
server_name _;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Diese Konfiguration gibt Folgendes an:
- Nginx überwacht port 80 für alle Anforderungen (Direktive:
listen 80). - Nginx leitet die Anforderungen an
http://localhost:5000(Direktive:proxy_pass http://localhost:5000)
Hinweis
Die server_name _ Zeile im Code. Dies wird als Catch-All-Direktive verwendet. Weitere Informationen zu server_name finden Sie in der offiziellen Dokumentation.
Die Konfigurationsänderungen erscheinen unkompliziert. Wir verwenden diesen Code, um den server Direktivenabschnitt in der Konfigurationsdatei zu ersetzen. Aber wo befindet sich die Konfigurationsdatei?
Suchen der richtigen Nginx-Konfigurationsdatei
Die primäre Nginx-Konfigurationsdatei ist /etc/nginx/nginx.conf . Um die Konfiguration zu überprüfen, verwenden Sie den cat /etc/nginx/nginx.conf Befehl, und suchen Sie nach der Serverdirektive.
Scrollen Sie durch die Konfiguration, um die Serverdirektive zu finden. Sie sollten davon ausgehen, dass sie nicht gefunden wird. Wir können die gewünschten Konfigurationsänderungen an einer beliebigen Stelle in der Konfigurationsdatei platzieren. Im Idealfall möchten Sie die ursprüngliche Konfigurationsdatei jedoch nicht ersetzen. Dadurch wird verhindert, dass Konfigurationsfehler auftreten, die möglicherweise verhindern, dass der Server ordnungsgemäß gestartet wird. Der server Abschnitt befindet sich nicht in der Hauptkonfigurationsdatei. Wenn Sie weiterhin einen Bildlauf durch die Konfigurationsdatei durchführen, werden Sie feststellen, dass es einige include Direktiven gibt.
Schließen Sie Direktiven ein, um die Verwaltung der Konfiguration zu vereinfachen, indem Sie sie in Blöcke aufteilen, die in der Hauptkonfigurationsdatei enthalten sein sollen. Die Hauptkonfigurationsdatei kann einfach gehalten werden, und einige bestimmte Konfigurationsteile können in andere Dateien verschoben werden. Die hervorgehobenen Zeilen in diesem Screenshot geben Folgendes an:
- Nginx lädt die Konfiguration aus jeder CONF-Datei, die sich im Verzeichnis /etc/nginx/conf.d befindet.
- Nginx lädt die Konfigurationen aus jeder Datei, die sich im Verzeichnis "/etc/nginx/sites-enabled" befindet.
Wenn Sie diese Verzeichnisse überprüfen, finden Sie keine Konfigurationsdateien in /etc/nginx/conf.d. Es gibt jedoch eine Datei in /etc/nginx/sites-enabled.
Die Standardkonfigurationsdatei sieht wie ein kandidat für die Konfiguration aus, nach der gesucht wird. Wenn Sie die Datei "/etc/nginx/sites-enabled/default" cat /etc/nginx/sites-enabled/default verwenden, würden Sie sehen, dass die Standardserverdirektive im folgenden Code enthalten ist.
Daher muss die Datei /etc/nginx/sites-enabled/default bearbeitet werden, um die Konfiguration zu ändern.
Bearbeiten der Konfigurationsdatei mithilfe von vi
Sie haben erfahren, wie Sie Dateien bearbeiten, wenn Sie die Datei "Startup.cs" bearbeitet haben, um die HTTPS-Umleitung aus der ASP.NET Pipeline zu entfernen. Nun verwenden Sie vi erneut, um die nginx-Konfigurationsdatei zu ändern.
Tipp
Sichern Sie immer die Dateien, die Sie ändern. Wenn nach der Bearbeitung ein Fehler aufgetreten ist, können Sie diese Kopie verwenden, um den vorherigen Status der Datei wiederherzustellen. Führen Sie in diesem Fall die Ausführung aus, cp /etc/nginx/sites-enabled/default ~/nginx-default-backup um die Konfigurationsdatei in Ihr Startverzeichnis zu kopieren. Der Name der Sicherungsdatei lautet nginx-default-backup . Beachten Sie, dass die Sicherung nicht im selben Verzeichnis wie die Originaldatei vorgenommen wurde. Dies liegt daran, dass Nginx alle Konfigurationsdateien aus diesem Verzeichnis lädt und Sie die Konfiguration nicht unterbrechen möchten, indem Sie zwei verschiedene Versionen der Serverdirektive laden.
Führen Sie die Ausführung sudo vi /etc/nginx/sites-enabled/default aus, um die Konfigurationsdatei zu bearbeiten und die Serverdirektive zu ersetzen, wie im folgenden Screenshot dargestellt.
Hier sind einige Tipps und Tricks zum Bearbeiten von Dateien mithilfe von vi:
- Mithilfe der Pfeiltasten können Sie einen Bildlauf nach oben und unten durchführen.
- Um in den Bearbeitungsmodus zu wechseln, drücken Sie die Einfüge- oder I-Taste. Während Sie sich im Bearbeitungsmodus befinden, wird in der unteren linken Ecke eine --INSERT-Nachricht angezeigt.
- Im Bearbeitungsmodus können Sie die Tastatur verwenden, um Zeichen nacheinander zu löschen.
- Im Bearbeitungsmodus funktionieren Kopier- und Einfügevorgänge mit den meisten Terminalen zusammen. Sie können also den Inhalt aus diesem Artikel kopieren und in vi einfügen.
- Drücken Sie esc, um den Bearbeitungsmodus zu beenden.
- Sie können Zeilen im normalen Modus einfacher löschen. Wechseln Sie im normalen Modus zum Anfang einer Zeile, die Sie löschen möchten, und geben Sie "dd" ein. Der
ddBefehl löscht die gesamte Zeile. Sie können auch 5dd eingeben, um fünf Zeilen gleichzeitig zu löschen. Diese Option sollte jedoch mit Vorsicht verwendet werden, um zu vermeiden, dass zusätzliche Inhalte gelöscht werden. - How to Delete Lines in Vim /Vi article is a good one To learn how to delete multiple lines in vi.
- Um vi zu beenden und die Änderungen zu speichern, geben Sie :wq! ein, und drücken Sie dann die EINGABETASTE. Hier bedeutet der Doppelpunkt (
:), dass Sie einen Befehl ausführen,wbedeutet, dass Sie die Änderungen schreiben,qbeenden und die Änderungen außer Kraft!setzen. - Um zu beenden, ohne die Änderungen zu speichern, geben Sie :q! ein, und drücken Sie dann die EINGABETASTE.
Die Änderungen werden jetzt gespeichert, und Sie müssen den Nginx-Dienst neu starten, damit diese Änderungen wirksam werden. Bevor Sie den Dienst neu starten, können Sie den sudo nginx -t Befehl ausführen, um die Konfigurationsdatei zu testen. Wenn dieser Befehl ausgeführt wird, überprüft Nginx die Syntax der Konfigurationsdatei und versucht dann, die Dateien zu öffnen, auf die in der Konfigurationsdatei verwiesen wird.
Wie Sie hier sehen können, scheint die geänderte Konfigurationsdatei korrekt zu sein.
Wir müssen Nginx neu starten, damit die Änderungen wirksam werden:
sudo systemctl restart nginx
Nach dem Neustart sehen Sie eine Antwort von der ASP.NET Core Anwendung, wenn Sie eine Anforderung an h stellen, ttp://localhost da Nginx als Reverseproxy für die Anforderungen funktionieren sollte, die an Port 80 gesendet werden.
Starten Sie den Nginx-Dienst neu, damit die Änderungen wirksam werden, und senden Sie dann eine Anforderung an localhost, indem Sie curl localhost ausführen. Dieser Befehl schlägt jedoch fehl. Der nächste Schritt besteht darin, sie auszuführen und dann nach wget localhost Hinweisen zur Ursache des Problems zu suchen.
Problembehandlung des Nginx-Proxyproblems
Im vorherigen Screenshot werden die folgenden Informationen angezeigt:
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 502 Bad Gateway
2020-12-27 21:15:53 ERROR 502: Bad Gateway.
Die erste und zweite Zeile weisen darauf hin, dass Sie localhost auflösen und eine Verbindung mit dem Socket herstellen 127.0.0.1:80 können. Daher sollte Nginx ausgeführt werden. Um dies zu überprüfen, können Sie den systemctl status nginx Befehl ausführen.
Die dritte Zeile gibt die Ursache des Problems an. Sie erhalten eine HTTP 502-Fehlermeldung "Ungültiges Gateway". Http 502 Bad Gateway ist mit Proxys verknüpft. Dies bedeutet, dass der Reverseproxy keine Verbindung mit der Back-End-Anwendung herstellen konnte. In diesem Fall ist es Ihre ASP.NET Core Webanwendung, die auf Port 5000 für die Anforderungen ausgeführt und überwacht werden soll. Wir sollten überprüfen, ob die Webanwendung auch ausgeführt wird.
Führen Sie denselben Befehl wie zuvor aus, um mit der Problembehandlung zu netstat beginnen. Verwenden Sie dieses Mal den Fettp, um den Port 5000 Ihrer Anwendung zu filtern. Führen Sie dann netstat -tlp | grep 5000 .
Diese Beispielausgabe gibt an, dass an Port 5000 nichts überwacht wird. Daher ist dies die Ursache für die HTTP 502-Antwort, die von Nginx stammt, da sie einen Prozess finden kann, der an Port 5000 lauscht.
Die Lösung besteht darin, ihre ASP.NET Core Anwendung zu starten. Bevor Sie jedoch fortfahren, können Sie einen anderen Ansatz zur Problembehandlung überprüfen. Nicht jedes Problem lässt sich so einfach beheben, wie nur ein paar Zeilen Protokollinhalt zu betrachten und die Ursache zu finden. Manchmal müssen Sie sich mit anderen System- und Anwendungsprotokollen befassen.
Da Sie beim Einrichten ASP.NET Core Anwendungen in Linux eng mit Nginx zusammenarbeiten, empfehlen wir Ihnen, zu erfahren, welche Art von Protokollen Nginx und das Betriebssystem für die Problembehandlung bereitstellt.
Überprüfen der Nginx-Protokolle
Wenn Sie erneut ausführen cat /etc/nginx/nginx.conf und dann nach dem logging settings suchen, sollten Sie Folgendes bemerken.
Dies zeigt, dass Nginx über zwei Arten von Protokollen verfügt: Zugriffsprotokolle und Fehlerprotokolle. Diese werden im Verzeichnis /var/log/nginx/ gespeichert.
Zugriffsprotokolle ähneln IIS-Protokolldateien. Eine schnelle Überprüfung des Inhalts zeigt, dass sie dem folgenden Screenshot ähneln.
In Zugriffsprotokollen werden außer dem HTTP 502-Antwortstatus, den Sie bereits erkannt haben, keine neuen Informationen angezeigt. Sie können die Fehlerprotokolle auch überprüfen, indem Sie cat /var/log/nginx/error.log . Diese zeigen viel mehr über die Ursache des Problems.
Die Hinweise sind eindeutig: Nginx kann die Anforderung vom Client abrufen, kann jedoch keine Verbindung mit dem upstream Server am und mit der ASP.NET Core Anwendung http://127.0.0.1:5000 herstellen, die auf diesem Port ausgeführt und überwacht werden sollte.
Problemumgehung
Um dieses Problem zu umgehen, starten Sie Ihre ASP.NET Core-Anwendung manuell. Verbinden mithilfe einer zweiten Terminalsitzung zum Server, und führen Sie dann die ASP.NET Core Anwendung wie zuvor aus.
Während die ASP.NET Core Anwendung ausgeführt wird, wechseln Sie zur anderen Terminalsitzung, und führen Sie denselben curl localhost Befehl aus. Jetzt können Sie auf Ihre ASP.NET Core Anwendung zugreifen, die hinter Nginx ausgeführt wird. Der folgende Screenshot zeigt, dass Sie eine Anforderung an localhost gestellt haben, dass die Anforderung von Nginx verarbeitet und an die Back-End-Anwendung weitergeleitet wurde und Sie eine Antwort von Ihrer ASP.NET Core-Anwendung erhalten haben.
Sie haben Nginx jetzt so konfiguriert, dass es sich als Reverseproxy für Ihre unter Linux ausgeführte ASP.NET Core anwendung verhält.
Was ist das Ergebnis, wenn die ASP.NET Core Anwendung nach einem Neustart nicht gestartet wird? Was geschieht, wenn die Webanwendung abstürzt und erst gestartet wird, wenn Sie feststellen, dass sie nicht ausgeführt wird? Sollten Sie Ihre ASP.NET Core Anwendung nach jedem Neustart des Prozessendes starten?
Nächste Schritte
Teil 2.3 : Konfigurieren der ASP.NET Core-Anwendung für den automatischen Start
Informationen zum Haftungsausschluss von Drittanbietern
Die in diesem Artikel genannten Drittanbieterprodukte stammen von Herstellern, die von Microsoft unabhängig sind. Microsoft gewährt keine implizite oder sonstige Garantie in Bezug auf die Leistung oder Zuverlässigkeit dieser Produkte.