.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。

從系統的發佈、部署出發,討論各不同解決方案的效能優勢以及背後帶來的架構觀念。

logo

說明

一圖勝千言,.NET Hosting 包含三種解決方案:Kestrel、HTTP.sys 以及 IIS。其中 IIS 又可以再細分為 In Process 以及 Out of Process 兩種 Hosting Models。

關於三種解決方案的比較,可以參考 learn.microsoft 的 Web server implementations in ASP.NET Core

圖片來源:learn.microsoft

Kestrel

Kestrel 中文稱為紅隼,是一種小型猛禽,可以看得出微軟對於 Kestrel 命名,有著小巧精幹的期許,也正是 Kestrel 的特色。

Kestrel 可以作為獨立的 Process 處理外部的 HTTP Request,如下圖:

圖片來源:learn.microsoft

但因為 Kestrel 需要獨佔 Port,在 Multi-Tenant 的部署環境,可以結合 Reverse Proxy 例如 IIS、Nginx 以及 Apache 來處理 Http Request。

圖片來源:learn.microsoft

關於 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。

圖片來源:learn.microsoft
圖片來源:learn.microsoft

關於 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

圖片來源:learn.microsoft

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

圖片來源:learn.microsoft

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 說明。