proxy_send_timeout专管Nginx向后端发送已接收请求体的超时,仅在非长连接下生效,控制“发完body”过程;不控制建连、响应等待或客户端上传,需据文件大小与后端速率估算并同步调大client_max_body_size和client_body_timeout。

proxy_send_timeout 控制的是 Nginx 向后端发送请求体(比如大文件、长 Base64、批量 JSON)时的“耐心值”——它不关心客户端上传多慢,也不管后端处理多久,只盯住“把已收好的 body 一块块发给后端”这个过程是否卡住。
它真正管什么、不管什么
这个超时仅在非长连接(每次新建连接)下生效,且只作用于发送请求体阶段:
- 管:Nginx 已收完客户端 body,正往 upstream socket 写数据,但某次 write() 后迟迟没收到 ACK 或读取反馈,就断连
- 不管:TCP 连接建立(那是 proxy_connect_timeout)、后端返回响应头/体(那是 proxy_read_timeout)、客户端上传时间(那是 client_body_timeout)、整个请求周期
怎么算出合理值
不能填 0 或拍脑袋写 300。要结合最大请求体大小和后端稳定接收速率估算:
- 例如上限 2GB 文件,后端平均接收速率为 5MB/s → 理论传输约 400 秒 → 建议设为 600 秒(10 分钟),留出网络抖动、WAF 检测、磁盘 I/O 延迟余量
- 普通 API 接口无大 body:保持默认 60 秒即可
- 流式上传或导出接口(如日志分块、Excel 流式生成):建议 300 秒起步,避免 GC 暂停或数据库分页拉取卡顿触发断连
必须同步调的三项配置
单改 proxy_send_timeout 几乎无效,以下三项必须一起配齐:
- client_max_body_size:确保 Nginx 允许接收那么大的 body,如 2000m
- client_body_timeout:客户端上传 body 的间隔超时,建议 ≥ proxy_send_timeout(如都设 600)
- 后端自身限制:Spring Boot 的 spring.servlet.multipart.max-file-size、Gunicorn 的 --limit-request-body、Node.js 的 body-parser 都要放开,且数值大于 Nginx 设置
推荐配置位置与写法
放在 location 块里最安全,精准控制业务路径,避免影响其他接口:
location /api/upload {
proxy_pass http://backend;
proxy_send_timeout 600;
client_max_body_size 2000m;
client_body_timeout 600;
}
若后端支持 HTTP/1.1 长连接,该值可能不触发(复用已有连接);如需更直传效果,可加 proxy_buffering off; 减少中间缓存环节。


















