核心是分清前端与后端两段连接并协同配置:前端用keepalive_timeout(建议15–30秒)和keepalive_requests(默认100,高并发可调至500–1000)控制客户端连接;后端需在upstream中配置keepalive、proxy_http_version 1.1及proxy_set_header connection "",并确认后端支持长连接。

调整 Nginx 长连接保持策略,核心是分清“前端”和“后端”两段连接,并分别配置对应参数。只调一端,效果会打折扣;两端协同,才能真正减少 TCP 握手开销。
前端连接:用 keepalive_timeout 控制客户端空闲等待时间
这个参数管的是浏览器、App 或 CDN 到 Nginx 这一段。它定义请求结束后,连接空闲多久没新请求,Nginx 就主动关掉它。
- 设太短(如 2 秒):用户滚动页面、加载图片时连接就断了,反而触发更多握手
- 设太长(如 300 秒):大量空闲连接占着文件描述符,可能报 Too many open files
- 常规网页服务建议 15–30 秒;API 网关或 App 后端可设 5–15 秒;内网低频系统可放宽到 45–60 秒
前端复用保障:配合 keepalive_requests 防止单连接霸占太久
即使连接没超时,也不能让它无限处理请求。这个参数限制单个连接最多服务多少次请求后必须关闭。
- 默认值 100 适合大多数场景
- CDN 边缘节点等高并发静态服务,可提到 500–1000
- 若后端偶发卡顿,建议设为 500 左右,加快异常连接释放
- 注意:该值触发时立即断连,不等 keepalive_timeout
后端连接:用 upstream keepalive 实现真正的连接池复用
这才是降低后端建连开销的关键。光调前端参数,对后端握手完全没影响。
- 在 upstream 块里加 keepalive 32(数值建议为单 worker 并发连接数的 1–2 倍)
- 必须启用 HTTP/1.1:proxy_http_version 1.1
- 清除干扰头:proxy_set_header Connection ''(避免透传 close)
- 确认后端服务支持 keep-alive(如 Spring Boot 默认开启,Node.js 需显式设 server.keepAliveTimeout)
别漏掉链路两端的协同检查
前端或后端任意一环禁用 keep-alive,整个优化就失效。
- 查看响应头是否有 Connection: keep-alive,确认前端机制生效
- 检查上游是否被负载均衡器或 CDN 截断——比如 AWS ALB 虽默认开启,但超时可能比 Nginx 更短
- 用 netstat -an | grep :80 | grep ESTAB | wc -l 观察实际 ESTABLISHED 连接数变化趋势











