共用方式為


第 2.3 部分 - 設定 ASP.NET Core 應用程式以自動啟動

適用於: .NET Core 2.1、.NET Core 3.1、.NET 5

本文介紹如何設定 ASP.NET Core 應用程式,以確保應用程式在伺服器重新啟動後自動啟動。

必要條件

若要遵循此部分中的練習,您必須在Linux中安裝並部署 ASP.NET Core Web 應用程式。

您也必須將 Nginx Web 伺服器設定為反向 Proxy,以從埠 80 將要求路由傳送至後端 ASP.NET Core 應用程式。

此部分的目標

本系列中的上一個部分示範如何將 Nginx 設定為反向 Proxy,以及如何針對 HTTP 502 Proxy 錯誤進行疑難解答。 HTTP 502 回應碼的原因是 Nginx 嘗試將流量轉送至它時,後端 ASP.NET Core 應用程式未執行。

此問題已暫時解決,方法是手動執行您的 ASP.NET Core 應用程式。 但如果應用程式當機,該怎麼辦? 還是必須重新啟動伺服器? 每次手動重新啟動 ASP.NET Core 應用程式並非實際的解決方案。 因此,在本節中,您會將Linux設定為在應用程式當機之後啟動應用程式。

到目前為止,您已將 Nginx 和 ASP.NET Core 設定為共同作業。 Nginx 會接聽埠 80,並將要求路由傳送至接聽埠 5000 的 ASP.NET Core 應用程式。 雖然 Nginx 會自動啟動,但每次重新啟動伺服器時,都必須手動啟動 ASP.NET Core 應用程式。 否則,ASP.NET Core 應用程式會正常結束或當機。

如果您藉由將 IIS 當做 Proxy 來執行 ASP.NET Core,IIS ASP.NET Core 模組 (ANCM) 會處理進程管理,且 ASP.NET 核心進程會自動啟動。 另一個選項是在 Windows 中執行 ASP.NET Core 即服務,以便在電腦啟動時立即設定自動啟動功能。

為您的 ASP.NET Core 應用程式建立服務檔案

回想一下, systemctl 命令是用來管理「服務」或「精靈」。 精靈與 Windows 服務的概念類似。 這類服務可以在系統啟動時自動重新啟動。

什麼是服務檔案?

在Linux中,也有具有 「.service」 擴展名的單位組態檔,可用來控制進程結束時精靈的行為。 這些也稱為 服務檔案單位檔案和服務 單位檔案

這些服務檔案位於下列其中一個目錄中:

  • /usr/lib/systemd/:儲存已下載應用程式的服務檔案
  • /etc/systemd/system/:儲存系統管理員所建立的服務檔案

檢查 Nginx 服務檔案。 它會透過套件管理員安裝。 其組態檔應該位於 /usr/lib/systemd/system/ 資料夾中。 systemctl status nginx執行 命令也會顯示服務檔案的位置。

systemctl status nginx 命令的螢幕快照。

這就是 Nginx 服務檔案的外觀。

cat 命令的螢幕快照。

ASP.NET Core 應用程式的範例服務檔案

下列範例單元檔案內容取自 Linux 上具有 Nginx 的主機 ASP.NET Core:

