关键在于分层控制连接生命周期:proxy_connect_timeout设2–5秒、proxy_read_timeout设600–900秒、proxy_send_timeout设300秒;启用upstream keepalive并配proxy_http_version 1.1和connection "";用least_conn调度;max_conns限制单节点连接数;keepalive_timeout设30–45秒、keepalive_requests设2–5。

关键不是统一拉长所有超时,而是分层控制连接生命周期:建连、发请求、等响应、空闲保持,每个阶段设不同阈值,让慢请求不堵死通道。
区分三类代理超时,各管一段
后端长事务(如导出报表、批量写入)容易把连接“挂住”,必须靠分工明确的超时来拦截:
- proxy_connect_timeout:Nginx 连后端的建连超时,设 2–5 秒。太长会让失败判定延迟,请求在队列里空等;
- proxy_read_timeout:Nginx 等后端返回完整响应的最长时间,应略大于业务最长耗时(例如导出需 10 分钟,就设 600–900 秒),这是防“挂死”的核心闸口,超时直接返 504;
- proxy_send_timeout:Nginx 向后端发送请求体(如大文件上传中途卡顿)的超时,建议 300 秒,避免半上传连接长期滞留。
复用后端连接,减少新建开销
每次请求都新建 TCP 连接,会快速耗尽后端连接池。要让连接真正复用起来:
- upstream 块中启用 keepalive 16–64(参考后端单实例连接池上限 × 0.6–0.8,比如 Tomcat maxThreads=200 → 设 120–160);
- location 中必须配齐:proxy_http_version 1.1 和 proxy_set_header Connection ""(注意是清空 header,不是设为 close);
- 配合 least_conn 调度算法,新请求优先落到当前活跃连接最少的后端节点,防止单点被长事务锁死。
限制单节点连接数,防止通道占满
即使后端能处理长事务,也不能让它无节制接收连接:
- 在 upstream 的 server 行加 max_conns=150(按后端线程池上限的 80%~90% 设置,如 maxThreads=200 → 设 160~180);
- Nginx ≥ 1.23.3 可追加 queue=5 timeout=30s,让超额请求排队等待而非直接拒绝;
- 该限制作用于 Nginx 到后端的 TCP 连接数,达到上限后自动跳过该节点,转投其他可用后端。
收紧客户端侧空闲连接,及时释放 worker 槽位
长事务期间客户端可能静默等待,但 Nginx 不该为此长期保留连接资源:
- keepalive_timeout 设 30–45 秒(非默认 75 秒),比业务最长空闲等待略长即可;
- keepalive_requests 设 2–5(长事务通常只建一次连、收一次响应),设太高反而延迟回收;
- 注意:keepalive_timeout 必须 ≤ 后端 keepalive timeout − 10 秒(如后端设 60 秒,则 Nginx 设 50 秒),否则会保留已失效连接,引发连接枯竭。











