proxy_send_timeout控制Nginx向上游服务器发送请求体(如大文件)的超时,非客户端上传或后端响应;默认60秒,超时断连致502/504,需据文件大小与后端接收速率合理设置。
proxy_send_timeout 控制的是 Nginx 向后端服务器转发请求体(比如大文件数据)时的等待上限。它不是管客户端上传,也不是管后端返回,而是管“Nginx 把收到的文件数据一块块发给后端”这个过程——一旦某一段数据发出后,在设定时间内没得到后端的 ACK 确认或接收反馈,Nginx 就会主动断开与后端的连接,导致上传中断、报 502 或 504 错误。
为什么大文件上传容易触发 proxy_send_timeout?
上传过程中,Nginx 默认以缓冲方式接收客户端请求体,再分批次转发给后端。如果后端处理慢(如鉴权耗时、磁盘 I/O 阻塞、未及时读取 socket)、网络延迟高,或后端应用(如 Java Spring、Python Gunicorn)本身接收速度不稳,就可能出现“Nginx 已发数据,但后端迟迟没确认收完”的情况。此时 proxy_send_timeout 被击穿,连接被切断。
- 典型日志线索:
upstream prematurely closed connection while reading upstream或Broken pipe - 和
proxy_read_timeout容易混淆:后者是等后端“返回响应”,前者是等后端“接收请求体” - 默认值仅 60 秒,上传几百 MB 文件时极易超时(尤其在低带宽或高延迟链路中)
如何合理设置 proxy_send_timeout?
建议根据预期最大文件体积 + 后端平均接收吞吐量粗略估算。例如:上传上限 2GB,后端稳定接收速率为 5MB/s,则理论传输时间约 400 秒,timeout 至少设为 600 秒(10 分钟)留出余量。
- 写在
location /upload块内最精准,避免影响其他接口 - 配合
proxy_buffering off可减少中间缓存环节,让数据更直接流向后端(适合流式上传场景) - 若后端使用 fastcgi(如 PHP),还需同步调大
fastcgi_send_timeout - 不要盲目设为 0(无限),否则可能长期占用 worker 连接,引发资源耗尽
必须同步检查的关联项
单独调大 proxy_send_timeout 往往不够,常见漏配点:
面灵AI
AI面试助手平台,帮助求职者轻松应对面试
下载
-
client_max_body_size:确保 Nginx 允许接收那么大的请求体(如2G) -
client_body_timeout:客户端上传数据包间隔不能太久(建议 ≥proxy_send_timeout) - 后端自身限制:Spring Boot 的
spring.servlet.multipart.max-file-size、Gunicorn 的--limit-request-body、Node.js 的 body-parser 限制等 - 前端请求超时:axios/fetch 的 timeout 设置不能比 Nginx 更短(否则前端先断连)
验证是否生效的小技巧
修改配置后 reload,用 curl 模拟慢速上传测试:
curl -X POST http://your-domain.com/upload \ -F "file=@large-file.zip" \ --limit-rate 100K
同时监控 Nginx error.log 和后端 access log,观察是否仍出现提前断连;再用 nginx -t 确保语法无误,避免 reload 失败却误以为生效。