nginx上传大文件报413或连接重置,需调三处:①设client_max_body_size 200m;②在location中关闭proxy_buffering和proxy_request_buffering;③延长proxy_send_timeout、proxy_read_timeout、client_body_timeout至300秒。

Vue 项目通过 Nginx 上传大文件时出现 413 Request Entity Too Large 或连接被重置,本质不是前端代码问题,而是 Nginx 默认缓冲区和超时策略限制了分片上传的单次请求体大小与持续时间。关键要调对三处:客户端请求体上限、代理缓冲区行为、超时控制。
调整 Nginx 请求体大小限制
Nginx 默认 client_max_body_size 是 1MB,远小于单个分片(常见 5–10MB)。即使后端(如 Node.js)已放宽限制,Nginx 会在进入后端前直接拦截。
在 http、server 或 location 块中显式设置:
client_max_body_size 200M;
建议写在 server 块内,确保所有上传接口(如 /api/upload)统一生效。若只针对特定路径,可放在对应 location /api/upload/ { ... } 中。
关闭代理缓冲以支持流式分片
默认开启的 proxy_buffering on 会让 Nginx 缓存整个请求体再转发,导致大分片卡住、超时或内存暴涨。分片上传本质是短连接、小载荷、高频次,应禁用缓冲并启用流式透传。
在处理上传的 location 块中添加:
proxy_buffering off; proxy_request_buffering off; # 关键:禁用 NGINX 对 request body 的预读缓存(1.13.10+) proxy_http_version 1.1; proxy_set_header Connection '';
proxy_request_buffering off 是核心项——它让 Nginx 不等待完整 body 就开始将数据流式转发给后端,避免因分片过大或网络抖动触发缓冲区溢出。
延长超时时间适配分片网络波动
分片上传过程中,每个 HTTP 请求虽小,但弱网下可能耗时较长;Nginx 默认 proxy_read_timeout(60s)和 client_header_timeout(60s)容易中断连接。
推荐配置(单位:秒):
-
proxy_connect_timeout 60;—— 与后端建连时限 -
proxy_send_timeout 300;—— 向后端发数据的间隔超时(覆盖分片发送) -
proxy_read_timeout 300;—— 等待后端响应的总时长(含处理分片逻辑) -
client_header_timeout 60;—— 请求头解析超时(通常无需改) -
client_body_timeout 300;—— 接收请求体整体超时(重要!防止分片传输慢被断)
这些值需结合实际分片大小(如 8MB)、带宽(如 2MB/s)估算:8MB ÷ 2MB/s = 4s,留 5–10 倍余量更稳妥。
验证与调试技巧
改完配置别急着 reload,先语法检查:
nginx -t
成功后重载:
nginx -s reload
调试时打开 Nginx 错误日志(error_log /var/log/nginx/error.log debug;),重点关注:
-
client intended to send too large body→ 未生效client_max_body_size -
upstream timed out→ 超时参数不足或后端卡死 -
broken pipe或connection reset→proxy_request_buffering未关或 TCP 层中断
前端可用浏览器 Network 面板观察每个分片请求的状态码、Timing 和 Response Headers,确认是否全部 200 且无 413/504。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










