nginx配置cdn回源长连接需启用upstream keepalive连接池,配合proxy_http_version 1.1和清除connection头,并合理设置keepalive_timeout与源站匹配,同时确保源站支持长连接。

通过 Nginx 配置 CDN 回源长连接,核心是复用后端源站与 Nginx 之间的 TCP 连接,避免每次请求都经历三次握手和慢启动,从而显著降低回源延迟、提升吞吐量。关键在于正确启用并调优 HTTP/1.1 的 keepalive 机制,同时确保源站支持并合理响应长连接。
启用 upstream keepalive 连接池
Nginx 默认回源使用短连接(HTTP/1.0 或无 Connection: keep-alive),需显式配置连接池复用连接:
- 在
upstream块中添加keepalive N;(如keepalive 32;),表示每个 worker 进程最多缓存 N 个空闲长连接 - 必须配合
proxy_http_version 1.1;和proxy_set_header Connection '';,否则 Nginx 会主动关闭连接或发送Connection: close - 建议同时设置
proxy_set_header Host $host;和proxy_set_header X-Real-IP $remote_addr;,保持源站日志和虚拟主机识别准确
控制连接生命周期与超时
长连接不是永久有效,需合理设置空闲超时,避免源站过早断连或 Nginx 持有失效连接:
-
keepalive_timeout(单位:秒)定义空闲连接在 Nginx 连接池中的最大存活时间,建议设为略小于源站的keepalive_timeout(如源站为 60s,Nginx 设 55s) - 避免设置过大的
keepalive_requests(单连接最大请求数),默认 100 已足够;过高可能加剧源站连接压力或内存占用 - 可选:添加
proxy_next_upstream error timeout http_502;提升容错性,当长连接异常时自动重试其他节点
验证长连接是否生效
仅靠配置不等于成功,需实际观测确认:
- 用
curl -v http://your-cdn-domain/path查看响应头,确认回源请求中Connection: keep-alive存在,且无Connection: close - 在源站 Nginx 日志中开启
$connection_requests变量(如log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $connection_requests';),观察同一连接处理请求数是否 >1 - 用
ss -tnp | grep :源站端口查看 ESTAB 状态连接数是否稳定、复用,而非频繁新建/关闭
注意源站兼容性与资源限制
CDN 回源长连接效果依赖源站配合:
- 源站 Web 服务器(如 Nginx/Apache)必须启用 keepalive,并设置合理
keepalive_timeout和max_keepalive_requests - 若源站为云服务(如阿里云 OSS、腾讯云 COS),需确认其回源接口是否支持长连接;部分对象存储默认关闭,需在控制台或 API 中显式开启
- 避免 upstream 中混用 HTTP/1.0 和 HTTP/1.1 源站,会导致 keepalive 失效;统一使用域名或 IP + 显式协议版本











