Nginx upstream 长连接复用需三超时对齐:keepalive_timeout 比后端 idle timeout 小 5~10 秒,proxy_read_timeout 要远小于 client_*_timeout 且单独调低,connect_timeout 按网络环境设 1~5 秒;同时必须配置 upstream keepalive、proxy_http_version 1.1 和 proxy_set_header Connection '',并确保后端返回 Connection: keep-alive。
要让 Nginx upstream 真正复用长连接、减少建链开销,不能只调一个超时值。关键在于 keepalive_timeout、后端 idle timeout、proxy_read_timeout 三者对齐,同时确保连接池有足够空闲连接可复用。
这个参数控制 Nginx 在连接池中保留空闲连接的时间。设得太大,连接可能被后端先关闭,Nginx 下次复用时才发现失效,触发重连;设得太小,连接还没来得及复用就被回收。
connectionTimeout=60s → Nginx keepalive_timeout 建议设 30~45swait_timeout=28800 → keepalive_timeout 设 60s 更稳妥它控制 Nginx 从后端读取响应头或数据的等待间隔,和连接空闲无关。若该值过大(如默认 60s),一次慢响应就会卡住整个连接,导致后续请求排队、连接池“假性枯竭”。
client_header_timeout 和 client_body_timeout,防止客户端已断开而 Nginx 还在等后端当 upstream 连接池为空或不足时,Nginx 需新建 TCP 连接。如果网络延迟高或后端偶发卡顿,connect_timeout 过长会让大量请求堆积在“建连中”状态。
光调超时没用。以下三项必须同时满足,keepalive 才真正生效:
upstream { keepalive 32; } —— 放在 upstream 块内,按 worker 数与后端能力合理设值proxy_http_version 1.1; 和 proxy_set_header Connection ''; —— 放在 location 中,强制走 HTTP/1.1 并清空干扰头Connection: keep-alive —— 检查日志或 curl -v 验证,排除中间设备(如 WAF、LB)静默改写