proxy_read_timeout核心是精准断连而非单纯延时,它仅控制响应头返回后读取响应体的空闲超时,需按业务路径分设(如api 30–60s、导出600–900s、健康检查2–5s),并强制配套upstream keepalive、proxy_http_version 1.1、proxy_set_header connection ""及max_conns等调度限流策略。

关键不是一味延长 proxy_read_timeout,而是让它精准匹配业务响应特征,同时配合连接复用与调度策略,避免慢请求拖垮整个通道。
明确 proxy_read_timeout 的真实作用
它控制的是 Nginx 从收到后端响应头开始,到收完整个响应体的总耗时上限。不是“整个请求处理时间”,也不包含建连和发请求阶段——那由 proxy_connect_timeout 和 proxy_send_timeout 分别负责。
- 普通 API 接口(如 JSON 返回)建议设为 30–60 秒
- 报表导出、批量导入等长事务,可单独在对应
location中设为 600–900 秒 - 健康检查接口(如
/healthz)建议压到 2–5 秒,加快故障识别 - 切忌全局设成 1800 秒甚至更大——这会让一个卡死的后端连接长期占位,引发雪崩
必须搭配 upstream 连接复用
读取超时再合理,若每次请求都新建后端连接,高并发下照样迅速耗尽连接资源:
- 在
upstream块中启用keepalive 32;(值参考后端单实例连接池 × 0.7~0.8) - 在
location中必须配齐:proxy_http_version 1.1;和proxy_set_header Connection ""; - 缺少任一,Nginx 仍会退化为 HTTP/1.0 短连接,
keepalive形同虚设
结合调度与限流切断过载源头
即使后端能处理长请求,也不能让它无节制接收新连接:
- 在
upstream server行添加max_conns=150;(按后端线程池上限的 80% 设) - Nginx ≥ 1.23.3 时,可加
queue=5 timeout=30s,让超额请求排队而非直接失败 - 配合
least_conn调度算法,防止某台后端被长事务“锁死”
验证是否生效的关键点
改完配置后不验证,等于没配:
- 执行
nginx -t检查语法,确认无误后再nginx -s reload - 观察 error 日志:出现
upstream timed out (110: Connection timed out)说明超时已触发 - 用
ss -tnp | grep :80查看 ESTABLISHED 连接数趋势,确认未持续堆积











