要让Nginx代理真正走Keep-Alive长连接,必须同时配置客户端→Nginx和Nginx→后端两段链路:前者调优keepalive_timeout(如120s)和keepalive_requests(如10000),后者需在upstream设keepalive、location中设proxy_http_version 1.1并proxy_set_header Connection "",且后端超时与连接池须匹配。

要让 Nginx 代理转发真正走 Keep-Alive 长连接,必须同时打通「客户端 → Nginx」和「Nginx → 后端」两段链路。只配一边,连接仍会频繁重建,起不到提升效率的作用。
客户端到 Nginx 的长连接配置
这部分默认已启用,但需合理调优才能稳定复用:
-
keepalive_timeout:设为 65–300 秒(例如
keepalive_timeout 120s;),避免空闲连接被过早关闭;设为 0 表示禁用 -
keepalive_requests:建议调高至 10000 或更高(例如
keepalive_requests 10000;),防止高频请求下连接反复新建销毁 - 无需额外加 header —— 只要客户端发的是 HTTP/1.1 请求且未带
Connection: close,Nginx 就自动复用连接
Nginx 到后端服务的长连接配置
这是最关键的环节,三步缺一不可:
- 在
upstream块中设置 keepalive 数值(例如keepalive 32;),表示每个 worker 进程最多缓存 32 个空闲连接 - 在
location中添加 proxy_http_version 1.1,强制使用支持长连接的协议版本 - 同时添加 proxy_set_header Connection ""(注意是空字符串),清除客户端传来的
Connection: close等干扰头
后端服务兼容性与参数对齐
Nginx 配得再全,后端不配合也会断连:
- 确认后端开启长连接(如 Tomcat 的
connectionTimeout、Node.js 的server.keepAliveTimeout) - Nginx 的
keepalive_timeout必须 ≤ 后端的空闲超时时间,否则连接会被后端先关闭 - upstream 的
keepalive × worker_processes应 ≤ 后端总连接池 × 0.7,避免连接池被打满
验证长连接是否生效
不能只看配置,要观察真实连接行为:
- 执行
ss -tnp | grep :端口,查看是否有稳定存在的ESTABLISHED连接(而非瞬时暴涨后归零) - 检查 Nginx error log,避免出现
upstream prematurely closed connection类报错 - 多个请求应复用同一 TCP 流,可通过抓包或日志中的 socket fd 对比确认











