文件上传中断源于Nginx三道超时门槛未精准调整:proxy_connect_timeout(建连)、proxy_send_timeout(发数据)、proxy_read_timeout(等响应);需据日志定位阶段,重点调大proxy_send_timeout并同步配置client_max_body_size、client_body_timeout及后端限制,proxy_read_timeout需单独为上传接口延长。

文件上传中断,不是“Nginx 太急”,而是它在不同环节分别设了三道耐心门槛——建连、发数据、等响应。每道门关得过早,上传就断在半路。关键不是全拉长,而是看清卡在哪一环,再精准松绑。
先看日志,定位中断发生在哪一阶段
Nginx 错误日志会直接告诉你问题出在哪:
-
while connecting to upstream → 卡在 TCP 连接建立,查
proxy_connect_timeout -
while sending request to upstream → 卡在往服务端发文件数据,查
proxy_send_timeout -
while reading response header from upstream → 卡在等后端返回第一个字节(比如上传成功提示),查
proxy_read_timeout -
upstream prematurely closed connection 或 Broken pipe → 往往是后端提前断开,或
proxy_send_timeout被击穿
重点调 proxy_send_timeout:专治“发不完文件”
这个参数只管一件事:Nginx 把客户端传来的文件数据,一块块发给后端时,两次发送之间能等多久。它不控制客户端上传,也不管后端处理多慢。
- 默认 60 秒,上传几百 MB 就容易超时(尤其网络波动或后端读取慢)
- 合理值 = 最大文件体积 ÷ 后端稳定接收速率 + 30~60 秒余量
例如:支持 2GB 上传,后端平均收速 5MB/s → 2000 ÷ 5 ≈ 400 秒 → 设为proxy_send_timeout 480s - 严禁设为 0,否则 worker 连接会被长期占住,引发雪崩
必须同步配齐的三项配置
单改 proxy_send_timeout 没用,这三项必须一起调:
-
client_max_body_size:确保 Nginx 允许收那么大的文件,如client_max_body_size 2G; -
client_body_timeout:客户端上传过程中两次发包的间隔上限,建议 ≥proxy_send_timeout(如都设 480s) -
后端自身限制:Spring Boot 的
spring.servlet.multipart.max-file-size、Tomcat 的maxPostSize、Gunicorn 的--limit-request-body等,都要比 Nginx 设置更大
别漏掉响应等待环节:proxy_read_timeout
文件发完之后,后端还要鉴权、转存、生成结果、返回 JSON,这段等待由它控制。普通接口设 60 秒够用,但上传类接口常需更久:
- 若后端处理耗时约 5 分钟,建议设为
proxy_read_timeout 360s(留出缓冲) - 避免和
proxy_send_timeout混用:前者等“发完”,后者等“回音” - 可在特定 location 中单独设置,不影响全局,例如:
location /api/upload { proxy_read_timeout 360; }


















