添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

上一篇 文章中记录了对IIS部署应用时相关配置项的设置;那么Asp.Net Core有那些Web服务器呢?各种Web服务器有什么区别呢?实际应用中应该选择哪个呢?

二、常用的Web服务器类型

1、Asp.Net Core当前常用的Web服务器为以下类型:

Windows macOS Linux Kestrel HTTP.sys

2、接下来分别说明:

Kestrel:

Kestrel 服务器是 默认跨平台 HTTP 服务器实现。 Kestrel 提供了最佳性能和内存利用率,但它没有 HTTP.sys 中的某些高级功能。.NET Core 支持的所有平台和版本均支持 Kestrel

Kestrel 支持以下方案:

  • HTTPS
  • HTTP/2
  • 用于启用 WebSocket 的升级
  • 用于获得 Nginx 高性能的 Unix 套接字
  • 可以单独使用 Kestrel,也可以将其与反向代理服务器(如 IIS、Nginx 或 Apache )结合使用。 反向代理服务器接收来自网络的 HTTP 请求,并将这些请求转发到 Kestrel。

    Kestrel 用作边缘(面向 Internet)Web 服务器:

    Kestrel 用于反向代理配置:

    无论配置是否使用反向代理服务器,都是受支持的托管配置。

    如果在没有反向代理服务器的情况下将 Kestrel 用作边缘服务器,则不支持在多个进程间共享相同的 IP 和端口。 如果将 Kestrel 配置为侦听某个端口,Kestrel 会处理该端口的所有流量(无视请求的 Host 标头)。

    可以共享端口的反向代理能在唯一的 IP 和端口上将请求转发至 Kestrel。

    即使不需要反向代理服务器,使用反向代理服务器可能也是个不错的选择。

    反向代理:

  • 可以限制所承载的应用中的公开的公共外围应用。
  • 提供额外的配置和防护层。
  • 可以更好地与现有基础结构集成。
  • 简化了负载均和和安全通信 (HTTPS) 配置。 仅反向代理服务器需要 X.509 证书,并且该服务器可使用普通 HTTP 在内部网络上与应用服务器通信。
  • HTTP.sys 是仅在 Windows 上运行的适用于 ASP.NET Core 的 Web 服务器。 HTTP.sys 是 Kestrel 服务器的 替代选择 ,提供了一些 Kestrel 不提供的功能。 与 HTTP.sys 相比,建议使用 Kestrel,除非应用需要 Kestrel 未提供的功能。
    HTTP.sys 与 ASP.NET Core 模块不兼容,无法与 IIS 或 IIS Express 结合使用。

    HTTP.sys 支持以下功能:

  • Windows 身份验证
  • 具有 SNI 的 HTTPS
  • 基于 TLS 的 HTTP/2(Windows 10 或更高版本)
  • 直接文件传输
  • WebSocket(Windows 8 或更高版本)
  • 2、 进程内托管模型:

    进程内托管在与其 IIS 工作进程相同的进程中运行 ASP.NET Core 应用。 进程内承载相较进程外承载提供更优的性能,因为请求并不通过环回适配器进行代理,环回适配器是一个网络接口,用于将传出的网络流量返回给同一计算机。

    下图为 IIS、ASP.NET Core 模块和进程内托管的应用之间的关系:

    请求的常规流程如下:

  • 请求从 Web 到达内核模式 HTTP.sys 驱动程序。
  • 驱动程序将本机请求路由到网站的配置端口上的 IIS,通常为 80 (HTTP) 或 443 (HTTPS)。
  • ASP.NET Core 模块接收本机请求,并将其传递给 IIS HTTP 服务器 ( IISHttpServer )。 IIS HTTP 服务器是将请求从本机转换为托管的 IIS 进程内服务器实现。
  • 请求被发送到 ASP.NET Core 中间件管道。
  • 中间件管道处理该请求并将其作为 HttpContext 实例传递给应用的逻辑。
  • 应用的响应通过 IIS HTTP 服务器传递回 IIS。
  • IIS 将响应发送到发起请求的客户端。
  • 3、 进程外托管模型:

    由于运行 ASP.NET Core 的进程与 IIS 工作进程分开,因此 ASP.NET Core 模块会负责进程管理。 该模块在第一个请求到达时启动 ASP.NET Core 应用的进程,并在应用关闭或崩溃时重新启动该应用。 这基本上与在 Windows 进程激活服务 (WAS) 托管的进程内运行的应用中出现的行为相同。

    下图为IIS、ASP.NET Core 模块和进程外托管的应用之间的关系:

    请求流程:

  • 请求从 Web 到达内核模式 HTTP.sys 驱动程序。
  • 驱动程序将请求路由到网站的配置端口上的 IIS。 配置的端口通常是 80 (HTTP) 或 443 (HTTPS)。
  • 此模块将该请求转发到应用的随机端口上的 Kestrel。 随机端口不是 80 或 443。
  • 设置方式:

    <PropertyGroup>
      <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
    </PropertyGroup>

    1、Asp.Net Core的服务器建议使用 Kestrel; 集群部署时可使用反向代理服务器(IIS、Nginx等)实现。

    2、在Windows下如果需要使用HTTP.sys的高级功能(windows身份认证、端口共享)时,则采用 HTTP.sys 方式

    3、Windows中IIS部署Asp.Net Core项目也是推荐的方式。