必须同时配置客户端到Nginx和Nginx到upstream两条链路的长连接:前者由keepalive_timeout(建议30–60s)和keepalive_requests(建议1000–10000)控制;后者需在upstream块设keepalive N,并在location中配proxy_http_version 1.1和proxy_set_header Connection ""。

要让 Nginx 反向代理真正保持长连接,必须同时打通「客户端 → Nginx」和「Nginx → upstream 后端」两条链路。只配一边,连接依然会频繁断开,起不到优化效果。
客户端到 Nginx 的长连接控制
这部分由 Nginx 主动管理,无需客户端额外加 header(HTTP/1.1 默认开启 keep-alive):
- keepalive_timeout:空闲多久关闭连接,默认 75 秒。建议按业务场景设为 30–60 秒;设为 0 则禁用长连接
- keepalive_requests:单个连接最多处理多少次请求后关闭,默认 100。QPS 高时建议调大(如 1000~10000),避免连接刚复用几次就被强制释放
- 这两个参数只影响 client 到 Nginx 这一段,对 upstream 完全无效
Nginx 到 upstream 的长连接启用
这是最容易遗漏、也最关键的一环。Nginx 默认使用 HTTP/1.0 向后端发请求,即每次请求都新建 TCP 连接:
- 在 upstream 块内 添加
keepalive N(如keepalive 32),表示每个 worker 进程最多缓存 N 个空闲连接到该后端 - 在 location 块中 必须配对使用:
-
proxy_http_version 1.1;(强制走 HTTP/1.1) -
proxy_set_header Connection "";(清空客户端传来的 Connection 头,防止透传 close)
-
- 注意:
keepalive指令只能写在upstream块里,写在 server 或 location 中会报错
upstream keepalive 参数取值建议
合理设置才能兼顾复用率与资源占用:
- keepalive N:建议值 ≈(预估峰值并发 ÷ worker_processes)× 0.6~0.8。例如后端单实例稳定承载 200 并发、Nginx 有 4 个 worker,则设为 120~160
- keepalive_requests:默认 100 太保守,推荐 1000~10000。设太高可能让空闲连接被后端主动断开;设太低则频繁重连
-
keepalive_timeout(upstream 级别):不是全局指令,而是后端服务自身的超时设置。Nginx 不主动保活,只缓存空闲连接。务必确保 Nginx 的
keepalive连接池空闲时间
验证是否生效的实用方法
光看配置没用,得实测确认:
- 用
ss -tnp | grep :<backend_port> | wc -l</backend_port>观察 ESTABLISHED 连接数是否稳定在keepalive设定值附近(而非剧烈波动) - 压测时对比开启前后:连接建立耗时、P95 延迟、后端 TIME_WAIT 数量
- 检查后端响应头是否含
Connection: keep-alive;若返回close,说明后端未配合或中间设备干扰 - 若链路中有硬件防火墙、云负载均衡器(如阿里云 SLB),需确认其空闲超时 > Nginx 的
keepalive_timeout,否则会在 Nginx 前就断连



















