Kestrel是什么(与IIS/Express相比)?

249
什么是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上托管,所以我没有跨平台的要求,因此我很困惑是否真的需要Kestrel,但似乎并没有其他选择 - 即使是最简单的示例也使用Kestrel。

当你对这项新技术有疑问时,请从相关项目的GitHub页面开始查看其维基。你可以在ASP.NET存储库中找到服务器维基页面 - mason
21
当然,然后你会遇到像“本文档已过时。如需最新的ASP.NET Core文档,请访问:http://docs.asp.net”这样的东西。糟糕了。 - user4942583
https://dev59.com/YlgQ5IYBdhLWcg3wr17V? - Deepak Mishra
4个回答

319

我想提供一种替代性答案,并附带一些历史,以便您了解为什么Kestrel会出现,即使您只使用Windows和IIS。

在2000年之前ASP.NET开发的最初阶段,微软显然创建了两个部分来托管ASP.NET WebForms应用程序:

  • Cassini,后来成为Visual Studio中的ASP.NET Development Server。它是一个完全由C#编写的托管Web服务器,基于HttpListener。当然,由于它只用于开发,许多功能从未实现。由于Microsoft将Cassini的源代码向公众开放,因此有第三方分支了代码库并添加了更多功能,这就开始形成了Cassini家族。
  • ASP.NET在IIS上的支持(修订版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取代。这可以看作是ASP.NET在IIS上的第二个版本。因此,ASP.NET应用程序被托管在IIS工作进程w3wp.exe中。

  • IIS 7及以上版本引入了集成管道需要进一步更改,将aspnet_isapi.dll替换为webengine4.dll。这可以看作是ASP.NET在IIS上的第三个版本。ASP.NET和IIS管道被统一起来了。

您可以看到,ASP.NET变得更加复杂并且与IIS紧密集成,因此Cassini开始显露出其年龄,并逐渐被IIS Express(一个用户模式下的轻量级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服务器)。
我认为很多人会同意微软从NodeJS中学到了很多东西,然后设计并开发了Kestrel(最初基于libuv,但很快可能会转到其他技术)。 它是一个像Cassini一样的轻量级Web服务器,但后来添加了更多功能(就像另一个答案评论的那样,提供了更多功能,因此可以视为完整的Web服务器)。尽管完全管理(存在一些本地依赖项),但它不再像Cassini那样是一个玩具Web服务器。
那么为什么不能只使用Kestrel呢?为什么仍然需要IIS Express和潜在的IIS、nginx或Apache?这主要是当今互联网实践的结果。大多数网站使用反向代理从您的Web浏览器获取请求,然后将其转发到后台的应用程序服务器。
  • IIS Express/IIS/nginx/Apache是反向代理服务器
  • Kestrel/NodeJS/Tomcat等是应用程序服务器
另一个答案已经显示了到Microsoft文档的链接,所以您可以查看。微软最初开发了HttpPlatformHandler来使IIS成为Java/Python等的足够好的反向代理,并计划在ASP.NET Core中使用它。在开发过程中出现了问题,所以后来微软专门为ASP.NET Core开发了ASP.NET Core模块。这是IIS上的ASP.NET支持修订版4。自 ASP.NET Core 2.2 开始,ASP.NET Core 模块适用于 IIS (版本 2),可以将 .NET Core 环境托管在 IIS 工作进程 (w3wp.exe) 内,类似于 ASP.NET 2.x/4.x。这种模式被称为“IIS 内部托管模型”,可以视为 IIS 修订版 5 上的 ASP.NET 支持。
最近一项更新(2023 年 1月)是 ASP.NET Core/Kestrel 可以用来托管反向代理功能本身,正如开源 YARP 项目揭示的那样
Kestrel/YARP 现已广泛用于 Microsoft Azure 中,在许多场景中取代了 IIS ARR,因此现在您可以使用 Kestrel/YARP 托管自己的生产 Web 应用程序,而无需其他 Web 服务器(IIS/nginx/Apache)在前面。

1
不错的答案。但您不能简单地说使用kestrel和IIS是“当今互联网实践”的结果。使用反向代理的理由有很多。在此提及其中一些会很好。 - Nilay Vishwakarma
36
使用反向代理有许多合理的理由。一般来说,人们可以通过向谷歌提问来找到好的资源,因此我没有将这一点附加到这个已经足够长的答案中。 - Lex Li
3
感谢您发布这个详细的回答,涵盖了正确的背景和历史。阅读它很有趣。 - Akash
1
澄清一下,Node.js 只是运行时。如果您计划独立使用,则 Node.js 的应用服务器将是 PM2,但对于更强大的部署,您可能需要使用 Passenger,然后将这两者之一与 Nginx 反向代理相结合。 - OzzyTheGiant
2
这并不是一个特别清晰的答案。它可能需要进行彻底的语法和内容修订才能更好地表达。 - TylerH

157

Kestrel是一个完整的Web服务器,您可以仅使用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 仍然有优势,特别是可以提供安全配置、内核级缓存等功能。


15
由于引入了 ASP.NET Core 模块(而非 HttpPlatformHandler),这个回答有点过时了。我提供了一种替代方案,其中包括更多的故事和相关产品。 - Lex Li
2
@user99513,它显示“视频不可用”。 - David Klempfner

17

来自微软文档: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x

Kestrel是基于跨平台异步I/O库libuv的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://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration

随着ASP.NET Core 2.1的发布,Kestrel的默认传输方式不再基于Libuv,而是基于托管套接字。


12
  1. Kestrel不支持在同一端口上运行多个应用程序。
  2. Kestrel不支持Windows身份验证。
  3. IIS中的请求过滤功能更加完整。
  4. IIS中的Mime类型映射更好。
  5. Kestrel不会收集HTTP访问日志。

2
此外,“Kestrel服务器目前不提供内置的压缩支持”(https://learn.microsoft.com/en-us/aspnet/core/performance/response-compression?view=aspnetcore-7.0)。 - KVM
1
这并没有回答所提出的问题,而是列出了这两个服务之间的一些具体差异。 - TylerH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接