必须在匹配上传路径的location块中配置client_max_body_size(如location /api/upload { client_max_body_size 500m; }),并同步调整client_body_buffer_size、client_body_temp_path权限及proxy_read_timeout等参数,最后执行nginx -t && nginx -s reload生效。

直接在 Nginx 配置中设置 client_max_body_size 指令即可控制客户端上传文件大小,这是最核心且必须配置的参数。默认值为 1m,不改就只能传不超过 1MB 的文件。
在哪写这个配置最稳妥
推荐优先写在处理上传请求的 location 块 里,比如你的接口路径是 /upload 或 /api/file,那就明确配在那里:
- 这样只对上传路径生效,不影响登录、表单等其他接口的安全边界
- 避免在
server或http块里全局放宽,减少潜在攻击面 - Nginx 匹配优先级是
location > server > http,写在 location 才真正起效
怎么写才不出错
语法简单,但细节容易踩坑:
- 单位用小写字母:
10m✅,10M或10mb❌(会报错或被忽略) - 可写成数字加单位,如
500m、2g;不加单位默认是字节,慎用 - 设为
0表示不限制(生产环境不建议) - 必须放在大括号内,例如:
location /upload { client_max_body_size 200m; }
光改这一个还不够
只调 client_max_body_size 常常还是上传失败,因为大文件还要过缓冲、临时目录、超时三关:
-
client_body_buffer_size:建议设为
512k~1m。太小(如默认 8k)会导致频繁写磁盘;太大可能耗尽内存 -
client_body_temp_path:确认该路径(默认
/tmp)磁盘空间够、且 Nginx 运行用户(如www-data)有读写权限 -
client_body_timeout 和 proxy_read_timeout:上传耗时长,建议都设为
600(10 分钟)或更高
改完怎么验证
别只靠浏览器点选上传,容易被前端校验干扰:
- 用
curl -F "file=@large.zip" http://yoursite.com/upload发真实请求,看返回是 200 还是 413 - 实时查看错误日志:
tail -f /var/log/nginx/error.log,出现client intended to send too large body就说明限制已生效 - 执行
nginx -t确保语法正确,再用nginx -s reload生效配置


















