关键在于分层设限、精准控制连接生命周期: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=150并可选queue=5 timeout=30s;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 秒,避免半上传连接长期滞留。
强制复用后端连接,减少通道占用
长事务本身不可避,但不应每次请求都新建后端连接——否则连接数随并发线性上涨,迅速占满通道:
- upstream 块中启用 keepalive 32(值按后端单实例连接池大小 × 1.2 设,常见 16–64);
- location 中必须配齐:proxy_http_version 1.1 + proxy_set_header Connection "",否则后端可能因收到 Connection: close 而主动断连,复用失效;
- 配合 least_conn 调度算法,让新请求优先落到当前活跃连接最少的后端,避免某节点被长事务“锁死”。
限制单节点连接上限,切断过载入口
即使后端能处理长事务,也不能让它无节制地接收连接。max_conns 是防止通道被单点占满的硬闸:
- 在 upstream server 行添加 max_conns=150(参考后端线程池上限设为 80%~90%,如 Tomcat maxThreads=200 → 设 160~180);
- 该限制作用于 Nginx 到后端的 TCP 连接数,一旦达到,Nginx 自动跳过该节点,转投其他可用后端;
- 若 Nginx ≥ 1.23.3,可追加 queue=5 timeout=30s,让超额请求排队等待而非直接拒绝,提升成功率。
收紧客户端侧空闲连接,释放 worker 槽位
长事务期间客户端可能静默等待,但 Nginx 不应为此长期保留连接槽位:
- keepalive_timeout 设为 30–45 秒(非默认 75 秒),比业务最长空闲等待略长即可;
- keepalive_requests 设为 2–5,长事务通常只建一次连、收一次响应,设过高反而延迟连接回收;
- 搭配 client_header_timeout 和 client_body_timeout(各 300 秒),防上传中途断续导致半开连接堆积。











