上一篇
文章中记录了对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项目也是推荐的方式。