proxy_send_timeout 控制 nginx 向后端发送请求体时等待确认的超时时间,非长连接下生效,超时断连返回 502/504;需结合传输速率合理设置,并同步调整 client_body_timeout、client_max_body_size 及后端限制。

proxy_send_timeout 不是控制“后端处理多慢”,而是管 Nginx 向后端发请求体(比如大文件、长 JSON、批量数据)时,**等后端确认接收的耐心程度**。它只在非长连接下生效,一旦某段数据发出后,在设定时间内没收到 ACK 或读取反馈,Nginx 就断开连接,返回 502 或 504。
它真正起作用的场景
这个参数常被误用于解决“后端响应慢”,其实它只盯住一个动作:Nginx 把已收完的请求体,分块发给后端的过程是否卡住。典型触发点包括:
- 客户端上传大文件,但网络抖动或带宽低,导致 Nginx 分批转发时,后端迟迟不确认收完某一块
- 后端应用未及时调用 read() 或 getInputStream()(如 Spring Boot 没配流式接收,Java 应用阻塞在鉴权逻辑)
- 中间设备(WAF、防火墙)对请求体做深度检测或缓冲,造成传输延迟
- 后端 socket 缓冲区满、磁盘 I/O 阻塞、GC 暂停,导致接收节奏不稳
怎么设才合理
不能拍脑袋填 300 或 0,得结合实际传输能力估算:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 若最大上传 2GB,后端平均接收速率为 5MB/s → 理论传输约 400 秒 → proxy_send_timeout 至少设为 600 秒(10 分钟),留出网络波动和处理余量
- 普通 API 接口无大 body:保持默认 60 秒即可
- 流式上传或导出接口(如 /api/upload、/export/):建议设为 300~600 秒,并放在 location 块中单独配置
- 严禁设为 0:会导致 worker 连接长期占用,积压后引发资源耗尽
必须同步调的三项配置
单改 proxy_send_timeout 几乎无效,这三项必须一并检查和调整:
- client_body_timeout:客户端上传请求体的间隔超时,建议 ≥ proxy_send_timeout(如都设 300)
- client_max_body_size:确保 Nginx 允许接收那么大的 body(如 2000m),否则还没转发就直接 413
- 后端自身限制:Spring Boot 的 spring.servlet.multipart.max-file-size、Gunicorn 的 --limit-request-body、Node.js 的 body-parser 等,都要放开且大于 Nginx 设置
验证是否真生效的小技巧
改完别只看配置不报错,要实测行为:
- 用
curl -v观察响应头,确认是Transfer-Encoding: chunked或有明确Content-Length,排除被缓存截断 - 在后端加日志,记录每次
read()和flush()的时间戳,再比对 Nginx error.log 中 “upstream prematurely closed connection” 的发生时刻 - 临时让后端某次接收延迟超过当前值(如 sleep(65)),复现超时再调参验证










