keepalive 指令在 upstream 块中唯一作用是为每个 worker 进程对单台后端服务器维护最多 n 个空闲 tcp/tls 连接;需配合 proxy_http_version 1.1 和 proxy_set_header connection "" 才生效,否则仍走短连接。

keepalive 指令在 upstream 块中唯一且不可替代的作用是:为每个 worker 进程建立并维护一个到**单台后端服务器**的空闲连接池,用于复用 TCP(含 TLS)连接,从而避免每请求新建连接带来的握手开销、TIME_WAIT 积压和延迟上升。
它不是开关,而是连接池容量声明
keepalive N 表示「每个 worker 进程对这台后端地址最多缓存 N 个空闲长连接」。例如:
- 4 个 worker + 1 台后端 + keepalive 32 → 最多 128 个空闲连接待复用
- 4 个 worker + 2 台后端 + keepalive 32 → 理论最多 256 个空闲连接(按后端实例分别计)
该值需匹配后端实际承载能力:Tomcat 默认 maxConnections=200,建议设为 32~48;Node.js/Go 类服务可从 16~32 起步。设得过大而后端连接池过小(如 Go 的 MaxIdleConnsPerHost=2),Nginx 会反复建连失败。
它不生效的典型场景
仅写 keepalive N 完全无效——因为 Nginx 默认以 HTTP/1.0 向后端发起请求,而 HTTP/1.0 不支持连接复用。必须同步满足以下三点:
- upstream 块内声明 keepalive N
- location 中设置 proxy_http_version 1.1
- location 中设置 proxy_set_header Connection ""(空字符串,非 "keep-alive")
缺一不可。任意一项缺失,Nginx 仍走短连接逻辑,后端 TIME_WAIT 暴涨,性能无改善。
它不控制超时与请求数,除非版本足够新
keepalive_timeout 和 keepalive_requests 对 upstream 长连接生效,仅从 Nginx 1.15.3+ 开始支持。老版本(如 1.12)即使配置也无效。
- keepalive_timeout 20s:空闲连接在池中最多保留 20 秒,建议比后端空闲超时(如 Tomcat 的 connectionTimeout)小 5~10 秒
- keepalive_requests 500:单个连接最多转发 500 次请求后主动关闭,防状态泄漏;默认 100 过于保守,API 场景推荐 500~1000
它天然兼容 HTTPS 和 HTTP/2
不存在 proxy_ssl_keepalive 这类指令。只要后端是基于 TLS 的 HTTP/1.1 或 HTTP/2 服务,upstream 的 keepalive 就自动复用底层 TCP+TLS 连接或 HTTP/2 多路复用连接。HTTPS 场景还可额外启用 ssl_session_reuse on(1.19.4+)复用 TLS 会话票据,跳过完整握手。











