.NET Hosting Solutions (Kestrel, HTTP.sys, IIS)
2022-04-12
介紹 .NET Core 關於網站 Hostings 可以採用的 Solutions,包含 .NET 跨平台力推的 Kestrel Web Server 或者是在 Windows 平台獨家的 HTTP.sys Web Server 或是 Windows Ecosystem 的老朋友 IIS Web Server。
從系統的發佈、部署出發,討論各不同解決方案的效能優勢以及背後帶來的架構觀念。
說明
一圖勝千言,.NET Hosting 包含三種解決方案:Kestrel、HTTP.sys 以及 IIS。其中 IIS 又可以再細分為 In Process 以及 Out of Process 兩種 Hosting Models。
關於三種解決方案的比較,可以參考 learn.microsoft 的 Web server implementations in ASP.NET Core
Kestrel
Kestrel 中文稱為紅隼,是一種小型猛禽,可以看得出微軟對於 Kestrel 命名,有著小巧精幹的期許,也正是 Kestrel 的特色。
Kestrel 可以作為獨立的 Process 處理外部的 HTTP Request,如下圖:
但因為 Kestrel 需要獨佔 Port,在 Multi-Tenant 的部署環境,可以結合 Reverse Proxy 例如 IIS、Nginx 以及 Apache 來處理 Http Request。
關於 Kestrel 的介紹,可以參考 learn.microsoft 的 Kestrel web server implementation in ASP.NET Core
HTTP.sys
正確的名稱應該稱為 HTTP.sys Web Server,不然很容易和 IIS 扮演 Listener 同的 HTTP.sys Driver 搞混 🤔
HTTP.sys Web Server 是由 HTTP.sys Driver 搭配 HTTP Server API 所構成,可以替代 Kestrel 使用,同樣可以直接面對 Http Request。
HTTP.sys 是 Windows Server 平台限定,不同於 Kestrel 可以跨平台,而使用 HTTP.sys 的主要用途是處理 Kestrel 所無法處理的工作,例如 Kernel Mode Windows Auth。
但在一般情況下 Microsoft 是推薦優先使用 Kestrel 的唷 🤗
HTTP.sys Web Server 的一個特色是無法搭配 IIS 使用,儘管兩者同樣是 HTTP.sys Driver 負責 Listen Http Request。
關於 HTTP.sys 的介紹,可以參考 learn.microsoft 的HTTP.sys web server implementation in ASP.NET Core
IIS
Out Of Process
Out Of Process Hosting Mode 相當於 Kestrel 使用 Proxy 的模式,對外是由 IIS 的 w3wp.exe
來接待 Http Request,再交由 dotnet.exe
處理。
關於 Out Of Process 可以參考 learn.microsoft 的 Out-of-process hosting with IIS and ASP.NET Core
In Prcoess
In Prcoess Hosting Mode,系統只會有獨立的 Process,並且使用的是 IISHttpServer 而非 Kestrel,這種架構免去了 Proxy 代理的往返過程,效能上更為躍進,同時 In Process 也是預設將 .NET 部署至 IIS 所採用的模式。
筆者之前也實驗了如何將 .NET Project 部署至 IIS 上,事後才發現自己使用的正式 In Process 的部署模式 (因為是預設 😄)。
關於 In Process 可以參考 learn.microsoft 的 In-process hosting with IIS and ASP.NET Core 以及 ASP.NET Core In Process Hosting on IIS with ASP.NET Core。
Windows Auth
Hosting | Mode |
---|---|
Kestrel | User Mode |
HTTP.sys | Kernel Mode |
Kestrel 與 HTTP.sys 對於 Windows Authentication 所支援的 Mode 不同,詳細可以參考 learn.microsoft 上的 Configure Windows Authentication in ASP.NET Core 說明。