Teil 2.3 – Konfigurieren der ASP.NET Core Anwendung so, dass sie automatisch gestartet wird
Gilt für: .NET Core 2.1, .NET Core 3.1, .NET 5
In diesem Artikel wird erläutert, wie Sie die ASP.NET Core Anwendung konfigurieren, um sicherzustellen, dass die Anwendung nach dem Neustart des Servers automatisch gestartet wird.
Voraussetzungen
Um den Übungen in diesem Teil folgen zu können, muss eine ASP.NET Core-Webanwendung unter Linux installiert und bereitgestellt sein.
Sie müssen den Nginx-Webserver auch als Reverseproxy konfigurieren, um die Anforderungen von Port 80 an die Back-End-ASP.NET Core Anwendung weiterzuleiten.
Ziel dieses Teils
In den vorherigen Teilen dieser Reihe wurde gezeigt, wie Sie Nginx als Reverseproxy konfigurieren und einen HTTP 502-Proxyfehler beheben. Die Ursache für den HTTP 502-Antwortcode ist, dass die Back-End-ASP.NET Core Anwendung nicht ausgeführt wurde, als Nginx versuchte, Datenverkehr an sie weiterzuleiten.
Das Problem wurde vorübergehend behoben, indem Ihre ASP.NET Core Anwendung manuell ausgeführt wurde. Aber was geschieht, wenn die Anwendung abstürzt? Oder muss der Server neu gestartet werden? Ein manuelles Neustarten der ASP.NET Core Anwendung ist keine praktische Lösung. Daher konfigurieren Sie in diesem Abschnitt Linux so, dass Ihre Anwendung nach dem Absturz gestartet wird.
Bisher haben Sie Nginx und ASP.NET Core für die Zusammenarbeit konfiguriert. Nginx überwacht Port 80 und leitet Anforderungen an die ASP.NET Core Anwendung weiter, die port 5000 überwacht. Obwohl Nginx automatisch gestartet wird, muss die ASP.NET Core Anwendung bei jedem Neustart des Servers manuell gestartet werden. Andernfalls wird die ASP.NET Core Anwendung ordnungsgemäß beendet oder stürzt ab.
Wenn Sie die ASP.NET Core ausführen, indem Sie IIS als Proxy verwenden, übernimmt das IIS ASP.NET Core Module (ANCM) die Prozessverwaltung, und der ASP.NET Core Prozess wird automatisch gestartet. Eine weitere Option besteht darin, die ASP.NET Core als Dienst in Windows auszuführen, damit das AutoStart-Feature konfiguriert werden kann, sobald der Computer gestartet wird.
Erstellen einer Dienstdatei für Ihre ASP.NET Core-Anwendung
Denken Sie daran, dass der systemctl Befehl verwendet wird, um die "Dienste" oder "Daemons" zu verwalten. Ein Daemon ist ein ähnliches Konzept wie ein Windows-Dienst. Ein solcher Dienst kann automatisch neu gestartet werden, wenn das System gestartet wird.
Was ist eine Dienstdatei?
Unter Linux gibt es auch Komponentenkonfigurationsdateien mit einer ".service"-Erweiterung, die verwendet wird, um das Verhalten von Daemons zu steuern, wenn der Prozess beendet wird. Diese dateien werden auch als Dienstdateien, Einheitendateien und Diensteinheitsdateien bezeichnet.
Diese Dienstdateien befinden sich in einem der folgenden Verzeichnisse:
- /usr/lib/systemd/: Speichert Dienstdateien für heruntergeladene Anwendungen
- /etc/systemd/system/: Speichert Dienstdateien, die von Systemadministratoren erstellt werden
Überprüfen Sie die Nginx-Dienstdatei. Es wird über einen Paket-Manager installiert. Die Konfigurationsdatei sollte sich im Ordner "/usr/lib/systemd/system/" befinden. Beim Ausführen des systemctl status nginx Befehls wird auch der Speicherort der Dienstdatei angezeigt.
So sieht die Nginx-Dienstdatei aus.
Beispieldienstdatei für ASP.NET Core-Anwendungen
Der folgende Beispieldateiinhalt der Einheit stammt von Host ASP.NET Core unter Linux mit Nginx:
[Unit]
Description=Example .NET Web API App running on Ubuntu
[Service]
WorkingDirectory=/var/www/helloapp
ExecStart=/usr/bin/dotnet /var/www/helloapp/helloapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
Hier sind einige wichtige Aspekte dieses Inhalts:
WorkingDirectoryist das Verzeichnis, in dem Sie Ihre Anwendung veröffentlichen.ExecStartist der eigentliche Befehl, mit dem die Anwendung gestartet wird.Restart=alwaysist selbsterklärend. Dieser Prozess wird immer gestartet, wenn er aus irgendeinem Grund beendet wird, ob manuell oder aufgrund eines Absturzes.RestartSec=10ist auch selbsterklärend. Nachdem der Prozess beendet wurde, wird er gestartet, nachdem 10 Sekunden vergangen sind.SyslogIdentifierist wichtig. Dies bedeutet "Systemprotokollbezeichner". Informationen zum Daemon werden unter diesem Namen in den Systemprotokollen protokolliert. Sie können diesen Bezeichner auch verwenden, um die PID Ihres Prozesses zu finden.Userist der Benutzer, der den Dienst verwaltet. Sie sollte im System vorhanden sein und über den entsprechenden Besitz der Anwendungsdateien verfügen.- Sie können eine beliebige Anzahl von Umgebungsvariablen in der Dienstdatei festlegen.
Hinweis
Der www-data Benutzer ist ein spezieller Benutzer im System. Sie können dieses Konto nutzen. Sie erstellen einen neuen Benutzer zum Üben von Benutzerberechtigungen in Linux. Es ist jedoch in Ordnung, www-data wenn Sie keinen anderen Linux-Benutzer erstellen möchten.
Erstellen einer Dienstdatei für die ASP.NET Core-Anwendung
Sie werden vi die Dienstdatei erstellen und bearbeiten. Ihre Dienstdatei wird in den Ordner "/etc/systemd/system/" verschoben. Denken Sie daran, dass Sie in dieser Reihe Ihre erste Anwendung im Ordner "/var/firstwebapp/" veröffentlicht haben. Daher sollte WorkingDirectory auf diesen Ordner verweisen.
Hier ist die endgültige Konfigurationsdatei:
[Unit]
Description=My very first ASP.NET Core applications running on Ubuntu
[Service]
WorkingDirectory=/var/firstwebapp/
ExecStart=/usr/bin/dotnet /var/firstwebapp/AspNetCoreDemo.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=myfirstapp-identifier
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
Führen Sie sudo vi /etc/systemd/system/myfirstwebapp.service aus, fügen Sie die endgültige Konfiguration ein, und speichern Sie die Datei.
Dadurch wird die erforderliche Konfiguration abgeschlossen, damit die ASP.NET Core Webanwendung als Daemon ausgeführt wird.
Da die Webanwendung jetzt als Dienst konfiguriert ist, können Sie ihren Status überprüfen, indem Sie ausführen systemctl status myfirstwebapp.service. Wie Sie im folgenden Screenshot sehen können, ist die Anwendung deaktiviert (wird nach einem Systemneustart nicht automatisch gestartet), und sie wird derzeit nicht ausgeführt.
Um den Dienst zu starten, führen Sie den sudo systemctl start myfirstwebapp.service Befehl aus, und überprüfen Sie dann den Status erneut. Dieses Mal sollte der Dienst ausgeführt werden, und daneben sollte eine Prozess-ID aufgelistet werden. Die Befehlsausgabe zeigt auch die letzten Zeilen aus den Systemprotokollen für den neu erstellten Dienst und zeigt, dass der Dienst lauscht http://localhost:5000.
Sollte die Webanwendung unerwartet beendet werden, wird sie nach 10 Sekunden automatisch erneut gestartet.
Es gibt einen letzten Schritt: Der Dienst wird ausgeführt, aber nicht aktiviert. "Aktiviert" bedeutet, dass es automatisch gestartet wird, nachdem der Server gestartet wurde. Dies ist die gewünschte endgültige Konfiguration. Führen Sie den folgenden Befehl aus, um sicherzustellen, dass der Dienst aktiviert ist:
Sudo systemctl enable myfirstwebapp.service
Dies ist ein Meilenstein für Ihre ASP.NET Core Anwendung, da Sie sie so konfiguriert haben, dass sie nach einem Serverneustart oder einer Beendigung des Prozesses automatisch gestartet wird.
Testen, ob ASP.NET Core Anwendung automatisch neu gestartet wird
Bevor Sie mit dem nächsten Teil beginnen, stellen Sie sicher, dass alles wie erwartet funktioniert. Die aktuelle Konfiguration lautet wie folgt:
- Nginx wird automatisch ausgeführt und überwacht Anforderungen, die an Port 80 gesendet werden.
- Nginx ist als Reverseproxy konfiguriert und leitet Anforderungen an die ASP.NET Core Anwendung weiter. Die Anwendung lauscht auf Port 5000.
- Die ASP.NET Core Anwendung ist so konfiguriert, dass sie automatisch gestartet wird, nachdem der Server neu gestartet wurde oder wenn der Prozess beendet oder abstürzt.
Wenn der ASP.NET Core Dienst beendet wird, sollte er daher in 10 Sekunden neu gestartet werden. Um dieses Verhalten zu testen, erzwingen Sie, dass der Prozess beendet wird. Sie können davon ausgehen, dass es in 10 Sekunden wieder startet.
Hinweis
Die aktuelle Prozess-ID der ASP.NET Core Anwendung. Die Prozess-ID für den hier gezeigten Versuch war 5084 , bevor der Prozess beendet wurde. Führen Sie den Befehl aus, um die Prozess-ID für Ihre ASP.net Core-Anwendung zu systemctl status myfirstwebapp.service finden.
Führen Sie den folgenden Befehl aus, um das Beenden des Prozesses zu erzwingen:
sudo kill -9 <PID>
Hinweis
9 hier ist der Signaltyp. Nach dem man Signalbefehl ist 9 SIGKILL (Kill-Signal). Sie können die Hilfeseiten öffnen, indem Sie den man Befehl für "Kill and Signal" verwenden, um mehr über dieses Thema zu erfahren.
Führen Sie den systemctl status myfirstwebapp.service Befehl unmittelbar nach dem kill Befehl aus, warten Sie etwa 10 Sekunden, und führen Sie dann denselben Befehl erneut aus.
In diesem Screenshot sehen Sie die folgenden Informationen:
- Bevor es getötet wurde, hatte der ASP.NET Core Prozess eine Prozess-ID von 5084.
- Der Dienststatus weist darauf hin, dass der Prozess, der PID 5084 verwendet, beendet wurde und erneut aktiviert wird, da der automatische Neustart konfiguriert ist.
- Einige Sekunden später wurde ein neuer Prozess (PID 5181) gestartet.
Wenn Sie versuchen, mithilfe curl localhostvon "Auf die Website" zuzugreifen, sollten Sie sehen, dass die ASP.NET Core Anwendung weiterhin reagiert.