开启 proxy_socket_keepalive 能显著提升 CDN 回源连接复用效率,减少 TCP 握手与 TIME_WAIT 堆积,增强回源稳定性与吞吐能力;需配合 upstream keepalive、HTTP/1.1 及 Connection 头清空使用。

开启 proxy_socket_keepalive 能显著改善 Nginx 作为 CDN 回源代理时的连接复用效率,减少 TCP 握手与 TIME_WAIT 堆积,从而提升回源链路的稳定性与吞吐能力。
为什么 CDN 回源特别需要 keepalive
CDN 节点频繁向源站发起小而密的请求(如图片、JS、CSS),若每次回源都新建 TCP 连接,会带来明显开销:
- TCP 三次握手 + TLS 握手(若启用 HTTPS)增加延迟
- 大量短连接导致源站出现大量
TIME_WAIT状态,可能耗尽本地端口或连接跟踪表 - 内核连接调度压力上升,尤其在高并发回源场景下易触发连接拒绝或超时
启用 socket 层 keepalive 后,Nginx 与源站之间可复用底层 TCP 连接,避免反复建连,是稳定回源的关键基础配置。
proxy_socket_keepalive 的正确配置方式
该指令控制 Nginx 与 upstream(即源站)建立的 socket 是否启用 TCP keepalive 机制,需配合 proxy_http_version 1.1 和 proxy_set_header Connection '' 使用:
-
proxy_socket_keepalive on;:启用系统默认 keepalive 参数(Linux 默认为 7200s 探测间隔、9 次失败后断连) -
proxy_socket_keepalive off;:禁用(不推荐) -
proxy_socket_keepalive on [idle] [interval] [probes];:自定义参数(例如on 60s 5s 3;表示空闲 60 秒后开始探测,每 5 秒发一次,连续 3 次无响应则关闭连接)
注意:该指令作用于 upstream 连接池中的每个 socket,不是 HTTP 协议层的 Keep-Alive 头。它解决的是“连接是否被内核悄悄断掉”的问题,而非客户端到 Nginx 的长连接。
搭配 upstream keepalive 提升连接复用率
proxy_socket_keepalive 解决 socket 存活问题,但要真正复用连接,还需配置 upstream 的连接池:
- 在
upstream块中添加keepalive 32;(数字表示保留在缓存中的空闲连接数) - 必须配合
proxy_http_version 1.1;和proxy_set_header Connection '';,否则后端可能主动关闭连接 - 建议将
keepalive_requests设为较大值(如1000),避免单连接过早关闭
这样,Nginx 就能在多个回源请求间复用同一 TCP 连接,结合 socket keepalive 防止中间设备(如防火墙、LB)静默中断空闲连接。
验证与常见误区
可通过以下方式确认配置生效:
- 使用
ss -tnp | grep :源站端口查看 ESTABLISHED 连接是否长时间存在且复用 - 抓包观察回源方向是否出现重复的 SYN 包(未生效时较多)
- 检查 Nginx error log 中是否有
connect() failed (111: Connection refused)或connect() failed (110: Connection timed out)——这些常因连接池枯竭或中间链路断连引发,开启 keepalive 后应明显减少
常见误区包括:仅开启 proxy_set_header Connection keep-alive(这是给后端的 HTTP 头,不影响 socket 层)、忽略 upstream keepalive 导致连接无法复用、在非 HTTP/1.1 场景下误配等。










