关键在于用upstream的keepalive指令配置连接池,配合proxy_http_version 1.1、connection头清空、socket keepalive及源站协同,而非下游keepalive_timeout。

要让 CDN 边缘节点与源站之间复用 TCP 连接、减少握手开销、提升回源效率,关键不是简单设一个 keepalive_timeout,而是配合连接池、上游健康探测和协议协同来构建稳定高速的链路复用机制。
理解 keepalive_timeout 的真实作用范围
该指令只控制 Nginx 工作进程与**下游客户端**(如浏览器或移动 App)之间的空闲连接保持时长,对**上游回源连接**(即边缘节点到源站)不生效。很多人误以为设了 keepalive_timeout 65; 就能优化回源,其实它影响的是用户访问边缘节点这“最后一跳”的连接复用。
真正决定边缘→源站链路复用效果的是:upstream 模块中的 keepalive 指令,它管理的是 Nginx 与后端服务器之间的连接池。
配置上游连接池实现高效回源复用
在 upstream 块中启用并调优连接池,是提升回源性能的核心操作:
- 使用
keepalive N;(N 通常设为 32–256)声明每个 worker 进程可缓存的空闲连接数;数值过低会导致频繁建连,过高则可能耗尽源站连接资源 - 必须搭配
proxy_http_version 1.1;和proxy_set_header Connection '';,否则 HTTP/1.0 或带Connection: close的请求会主动断开连接,使 keepalive 失效 - 建议开启
proxy_socket_keepalive on;(Nginx 1.15.3+),让底层 socket 主动发送 TCP keepalive 探针,及时发现源站侧异常断连 - 若源站支持 HTTP/2,可改用
proxy_http_version 2.0;并确保 TLS 配置兼容,进一步降低连接建立与多路复用延迟
配合源站与网络层协同优化
单靠 Nginx 配置无法解决所有链路问题,需上下游协同:
- 源站需设置足够长的
keepalive_timeout(如 75s),且不限制最大 keepalive 请求次数(如 Nginx 的keepalive_requests设为 0 或较大值) - 中间网络设备(如云负载均衡器、防火墙)常默认 60s 清理空闲 TCP 连接,需将其超时调至 ≥80s,并确认是否启用 TCP RST 主动中断;若无法调整,可在 Nginx 中用
proxy_next_upstream error timeout http_502;实现自动重试 - 对高并发回源场景,建议启用
upstream_hash $remote_addr consistent;或基于请求路径做一致性哈希,避免连接池在多个源站实例间震荡分配
验证与监控要点
配置生效后,不能只看 Nginx 日志,需从三个层面确认复用是否落地:
- 查 Nginx 状态页或
stub_status:观察Active connections中的Writing数量是否稳定,突增往往意味着连接频繁重建 - 用
ss -tnp | grep :源站端口在边缘节点上实时查看 ESTABLISHED 连接数及复用状态,结合netstat -s | grep "segments retransmited"判断丢包干扰 - 在源站侧抓包或查看 access log 中的
$http_connection和$sent_http_connection,确认请求头中是否持续出现keep-alive,响应头是否含Keep-Alive: timeout=75, max=1000











