需显式启用upstream keepalive并设16–64合理值,配合least_conn、http/1.1协议、connection头清理及三端超时对齐,才能真正提升长连接复用率。

least_conn 和 keepalive 需配合使用才能真正提升长连接复用率,单开任一配置都容易失效。核心在于让 Nginx 的连接池“有得用、用得上、不浪费”。
必须显式启用 upstream keepalive 并设合理值
keepalive 不是默认开启的,必须在 upstream 块中明确定义:
- 每个 worker 进程独立维护连接池,keepalive 32 表示该 worker 最多缓存 32 个空闲长连接(不是全局总数)
- 推荐值为 16–64,常见设为 32 或 48;可按后端平均并发连接数 ×1.2~1.5 估算
- 值过小(如 2 或 4)会导致连接池太浅,仍频繁建连;过大(如 256)易占满后端连接上限,引发拒绝或超时
协议与头信息必须严格匹配
即使 upstream 启用了 keepalive,若协议或 header 不对,Nginx 仍会主动断开复用:
- proxy_http_version 必须设为 1.1(HTTP/1.1 是 keepalive 的协议前提)
- proxy_set_header Connection ''——清空该 header,防止后端返回 Connection: close 导致连接被提前关闭
- 不要手动设置 Connection: keep-alive,Nginx 会自动添加,冗余设置反而干扰逻辑
- 后端需支持 HTTP/1.1 长连接(如 Tomcat 默认开启,Node.js http.Server 也默认支持)
least_conn 要和 keepalive 协同生效
least_conn 本身只看活跃连接数,不保证复用;它需要 keepalive 提供可用空闲连接:
- 轮询算法下,请求顺序打向各节点,连接池较易被持续命中;而 least_conn 动态切换目标,若 keepalive 值太小,各节点池子都很快耗尽,复用率反而下降
- 搭配使用时,建议同时启用 max_fails=2 fail_timeout=15s,避免故障节点持续接收新连接
- 禁用 ip_hash——它会把同一客户端所有长连接绑定到固定后端,加剧连接分布不均
超时参数要三端对齐
连接复用依赖“空闲但可用”,超时设置不合理会导致连接过早释放或长期僵死:
- proxy_connect_timeout 控制建连时间,建议 1–3 秒
- proxy_send_timeout 和 proxy_read_timeout 应略大于后端典型处理时长(如 API 平均响应 8s,可设为 15–25s)
- 后端自身的 keepAliveTimeout(如 Tomcat 的 keepAliveTimeout)必须 > Nginx 的 proxy_read_timeout,否则后端先关连接,Nginx 复用失败











