Kestrel是一个跨平台的高性能 Web 服务器,它被设计用来托管 ASP.NET Core 应用程序。
Kestrel 是 .NET Core 的一部分,并且是 ASP.NET Core 应用的默认 Web 服务器。
Kestrel 服务器支持所有 .NET Core 和 .NET 5+ 支持的操作系统,这包括但不限于:* Windows:从 Windows 7 SP1、Windows Server 2008 R2 SP1 及以上版本。* macOS:macOS 10.13 (High Sierra) 及更新版本。* Linux:各种发行版,如 Ubuntu、Debian、Red Hat Enterprise Linux、CentOS、Fedora、openSUSE 等。因为 Kestrel 是 ASP.NET Core 的一部分,它继承了 .NET Core/.NET 5+ 的跨平台特性,这意味着它可以运行在任何安装有兼容 .NET 运行时的平台上。 具体的支持情况可能会根据最新的 .NET 版本有所变化,
此外,需要注意的是,虽然 Kestrel 可以在上述操作系统上运行,但在某些情况下(例如生产环境中的公共互联网部署),推荐使用反向代理服务器(如 IIS、Nginx 或 Apache)来配合 Kestrel 使用,以提供额外的安全性和配置灵活性。
这种架构不仅提高了安全性,还提供了额外的功能和服务,例如负载均衡、SSL/TLS 终止、缓存和压缩等。
以下是 Kestrel 与反向代理服务器协同工作的具体方式:
安全性增强
当 Kestrel 直接作为边缘服务器(即面向互联网)时,它不支持多个进程共享相同的 IP 和端口,并且处理所有到达指定端口的流量,而不考虑请求的 Host 标头15。通过引入反向代理服务器,可以限制 Kestrel 的公开范围,减少直接暴露在公共网络上的风险。此外,防火墙规则可以配置为只允许来自反向代理服务器的连接,进一步增强了安全性。
性能优化
反向代理服务器能够提供诸如静态文件服务、缓存、压缩等功能,减轻 Kestrel 的负担,使其专注于处理动态内容。这有助于提高整体性能和响应速度。例如,Nginx 可以高效地处理静态资源请求,并将动态请求转发给 Kestrel8。
SSL/TLS 终止
反向代理服务器可以负责 SSL/TLS 连接的建立与终止,这意味着只有反向代理需要持有 X.509 证书,并且可以在内部网络中使用普通的 HTTP 协议与 Kestrel 通信20。这种方法简化了 Kestrel 的 HTTPS 配置,同时也减少了加密解密操作对应用服务器的影响。
灵活配置
反向代理服务器允许更灵活地配置多个 ASP.NET Core 应用程序,即使在同一台机器上运行不同版本的 .NET Core 应用程序也没有问题。此外,URL 重写、重定向等高级功能也可以更容易地实现16。
实现步骤
为了使 Kestrel 与反向代理服务器共同工作,您需要执行以下操作:
配置 Kestrel
确保 Kestrel 只监听本地地址(如 http://localhost:5000),而不是公开 IP 地址。可以通过修改 Program.cs 文件中的 WebApplication.CreateBuilder 方法来设置 Kestrel 的监听地址和端口。例如,在创建主机构建器时调用 ConfigureWebHostDefaults 方法,并通过 UseUrls 或者 Listen API 来指定监听地址2。
配置反向代理服务器
根据所使用的反向代理服务器类型(IIS, Nginx, Apache),按照官方文档配置反向代理规则。对于 Nginx,您可能需要编辑 nginx.conf 文件,定义一个 server 块,其中包含 location 指令,用于匹配路径并将请求转发给 Kestrel。同时,确保正确配置了 SSL/TLS 设置,如果适用的话14。
启用 Forwarded Headers 中间件
由于请求是通过反向代理转发的,原始客户端信息(如 IP 地址)会被代理服务器的 IP 地址覆盖。ASP.NET Core 提供了一个中间件 ForwardedHeadersMiddleware 来正确解析和信任通过反向代理转发的头信息(例如 X-Forwarded-For 和 X-Forwarded-Proto)。您需要在 Program.cs 中添加此中间件,并配置它信任的代理服务器17。
测试配置
确保一切配置无误之后,应该彻底测试整个部署以验证其正确性和安全性。检查是否可以从外部访问应用程序,并确认所有的安全措施都已生效。
监控和日志记录
最后,不要忘记设置适当的监控和日志记录机制,以便跟踪性能和安全问题。这对于及时发现并解决问题至关重要。
通过上述步骤,我们可以成功配置 Kestrel 与反向代理服务器一起工作,为我们的 ASP.NET Core 应用程序提供一个稳健且高效的托管环境。这种方式不仅可以提升应用程序的安全性和性能,还可以简化管理和维护过程。