生产环境必须显式配置kestrel:listenanyip(8080)确保跨主机通信,maxconcurrentconnections与maxconcurrentupgradedconnections需按压测设限,usehttps必须显式传密码,keepalivetimeout等超时值应调优,且须同步校准系统级参数(如somaxconn、文件描述符)。

生产环境不显式配置 Kestrel,等于裸奔——连接数卡在几百、HTTPS 启动失败、跨主机调用直接拒绝,都是默认配置惹的祸。
ListenAnyIP(8080) 为什么比 localhost:5000 更可靠
默认 localhost:5000 只绑定 IPv4 和 IPv6 回环地址,容器内访问宿主、K8s Pod 间通信、Linux 下 curl 本机 IP 全部失败。而 ListenAnyIP(8080) 显式监听 0.0.0.0:8080(IPv4)和 [::]:8080(IPv6),兼容性更强。
- Windows 上若启用了 IPv6,
localhost实际走的是[::1],但某些客户端(如旧版 Postman)可能只发 IPv4 包,导致 503 - Docker 容器默认无法访问 host.docker.internal 的
localhost,必须监听0.0.0.0 -
Listen(IPAddress.Any, 8080)和ListenAnyIP(8080)功能等价,后者更简洁;别用ListenLocalhost生产部署 - Linux 上还要确认
net.ipv4.ip_forward=1已开,否则即使监听了也收不到跨网段包
MaxConcurrentConnections 和 MaxConcurrentUpgradedConnections 必须都设
这两个值不设就是“不限”,但系统级限制(文件描述符、somaxconn)会先一步掐断连接,错误日志里却只显示 ConnectionRefused 或静默丢包。
-
MaxConcurrentConnections控制普通 HTTP/HTTPS 连接总数,建议按压测结果设为10_000(非拍脑袋) -
MaxConcurrentUpgradedConnections专管 WebSocket、HTTP/2 Upgrade 后连接,SignalR、SSE 场景下它独立计数——不配这个,客户端反复重连却始终101 Switching Protocols失败 - Windows 上 IIS 的
applicationPool.queueLength(默认 1000)也在 Kestrel 前拦截请求,得同步调大 - Linux 上检查
cat /proc/sys/net/core/somaxconn,若为 128,队列积压超限后新 SYN 包会被内核直接丢弃,无日志
UseHttps(cert) 报错 “Authentication failed because the remote party has closed the transport stream”
这不是证书格式问题,而是私钥没加载成功——X509Certificate2 构造时密码参数不可省略,空密码也得传 string.Empty。
-
new X509Certificate2("cert.pfx")❌:私钥加载失败,握手阶段 TLS 层直接断开 -
new X509Certificate2("cert.pfx", "password123")✅:显式传密码,哪怕为空字符串 - Windows 上用
certutil -store My查看证书指纹,netsh http add sslcert绑定时certhash必须是纯 40 字符 SHA1(无空格、无0x前缀) - Linux/macOS 不走 HTTP.SYS,要确保
.pfx文件权限为600,且运行用户有读取权;OpenSSL 会静默跳过私钥不可读的证书
KeepAliveTimeout 和 RequestHeadersTimeout 不调就容易出长尾延迟
默认 KeepAliveTimeout = 2 分钟,但公网链路质量差时,客户端异常断连后连接空挂,Kestrel 不知道该不该关,拖慢整个连接池回收。
-
KeepAliveTimeout = TimeSpan.FromSeconds(90)更稳妥,避免慢客户端占着连接不放 -
RequestHeadersTimeout = TimeSpan.FromSeconds(15)防止恶意客户端只发部分 headers 就停住,耗尽连接队列 - 这些超时在调试器附加时会被忽略,所以本地开发压测看不出问题,上线才爆发
- 别碰
ThreadPool.SetMinThreads:Kestrel 用 IOCP/epoll 异步收包,线程池只跑回调,盲目调大会吃内存、增上下文切换
最常被跳过的其实是系统层配合——比如 Linux 上改了 somaxconn 却忘了同步调大 fs.file-max,或 Windows 上装了证书却没给 NETWORK SERVICE 授予私钥 ACL 权限。配置写对只是第一步,环境对齐才是上线前最后一道坎。











