iT邦幫忙

2024 iThome 鐵人賽

DAY 7
1
佛心分享-IT 人自學之術

靠近 ASP .NET Core 一點點系列 第 7

Day 7 Kestrel : 到底是什麼 ? 與 ASP .NET Core 關係 ?

  • 分享至 

  • xImage
  •  

分享主軸

  • 介紹 Kestrel
  • 與 ASP .NET Core 關係
  • 簡單提及 IIS

Kestrel是什麼

  1. 預設伺服器
  • ASP .NET Core Run 起來,就可以連接網站,那個 Web Server 名稱就是 Kestrel,內建在 ASP .NET Core內,簡單來說 Kestrel 就是 ASP .NET Core 內建的一套預設的 Web Server。
  1. 高效能與跨平台
  • Kestrel 是一個跨平台的伺服器,這意味著它可以在 Windows、Linux 和 macOS 上運行,它使用異步 I/O 模型,這使得它在處理請求時能夠更有效率。
  1. 安全性且可與反向代理伺服器的結合
  • Kestrel 支持 HTTPS
  • 雖然 Kestrel 可以單獨運行,但在正式環境中,通常會將 Kestrel 與反向代理伺服器(如 IIS、Nginx 或 Apache)結合使用。反向代理伺服器接收 HTTP 請求,並將這些請求轉發到 Kestrel,這樣可以提供額外的安全性和負載均衡功能。

總結來說

  • Kestrel 是 ASP.NET Core 的內建 Web 伺服器,主要負責處理最基本的 HTTP 請求與回應。然而比如Kestrel 本身並不具備處理靜態文件的能力,例如靜態網頁、圖片或其他資源。如果你需要這些功能,就必須透過 Middleware 來擴充 Kestrel 的能力,如下
var app = builder.Build();
// 使用靜態文件中間件
app.UseStaticFiles();
app.Run();
  • ASP .NET Core 的 Kestrel 其實沒有太多特別功能 (它的設計目標是提供最小的開銷和最高的性能,但這也意味著它本身並不具備許多內建功能),要什麼功能得自己在 program.cs 內註冊 Middleware 服務,並不像 IIS 功能那麼齊全。
  • 共享 Port 的限制:Kestrel 不能在同一台伺服器上與其他應用共享相同的 Port。因此,在多個應用同時運行時,使用反向代理可以更好地管理不同域名和端口的綁定。

Kestrel 的資源管理問題

  • Kestrel 是 ASP.NET Core 的內建 Web 伺服器,主要負責處理基本的 HTTP 請求與回應。然而,Kestrel 本身並不具備自動恢復機制。如果 ASP.NET Core 應用程式在 Kestrel 上運行時發生崩潰,Kestrel 作為一個執行檔(.exe)也會停止運行,無法自動重新啟動

IIS 的 Process Manager 能力

  • IIS(Internet Information Services)具有強大的 Process Manager 能力。當 IIS 中的工作進程(w3wp.exe)崩潰時,IIS 會自動監控並重新啟動該進程,確保應用程式的高可用性。這是因為 IIS 內建了一個監控機制,可以自動檢測並恢復崩潰的應用程式集區

微軟建議將 Kestrel 前放置反向代理伺服器,可以利用反向代理伺服器(如 IIS、Nginx 或 Apache)的資源管理和恢復能力,確保應用程式的高可用性和穩定性( 這只是建議,並非一定)。

補充

  • Visual Studio 自動啟動的 Kestrel 透過預設的 CreateDefaultBuilder 配置已經足夠,並且不需要在 Program.cs 中手動設定 Kestrel託管。只有在需要特別配置 Kestrel 行為時,你才需要在 Program.cs 中添加額外的配置,例如要設定特別 IP 或是 限制請求大小或連接數量
// 新增 Kestrel server options
builder.ConfigureKestrel((context, options) =>
{
    // 設定 Kestrel 的限制
    options.Limits.MaxRequestBodySize = 10 * 1024 * 1024;

    // 設定特定的端口和 IP 地址
    options.Listen(IPAddress.Parse("127.0.0.1"), 5000);
    options.Listen(IPAddress.Parse("192.168.0.1"), 5000);
});

