簡體   English   中英

什么是 Kestrel(與 IIS / Express)

[英]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 應用程序,

  • Cassini,后來成為 Visual Studio 中的 ASP.NET 開發服務器。 它是一個基於HttpListener用 C# 編寫的完全托管的 Web 服務器。 當然,由於它僅用於開發,因此許多功能從未實現。 隨着微軟向公眾提供了 Cassini 的源代碼,有第三方分叉了代碼庫並添加了更多功能,從而開始了 Cassini 家族。
  • IIS 上的 ASP.NET 支持(修訂版 1)。 因為當時 IIS 是 4.0 和 5.0/5.1,沒有應用程序池,ASP.NET 甚至有自己的工作進程( 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 瀏覽器獲取請求,然后在后台轉發到應用程序服務器。

  • IIS Express/IIS/nginx/Apache 是反向代理服務器
  • Kestrel/NodeJS/Tomcat 等等都是應用服務器

另一個答案已經顯示了指向 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。


更新:.net core 2.1,Kestrel 使用托管套接字而不是 libuv

來自 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,而是基於托管套接字。

  1. Kestrel 不支持同一端口上的多個應用程序。
  2. Kestrel 上不存在 Windows 身份驗證。
  3. IIS 中的請求過濾功能更加全面。
  4. IIS 中的 Mime 類型映射要好得多。
  5. Kestrel 中不收集 HTTP 訪問日志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM