[英]What is Kestrel (vs IIS / Express)
什么是 Kestrel Web 服務器,它與 IIS / IIS Express 有什么關系?
我來自在 IIS Express 上開發應用程序並將它們托管在 IIS Web 服務器上。 使用 ASP.NET Core 我依賴於Microsoft.AspNetCore.Server.Kestrel
並且我的啟動有.UseServer("Microsoft.AspNetCore.Server.Kestrel")
。 但是當我運行我的網站時,我仍然在系統托盤中看到 IIS Express 圖標。 有人問我是使用 IIS Express 還是 Kestrel,我不知道該說什么!
我在 PC 上開發並在 Azure 中托管時沒有任何跨平台要求,所以我什至need
Kestrel 時我感到困惑,但似乎沒有替代方案 - 即使是最簡單的示例也使用 Kestrel。
我想提供一個帶有一些歷史記錄的替代答案,以便您了解 Kestrel 的原因,即使您只使用 Windows 和 IIS。
在 2000 年之前 ASP.NET 開發的最初階段,顯然微軟創建了兩個部分來托管 ASP.NET WebForms 應用程序,
HttpListener
用 C# 編寫的完全托管的 Web 服務器。 當然,由於它僅用於開發,因此許多功能從未實現。 隨着微軟向公眾提供了 Cassini 的源代碼,有第三方分叉了代碼庫並添加了更多功能,從而開始了 Cassini 家族。aspnet_wp.exe
)。因此,要開發 Web 應用程序,請使用 Cassini,並使用 IIS 進行部署。
在 IIS 6 中引入應用程序池需要在 ASP.NET 端進行一些更改,因此aspnet_wp.exe
變得過時並被aspnet_isapi.dll
取代。 這可以看作是 IIS 修訂版 2 上的 ASP.NET 支持。因此 ASP.NET 應用程序托管在 IIS 工作進程w3wp.exe
。
在 IIS 7 及更高版本中引入集成管道需要進一步更改,將aspnet_isapi.dll
替換為webengine4.dll
。 這可以看作是 IIS 修訂版 3 上的 ASP.NET 支持。ASP.NET 和 IIS 管道是統一的。
可以看到 ASP.NET 變得更加復雜並且與 IIS 緊密集成,因此 Cassini 開始顯示其年齡,並逐漸被 IIS Express(用戶模式 lite IIS)所取代。
因此,在很多情況下,當人們責怪 IIS 慢時,實際上應該責怪 ASP.NET。 沒有 ASP.NET 的 IIS 本身非常快速和穩定,而 ASP.NET 的開發並沒有考慮到足夠的性能指標(因為 WebForms 關注很多生產力和 RAD)。
然后在 2014 年 11 月,ASP.NET 5(后來更名為 ASP.NET Core)發布並成為跨平台技術。 顯然,微軟需要一個新的設計來支持 Windows、macOS 和 Linux,其中除了 IIS 之外,還應該考慮所有主要的 Web 服務器、nginx/Apache(或其他 Web 服務器)。
我想很多人都會同意微軟從libuv
學到了很多東西,然后設計和開發了 Kestrel(最初基於libuv
但很快可能會轉向其他技術)。 它最初是像 Cassini 一樣的輕量級 Web 服務器,但后來添加了更多功能(就像評論的另一個答案一樣,功能更多,因此可以將其視為完整的 Web 服務器)。 盡管完全托管(存在一些本機依賴項),但它不再是像 Cassini 那樣的玩具 Web 服務器。
那你為什么不能只使用 Kestrel? 為什么仍然需要 IIS Express 和潛在的 IIS、nginx 或 Apache? 這主要是當今互聯網實踐的結果。 大多數網站使用反向代理從您的 Web 瀏覽器獲取請求,然后在后台轉發到應用程序服務器。
另一個答案已經顯示了指向 Microsoft 文檔的鏈接,因此您可以查看一下。
Microsoft 最初開發 HttpPlatformHandler 是為了使 IIS 成為 Java/Python 等足夠好的反向代理,因此計划將其用於 ASP.NET Core。 在開發過程中開始出現問題,所以后來微軟專門為 ASP.NET Core 制作了 ASP.NET Core Module。 這是 IIS 修訂版 4 上的 ASP.NET 支持。
從 ASP.NET Core 2.2 開始,用於 IIS 的 ASP.NET Core 模塊(版本 2)可以在 IIS 工作進程( w3wp.exe
)內托管 .NET Core 環境,與 ASP.NET 2.x/4.x 非常相似。 這種模式稱為“IIS 進程內托管” 。 它可以被視為 IIS 修訂版 5 上的 ASP.NET 支持。
嗯,很長,但我希望我把所有必要的部分放在一起,你會喜歡閱讀。
什么是紅隼
這是一個完整的網絡服務器。 您可以僅使用 Kestrel 運行您的 ASP.NET Core 應用程序。
但是當我運行我的網站時,我仍然在系統托盤中看到 IIS Express 圖標
在您的 ASP.NET 應用程序中,可能在wwwroot
目錄中,您將看到包含以下內容的 web.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
</handlers>
<httpPlatform processPath="%DNX_PATH%" arguments="%DNX_ARGS%" stdoutLogEnabled="false" startupTimeLimit="3600"/>
</system.webServer>
</configuration>
這是 HttpPlatformHandler。 本質上,這樣做是將所有請求轉發給 Kestrel。 IIS Express(和 IIS)將不再運行 ASP.NET。 相反,它們將充當代理,簡單地從 Kestrel 來回傳遞請求和響應。 使用 IIS 仍然有優勢,特別是它為您提供安全配置、內核級緩存等。
來自 ms 文檔: https : //docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel? tabs =aspnetcore2x
Kestrel 是基於 libuv 的跨平台異步 I/O 庫,用於 ASP.NET Core 的跨平台 Web 服務器。 Kestrel 是默認包含在 ASP.NET Core 項目模板中的 Web 服務器。
您可以單獨使用 Kestrel,也可以與反向代理服務器(例如 IIS、Nginx 或 Apache)一起使用。 反向代理服務器從 Internet 接收 HTTP 請求,並在進行一些初步處理后將它們轉發給 Kestrel。
來自 asp.net core 2.1 文檔: https : //docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel? view = aspnetcore-2.1#transport- configuration
隨着 ASP.NET Core 2.1 的發布,Kestrel 的默認傳輸不再基於 Libuv,而是基於托管套接字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.