Visual Studio 內的啟動的種類與代表意思

在 Visual Studio 中,綠色的「執行」按鈕旁的選項(如「http」、「https」、「IIS Express」、「WSL」等)代表了不同的執行和除錯方式。以下是各選項的含義
https://ithelp.ithome.com.tw/upload/images/20240920/20133954Eh4Cj3W0Al.png

HTTP / HTTPS

Kestrel 會被啟動,直接處理 HTTP 或 HTTPS 請求

  • HTTP:使用未加密的 HTTP 協定來執行應用程式。適合本地開發和測試,但安全性較低,不建議在生產環境中使用。
  • HTTPS:使用加密的 HTTPS 協定來執行應用程式。提供更高的安全性,尤其在處理敏感資料時應該使用。需要配置 SSL 憑證。

IIS Express

IIS Express 會作為反向代理,後端仍由 Kestrel 處理請求,Kestrel 也會啟動

  • IIS Express:這是 Internet Information Services (IIS) 的輕量版,通常用於在 Visual Studio 中本地除錯網頁應用程式。它提供了大多數 IIS 的功能,但設置更簡單,適合開發用途。IIS Express 支援 HTTP 和 HTTPS,並且不需要管理員權限即可運行。( 選擇 IIS Express 來運行應用程式時,表示 Visual Studio 正在模擬 IIS 環境,但這是 IIS 的輕量版,主要用於開發和測試用途 )

WSL (Windows Subsystem for Linux)

Kestrel 會在 WSL 的 Linux 環境中啟動並處理請求

  • WSL:這個選項允許你在 Windows 中的 Linux 環境下執行和除錯應用程式。如果你的應用程式最終會部署到 Linux 伺服器,這會非常有用。WSL 提供了一個完整的 Linux 用戶空間,讓你可以在 Windows 上運行 Linux 應用程式。

IIS 與 Kestrel 差異

  • IIS是功能豐富且高效 Web Server,提供方便的操作設定 SSL、HTTP2、gzip、UrlRewrite 等功能,但只能在Windows上運行
  • Kestrel Web Server 則是跨平台,可以在Windows、Linux、MacOS 上運作,支援SSL,但不支援多個應用程式用相同的Port號
  • Kestrel Web Server 只能接受最基本的 Request 與 Response,要有其他功能,必須去擴充方法,使用Middleware,這邊與IIS不同,IIS Web Server 是多功能的
  • Kestrel Web Server 會處理 HTTP 請求並將它們傳遞給 ASP.NET Core 應用程式
  • Kestrel Web Server 沒有自動重啟的功能,所以當應用程式或是Kestrel 掛掉,是沒辦法自動重啟的,這也是 微軟官方建議 Kestrel 外面再擋一層,因為那一層可以幫忙管理 Kestrel 的 Process
  • 若要在 IIS上跑 ASP .NET Core應用程式,就得下載 ASP .NET Core Hosting Bundle,此時在IIS模組內可以看到一個叫做 AspNetCoreModuleV2,表示安裝成功

簡單統整一下

  • 了解 ASP .NET Core 內建就有一套高效能的 Web Server 與以往 ASP .NET 不同
  • 了解 微軟建議 ASP .NET Core 部屬架構會是在 Kestrel 前有一個 Proxy,而不要直接讓 Kestrel 就對外到 Client
  • 了解 Kestrel 與 IIS 簡單差異
  • 了解 Kestrel 不能在同一台伺服器上與其他應用共享相同的 Port。因此,在多個應用同時運行時,使用反向代理可以更好地管理不同域名和端口的綁定

今日結語
了解 ASP .NET Core 與 Kestrel 關係以及 Kestrel 是什麼 ? 對於在開發 ASP .NET Core 非常有幫助,
順便簡單了解一下 IIS 與之差異。

今日就分享到這邊,希望有幫助到大家,明日繼續努力。


上一篇
Day 6 從零開始:如何自建 NuGet 套件庫並應用於專案
下一篇
Day 8 Middleware : 對於專案可以很靈活又擴充的中介軟體
系列文
靠近 ASP .NET Core 一點點27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言