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

Posted

技术标签:

【中文标题】什么是 Kestrel(与 IIS / Express 相比)【英文标题】:What is Kestrel (vs IIS / Express) 【发布时间】:2016-06-08 22:19:13 【问题描述】:

什么是 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。

【问题讨论】:

当您对这项新技术有任何疑问时,请从相关项目的 GitHub 页面开始,并查看他们的 Wiki。您会在 ASP.NET 存储库中遇到此 Servers wiki page。 当然,然后你会遇到像This document is now out of date. For up-to-date ASP.NET Core documentation go to: http://docs.asp.net 这样的东西。哎呀。 ***.com/questions/42382317/…? 【参考方案1】:

我想提供一个替代答案,并附上一些历史,以便您了解 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 服务器)都应该考虑在内。

我想很多人都会同意,微软从 NodeJS 中学到了很多东西,然后设计和开发了 Kestrel(最初基于 libuv,但可能很快会转向其他技术)。它最初是像 Cassini 一样的轻量级 Web 服务器,但后来添加了更多功能(如另一个答案评论,更多功能因此可以被视为完整的 Web 服务器)。尽管完全托管(存在一些本地依赖项),但它不再是像 Cassini 那样的玩具 Web 服务器。

那你为什么不能只使用 Kestrel?为什么仍然需要 IIS Express 和可能的 IIS、nginx 或 Apache?这主要是当今互联网实践的结果。大多数网站使用反向代理从您的网络浏览器获取请求,然后在后台转发到应用程序服务器。

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 in-process hosting"。它可以被认为是对 IIS 版本 5 的 ASP.NET 支持。

嗯,很长,但我希望我把所有必要的部分放在一起,你会喜欢阅读它。

【讨论】:

不错的答案。但是您不能简单地说将 kestrel 与 IIS 结合使用是“当今互联网实践的结果”。使用反向代理有很多理由。在这里提几个就好了。 “使用反向代理有很多理由”属于它自己的问答。通常人们可以通过询问谷歌找到好的资源,所以我没有将它附加到这个已经足够长的答案。 感谢您发布此详细答案正确的上下文和历史记录。喜欢阅读它。 澄清一下,Node.js 只是运行时。 Node.js 的应用服务器将是 PM2,如果您打算独立运行,但对于更健壮的部署,您可能希望使用Passenger,然后将这两者中的任何一个与 Nginx 反向代理结合起来。【参考方案2】:

什么是红隼

这是一个成熟的网络服务器。您可以仅使用 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 仍有优势,特别是它为您提供安全配置、内核级缓存等。

【讨论】:

由于引入了 ASP.NET Core 模块(而不是 HttpPlatformHandler),这个答案有点过时了。我还提供了一个包含更多故事和相关产品的替代答案。 @user99513 它说“视频不可用”。【参考方案3】:

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

Kestrel 是一个基于 ASP.NET Core 的跨平台 Web 服务器 libuv,一个跨平台的异步 I/O 库。红隼是网络 ASP.NET Core 项目模板中默认包含的服务器。

您可以单独使用 Kestrel,也可以与反向代理服务器一起使用,例如 IIS、Nginx 或 Apache。反向代理服务器接收 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,而是基于托管套接字。

【讨论】:

【参考方案4】:
    Kestrel 不支持同一端口上的多个应用程序。 Kestrel 上不存在 Windows 身份验证。 IIS 中的请求过滤功能更加全面。 Mime 类型映射在 IIS 中要好得多。 Kestrel 中未收集 HTTP 访问日志。

【讨论】:

以上是关于什么是 Kestrel(与 IIS / Express 相比)的主要内容,如果未能解决你的问题,请参考以下文章

IIS充当反向代理转发请求到Kestrel

Kestrel服务器

使用iis反向代理.net core应用程序

.NetCore项目在IIS中部署

[.net core]5.outProcess

ASP.NET Core部署系列一:发布到IIS上