[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

以下是此內容的某些重要層面:

  • WorkingDirectory 是您發佈應用程式的目錄。
  • ExecStart 是啟動應用程式的實際命令。
  • Restart=always 是自我說明的。 如果因某種原因而停止,不論是手動還是因為當機而停止,一律會啟動此程式。
  • RestartSec=10 也是自我解釋的。 進程停止之後,將會在經過 10 秒之後啟動。
  • SyslogIdentifier 很重要。 這表示「系統記錄標識碼」。 精靈的相關信息會記錄在系統記錄中的這個名稱之下。 您也可以使用此識別碼來尋找進程的 PID。
  • User 是管理服務的使用者。 它應該存在於系統中,並擁有應用程式檔的適當擁有權。
  • 您可以在服務檔案中設定任意數目的環境變數。

注意

使用者 www-data 是系統中的特殊使用者。 您可以使用此帳戶。 您將建立新的使用者,以在 Linux 中練習用戶權力。 不過,如果您不想建立另一個 Linux 使用者, www-data 就沒關係。

為 ASP.NET Core 應用程式建立服務檔案

您將用來 vi 建立和編輯服務檔案。 您的服務檔案會進入 /etc/systemd/system/ 資料夾。 請記住,在此系列中,您已將第一個應用程式發佈至 /var/firstwebapp/ 資料夾。 因此, WorkingDirectory 應該指向這個資料夾。

以下是最終組態檔:

[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

執行 sudo vi /etc/systemd/system/myfirstwebapp.service ,貼上最終組態,然後儲存盤案。

sudo 命令的螢幕快照。

這會完成 ASP.NET Core Web 應用程式以精靈身分執行的必要設定。

因為 Web 應用程式現在已設定為服務,因此您可以執行 systemctl status myfirstwebapp.service來檢查其狀態。 如您在下列螢幕快照中所見,應用程式已停用(系統重新啟動後不會自動啟動),且目前未執行。

systemctl status 命令的螢幕快照。

若要啟動服務,請執行 sudo systemctl start myfirstwebapp.service 命令,然後再次檢查狀態。 這一次,您應該會看到執行中的服務,而且旁邊應該列出進程標識碼。 命令輸出也會顯示新建立之服務系統記錄的最後幾行,並顯示服務正在接 http://localhost:5000聽 。

sudo systemctl start 命令的螢幕快照。

如果 Web 應用程式意外停止,它會在 10 秒後自動重新啟動。

有一個最後一個步驟:服務正在執行,但未啟用。 「已啟用」表示伺服器啟動後會自動啟動。 這是所需的最終組態。 執行下列命令以確定服務已啟用:

sudo systemctl enable myfirstwebapp.service

sudo systemctl enable 命令的螢幕快照。

這是您 ASP.NET Core 應用程式的里程碑,因為您已將它設定為在伺服器重新啟動或進程終止之後自動啟動。

測試核心應用程式是否自動重新啟動 ASP.NET

在您前進到下一個部分之前,請確定一切如預期般運作。 目前的組態如下所示

  • Nginx 會自動執行,並接聽埠 80 上傳送的要求。
  • Nginx 會設定為反向 Proxy,並將要求路由傳送至 ASP.NET Core 應用程式。 應用程式正在接聽埠 5000。
  • ASP.NET Core 應用程式設定為在伺服器重新啟動後自動啟動,如果行程停止或當機,則為 。

因此,每當 ASP.NET Core 服務停止時,應該會在 10 秒內重新啟動。 若要測試此行為,您將強制停止進程。 您可以預期它會在 10 秒內再次啟動。

注意

ASP.NET Core 應用程式的目前進程標識碼。 此處顯示的嘗試進程標識碼在進程終止之前為 5084 。 若要尋找 ASP.net Core 應用程式的進程識別碼,請執行 systemctl status myfirstwebapp.service 命令。

若要強制停止進程,請執行下列命令:

sudo kill -9 <PID>

注意

9 以下是訊號類型。 根據 man 訊號命令, 9 是SIGKILL(終止訊號)。 您可以使用 命令來開啟說明頁面 man ,以取得「終止和訊號」,以深入瞭解本主題。

systemctl status myfirstwebapp.service在命令之後kill立即執行命令,等候約10秒,然後再次執行相同的命令。

kill 命令的螢幕快照。

在這裡螢幕快照中,您可以看到下列資訊:

  • 在終止之前,ASP.NET 核心進程具有 5084 的進程標識碼。
  • 服務狀態表示已終止使用 PID 5084 的進程,而且因為已設定自動重新啟動而再次啟動。
  • 幾秒鐘后,啟動新的程式(PID 5181)。

如果您嘗試使用 curl localhost存取網站,您應該會看到 ASP.NET Core 應用程式仍在回應。

下一步

第 2.3.1 部分 - [選擇性] 在 Linux 中設定 ASP.NET Core 應用程式,以在不同的使用者下自動啟動。