適用於: .NET 8 和更新版本
本文介紹如何在Linux中建立及設定 ASP.NET Core應用程式。
必要條件
若要遵循此部分的練習,您必須安裝 .NET SDK。 若要安裝 SDK,請視需要參閱第 1 部分中的安裝指示。
此部分的目標
瞭解如何在Linux中使用 .NET 命令行介面 (CLI) 建立 ASP.NET Core Web 應用程式,以及如何將應用程式發佈至 /var 目錄。 當您了解這些概念時,您將練習一些基本工作,例如使用檔案和資料夾,以及以特殊許可權使用者身分執行命令。 您也將瞭解如何使用 Linux 中的 vi 文字編輯器來編輯檔案。
.NET CLI
根據此 .NET CLI 檔,.NET CLI 是一個跨平臺的工具鏈,可用來開發、建置、執行及發佈 .NET 應用程式。 .NET CLI 會與 .NET SDK 一起安裝。
這些定型經常使用 dotnet
命令。 此命令功能強大,且有兩個主要功能:
- 它提供用於處理 .NET 專案的命令。 例如,
dotnet build
可建置專案。 每個命令都會定義自己的選項和引數。 所有命令都支援--help
列印如何使用 命令的簡短說明選項。 - 其會執行 .NET 應用程式。
您將使用 dotnet new
命令在 Linux 中建立第一個 ASP.NET Core 專案。 此命令會取得專案的型別做為自變數。 本檔中會說明項目類型。 您也可以執行 而不使用 dotnet new
參數來顯示類型清單。 下列螢幕快照中的 Web 相關項目類型會以黃色醒目提示。
使用 SDK 建立 ASP.NET Core Web 應用程式
您將使用 .NET CLI,使用下列命令來建立您的第一個 Web 應用程式:
dotnet new <template_type> -n <project_name> -o <output_directory>
當您使用 dotnet new
時,適用這些規則:
- 命令會在輸出目錄中建立項目檔。 如果您省略區
-o <output_directory>
段,則會在目前目錄中建立專案。 您一律-o
可以使用 參數。 - 如果資料夾不存在,命令會建立它。
- 如果您省略區
-n <project_name>
段,則項目名稱會與目錄名稱相同。
歡迎找到目錄和專案本身的創意名稱。 不過,請記住,Linux 會區分大小寫。 在此練習中,請使用較保守 AspNetCoreDemo
的項目名稱,並在目錄中建立它 firstwebapp
。
若要建立專案,請執行下列命令:
dotnet new webapp -n AspNetCoreDemo -o firstwebapp
檢查輸出以查看目錄和項目名稱。 下列螢幕快照也會列出輸出目錄的內容。 如果您先前已在 Windows 上建立 ASP.NET Core Web 應用程式,您應該熟悉目錄結構。
您已建立第一個應用程式。 下一個工作將會執行它。 將目錄變更為項目資料夾,然後執行 dotnet run
。
注意
此螢幕快照中的下列專案:
- 您的 Web 應用程式會接聽埠 5001 上的 HTTPS 要求,並在埠 5000 上接聽 HTTP 要求。
- 內容根目錄位於主目錄底下。
建議您不要在主目錄下執行應用程式。 您稍後會將它發佈至另一個目錄,但您應該在發佈它之前先進行測試。 您可以按 Ctrl+C 來停止應用程式。 但目前,請繼續執行,並使用您慣用的方法連線到 Linux 虛擬機,開啟新的終端機會話。 在此範例中,您將再次使用PowerShell。
從另一個終端機測試網站
在新的終端機會話中,確認您的應用程式正在接聽埠 5000 和 5001。 Linux 具有 netstat
與 Windows 相同的命令。 與參數一起執行netstat
-tlp
。 您可以熟悉netstat
本文中的參數,也可以執行 man netstat
或 info netstat
來查看說明檔。
以下是第二個終端機會話中命令的 netstat -tlp
輸出。 它會顯示 AspNetCoreDemo 進程是使用 PID 781 執行,並且正在接聽 IPv4 和 IPv6 的埠 5000 和 5001。
您可以使用 curl 和 wget 來測試您的網站。 這兩個命令都會對目標端進行 HTTP 呼叫,但行為不同:
-
Curl
只是命令行瀏覽器工具。 它會對指定的目標提出 HTTP 要求,而且只會顯示 HTTP 回應的純輸出。 例如,它會顯示 Web 應用程式的 HTML 來源標記。 -
Wget
是 HTTP 下載程式。 它會提出 HTTP 要求,並下載指定的資源。 例如,wgethttp://server/file.zip
會從http://server
下載file.zip,並將其儲存至目前目錄。
此命令 wget
也會顯示一些詳細數據,例如重新導向,以及您可能會收到的任何錯誤訊息。 因此,每當您需要時,您可以使用它作為 HTTP 追蹤工具的基本版本。
如需 和 wget
之間curl
差異的詳細資訊,請移至 StackExchange 網頁。
在此定型系列中,您先前在安裝 .NET 之前,先從 wget
Microsoft伺服器下載 .deb 套件管理員檔案。
如果您執行 curl http://localhost
,則不會發生任何動作。 這很可能表示沒有 HTTP 回應。 然後,您可以執行 wget http://localhost
來檢查當您嘗試存取網站時是否顯示更多資訊。
這就是現在所發生的情況:
- 您向
http://localhost:5000
提出 HTTP 要求,並成功連線。 這表示應用程式正在接受埠 5000 上的連線。 - 您會從指向安全 HTTPS 位置的應用程式收到 HTTP 307 暫時重新導向回應:
https://localhost:5001
。 - Wget 足夠聰明,可遵循此重新導向,並對 提出新的要求
https://localhost:5001
。 - 您再次成功連線。 不過,
wget
不信任 SSL 憑證。 因此,連線失敗。
命令 wget
建議您使用 --no-check-certificate
參數不安全地連線來解決此問題。 不過,此方法牽涉到此訓練範圍不足的 SSL 憑證設定。 相反地,您可以設定 ASP.NET Core 應用程式,使其不會將 HTTP 要求重新導向至 HTTPS。 如果您熟悉 ASP.NET Core 應用程式開發(或只是組態),請編輯 Startup.cs 檔案以移除重新導向組態。
使用 vi 編輯檔案
您可以使用適用於 Linux 發行版的 vi 文字編輯器來編輯各種純文字檔案。 您將在此訓練中使用它來重新設定應用程式。
您必須先關閉應用程式,才能進行編輯。 首先關閉開啟的終端機會話。 然後,按 Ctrl+C 關閉應用程式。
若要編輯 Startup.cs 檔案,請執行下列命令:
vi ~/firstwebapp/Startup.cs
注意
此命令會啟動vi編輯器,然後載入檔案。 ~ (tilde) 快捷方式是指您建立專案的主目錄。 也就是說,命令會指向 /home/<YourName>/firstwebapp/Startup.cs。
按 I (插入) 鍵以啟用編輯模式。 您現在應該在命令列底部看到 -- INSERT - 。 使用箭頭鍵在檔案內巡覽。 在 ; 和 app.UseHttpsRedirection()
行的開頭加上//
批app.UseHsTs()
注,如下列螢幕快照所示。
按 esc 以結束編輯模式,輸入 :wq!,然後按 Enter。 請注意,冒號字元 (:
) 表示您正在輸入命令、 w
表示寫入、 q
表示結束,並 !
強制寫入。
按 Enter 鍵之後,應該儲存變更。 您可以執行 cat ~/firstwebapp/Startup.cs
來驗證變更。 此命令會顯示Startup.cs檔案的內容。
重新啟動您的應用程式。 若要這樣做,請將目前的目錄變更為 ~/firstwebapp
目錄,然後再次執行 dotnet run
。 然後,開啟伺服器的另一個終端機會話,然後再次執行 curl http://localhost:5000
命令。 這次,命令應該會傳回首頁的 HTML 內容。
您現在已成功在 Linux 上執行第一個 ASP.NET Core Web 應用程式。
將應用程式部署至 /var 目錄
此練習的主要目標是將 Web 應用程式裝載在反向 Proxy 後方,讓連線的用戶端只能使用沒有埠號碼的主機名,從另一部電腦存取應用程式。 這是您在真實世界案例中預期會發生的情況。 您稍後會與 Nginx 合作以完成這項工作。 但在這麼做之前,請將應用程式發佈至 /var 目錄。 這是因為我們建議您不要在使用者的主目錄中執行應用程式。
請記住, /var 目錄是用來儲存各種應用程式的內容和記錄檔,例如Apache和 Nginx。 您將在這裡遵循這種做法,方法是將新建立的 Web 應用程式發佈至 /var。
變更為專案資料夾,然後執行 dotnet publish
以建立發佈資料夾。 將該資料夾複製到 /var 目錄。
此螢幕快照顯示dotnet publish
命令在 ~/firstwebapp/bin/Debug/net5.0/publish/ 資料夾中建立發行檔案。 然後,下列命令用來將所有檔案 複製到 /var/firstwebapp/ 資料夾:
sudo cp -a ~/firstwebapp/bin/Debug/net5.0/publish/ /var/firstwebapp/
注意
請記下 copy 命令之前的 用法 sudo
。 您可以使用此功能,因為標準用戶沒有 /var 目錄的寫入許可權。 因此,您必須以超級使用者身分執行 命令。
若要從已發佈的資料夾執行您的應用程式,請執行下列命令:
dotnet /var/firstwebapp/AspNetCoreDemo.dll
如有需要,您可以使用相同的 curl
和 wget
命令來執行這些測試。 這是因為應用程式仍會接聽埠 5000 的 HTTP 要求。
進程和後續步驟的存留期
如果應用程式需要常數運行時間,在互動式用戶會話內執行 .NET 應用程式並不是一個很好的做法,原因如下:
- 如果使用者要終止其會話,例如關閉 PuTTY 或 PowerShell SSH 用戶端,或結束工作階段,應用程式就會關閉。
- 如果進程因某種原因而終止(例如,進程因為未處理的例外狀況而損毀),則不會自動啟動,而且必須手動重新啟動。
- 如果伺服器重新啟動,應用程式將不會自動啟動。
下一步
第 2.2 部分 - 安裝 Nginx 並將其設定為反向 Proxy 伺服器
請確定 Web 應用程式會自動啟動。 將 Nginx 安裝並設定為反向 Proxy,以改為將對埠 80 的 HTTP 要求路由傳送至 dotnet 應用程式(讓用戶端不需要提供埠號碼即可連線)。
協力廠商資訊免責聲明
本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。