nginx 代理大文件上传需协同配置 client_max_body_size、client_body_timeout、client_body_buffer_size、proxy_buffering 等参数,并同步放宽后端限制,否则仍会返回 413 或 502 错误。

在 Nginx 作为 HTTP 代理使用时,请求体大小限制不是单点配置,而是一套协同生效的机制。只改 client_max_body_size 很可能无效,上传仍报 413、502 或静默中断。
必须显式配置 client_max_body_size
该指令是第一道拦截阀,决定 Nginx 是否允许请求体进入处理流程:
- 默认值为 1m(1MB),超限直接返回 413 Request Entity Too Large
- 单位必须小写:
20m合法,20M会触发配置校验失败 - 遵循“就近原则”:仅在
http块设置,不会自动继承到所有location;上传路径如/api/upload必须在对应location块内重写,例如:location /api/upload {<br> client_max_body_size 100m;<br> proxy_pass http://backend;<br>} - 不建议全局设大值(如整个
server块设 500m),否则非上传接口也暴露更大攻击面
配套参数必须同步调优
大请求体在代理链路中易因缓冲、超时或转发行为中断,需联动调整:
-
延长读取等待时间:防止上传中途断连
client_body_timeout 120s;(默认 60s,建议翻倍) -
增大内存缓冲区:减少磁盘临时文件写入频率
client_body_buffer_size 128k;(默认通常 8k–16k) -
关闭代理缓冲:避免 Nginx 全量缓存 body 再转发,造成延迟与内存压力
proxy_buffering off;<br>proxy_request_buffering off;
(Nginx ≥1.13.10 推荐启用) -
匹配后端通信超时:确保转发过程不被提前中断
proxy_read_timeout 180s;<br>proxy_send_timeout 180s;
后端服务限制必须同步放宽
Nginx 只是网关,后端才是实际接收方。若后端未调整,Nginx 放行后仍会拒收:
-
Spring Boot:设置
spring.servlet.multipart.max-file-size=128MB和spring.servlet.multipart.max-request-size=128MB -
Node.js(Express + Multer):配置
limits: { fileSize: 100 * 1024 * 1024 } -
PHP:检查
upload_max_filesize和post_max_size,二者均需 ≥ Nginx 设置值 - 推荐策略:Nginx 限值略大于后端(如后端设 80MB,Nginx 设 100MB),留出 10–20% 缓冲余量
验证是否真正生效
改完配置不测试等于没改:
- 用
curl -X POST --data-binary @test_99m.zip http://your-domain/api/upload模拟边界值上传 - 实时查看错误日志:
tail -f /var/log/nginx/error.log,搜索关键词:client intended to send too large body或request header or cookie too large - 执行
nginx -t校验语法,再nginx -s reload生效 - 注意:CDN、WAF 等前置代理也可能拦截,需一并排查











