核心是分层设限、精准控制连接生命周期:①三类超时各管一段——proxy_connect_timeout(2–5秒)、proxy_send_timeout(≤300秒)、proxy_read_timeout(按业务略上浮);②强制复用后端连接,配置keepalive、http/1.1及空connection头,并配least_conn;③限制单节点max_conns=150及queue机制;④调优keepalive_timeout(30–45秒)和keepalive_requests(1000–5000)。

核心是分层设限、精准控制连接生命周期,不让慢请求长期占着通道。不是一味延长超时,而是让每个环节该断就断、该复用就复用。
区分三类代理超时,各管一段
proxy_connect_timeout 控制建连阶段:设 2–5 秒(内网建议 3 秒),建连太久说明后端已不可达,不应让请求继续排队空等;
proxy_send_timeout 控制发请求体阶段:设 300 秒以内,防大文件上传卡在中途导致连接滞留;
proxy_read_timeout 控制等响应阶段:按业务最长耗时略上浮设定,如报表导出需 10 分钟,就设 600–900 秒——这是防“挂死”的关键闸口,超时直接返回 504,不拖累其他请求。
强制复用后端连接,避免连接数线性暴涨
在 upstream 块中启用 keepalive,数值参考后端单实例连接池上限 × 0.6–0.8(如 Tomcat maxThreads=200,可设 keepalive 120–160);
location 中必须配齐:
• proxy_http_version 1.1
• proxy_set_header Connection ""(注意是空字符串,不是 close 或 keep-alive)
缺一不可,否则 Nginx 默认走 HTTP/1.0 短连接,复用失效;
配合 least_conn 调度策略,让新请求优先落到当前活跃连接最少的后端节点,防止某台被长事务锁死。
限制单节点连接上限,切断过载源头
在 upstream 的 server 行添加 max_conns=150(按后端线程池上限的 80%~90% 设置);
一旦该后端的 Nginx 到其 TCP 连接数达到上限,Nginx 自动跳过,转投其他可用节点;
若使用 Nginx ≥ 1.23.3,可追加 queue=5 timeout=30s,让超额请求排队等待而非直接拒绝,提升成功率;
这个限制是硬性闸门,比靠超时“被动回收”更可靠。
调优 keepalive 连接池自身寿命
keepalive_timeout 设 30–45 秒,且必须比后端空闲超时(如 Tomcat 的 connectionTimeout)小至少 10 秒,避免保留已失效连接;
keepalive_requests 设 1000–5000,高频轻量接口可到 10000,太小(如默认 100)会导致频繁重建连接,太大则可能复用到因中间设备回收或后端滚动更新而失效的连接;
这两个参数只在 upstream 块内生效,写在 http 或 location 里无效。











