Windows Server 2016下Kestrel托管gRPC服务及IIS反向代理配置方法
Windows Server 2016 部署 gRPC 服务(Kestrel + IIS 反向代理方案)
一、Kestrel 侧核心配置(规避端口冲突)
Windows Server 2016 不支持 IIS 直接托管 gRPC,但 Kestrel 原生支持 HTTP/2,可独立部署。关键是限制 Kestrel 仅监听本地回环地址的指定端口,避免与现有 IIS 站点冲突:
1. 代码层面配置(Program.cs)
var builder = WebApplication.CreateBuilder(args); // 注册gRPC服务 builder.Services.AddGrpc(); // 配置Kestrel监听localhost指定端口,强制启用HTTP/2 builder.WebHost.ConfigureKestrel(options => { options.ListenLocalhost(5001, listenOptions => { listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2; }); }); var app = builder.Build(); // 映射自定义gRPC服务 app.MapGrpcService<YourGrpcServiceImpl>(); app.Run();
2. 配置文件层面(appsettings.json)
若需更灵活的配置,可通过配置文件指定端点:
{ "Kestrel": { "Endpoints": { "GrpcLocal": { "Url": "https://localhost:5001", "Protocols": "Http2" } } } }
注:Kestrel 侧可暂时使用自签证书,后续通过 IIS 反向代理复用正式 SSL 证书,无需在 Kestrel 配置正式证书。
二、IIS 反向代理 + 复用 SSL 证书实现步骤
利用 IIS 做反向代理,既能复用已有的自动续期 SSL 证书,又能对外提供标准 443 端口访问,同时隔离 Kestrel 服务:
1. 安装必要 IIS 模块
- 安装 Application Request Routing (ARR) 和 URL Rewrite 模块(可通过 IIS 管理器的「Web 平台安装程序」搜索安装)。
- 启用 ARR 代理:打开 IIS 管理器 → 服务器节点 →「Application Request Routing Cache」→ 右侧「Server Proxy Settings」→ 勾选「Enable proxy」并保存。
2. 配置 IIS 站点
- 使用现有站点或新建站点,绑定已配置自动续期的 SSL 证书。
- 禁用站点的静态内容等无关功能,仅保留反向代理作用。
3. 创建 URL 重写规则
在 IIS 站点的「URL Rewrite」模块中添加反向代理规则:
- 点击「Add Rule(s)」→ 选择「Reverse Proxy」。
- 在目标服务器地址栏输入
http://localhost:5001(对应 Kestrel 监听端口)。 - 勾选「Enable SSL offloading」(将 SSL 解密放在 IIS 侧,Kestrel 无需处理 SSL)。
- 生成规则后,编辑规则的「Server Variables」,添加两个变量:
HTTP_X_FORWARDED_PROTO,值设为httpsHTTP_X_FORWARDED_FOR,值设为{REMOTE_ADDR}
- 调整规则的「Conditions」,添加条件:
{REQUEST_URI}匹配^/your-grpc-service-path/.*(替换为你的 gRPC 服务路径,比如默认的/grpc.health.v1.Health/),确保仅 gRPC 请求被转发。
4. 优化 IIS 应用池设置
- 将应用池的 .NET CLR 版本设为「无托管代码」(站点仅做反向代理,无需 .NET 运行时)。
- 确保应用池权限足够访问本地 Kestrel 服务(默认权限即可)。
三、生产环境实践经验
- 服务托管:将 gRPC 服务注册为 Windows 服务,避免依赖控制台窗口。可使用
sc create命令或 NSSM 工具(Non-Sucking Service Manager)创建服务,设置启动类型为「自动」。 - 日志与监控:配置 Kestrel 日志输出到本地文件(如用 Serilog),通过 Windows 性能计数器监控 CPU、内存占用;IIS 侧启用请求日志,便于排查反向代理问题。
- SSL 续期:若使用自动续期证书(如 Let's Encrypt 的 Win-acme 工具),续期后 IIS 会自动加载新证书,无需重启反向代理站点或 Kestrel 服务。
- 端口安全:Kestrel 仅监听 localhost,无需在 Windows 防火墙开放 5001 端口;仅需开放 IIS 站点绑定的 443 端口对外访问。
- 性能优化:在 ARR 设置中禁用「Response Buffering」(gRPC 为流式传输,缓冲会导致延迟或错误);调整 IIS 应用池的队列长度和进程数,适配并发请求量。
内容的提问来源于stack exchange,提问作者Exquirentibus
相关产品推荐
相关产品推荐

