client_max_body_size 必须在匹配上传路径的 location 块中配置,如 location /api/upload { client_max_body_size 500m; },并配套 client_body_buffer_size、client_body_temp_path、client_body_timeout 及反向代理场景下的 proxy_request_buffering off 等参数,否则无效。

直接用 client_max_body_size 指令就能限制上传文件大小,但它必须放在正确的作用域里,且要配套几个关键参数,否则即使设了也无效。
必须写在匹配上传路径的 location 块中
这是最容易出错的地方。Nginx 配置优先级是 location > server > http。如果你只在 server 块设了 500m,但上传请求实际命中的是 /api/upload 这个路径,而该 location 块里没写这行,它就可能继承默认的 1m,直接返回 413 错误。
- ✅ 正确写法(推荐):
location /api/upload {<br> client_max_body_size 500m;<br> proxy_pass http://backend;<br>} - ❌ 错误写法:只在
http或server块设值,却没覆盖到真实上传路径 - ⚠️ 注意单位:写
500m(小写 m),别写500M或500MB,否则 nginx 启动会失败
配套参数一个都不能少
client_max_body_size 只管“让不让进”,真正决定上传能否走通,还得看下面三项:
-
client_body_buffer_size 512k;:内存缓冲区大小。默认 8k 太小,大文件会频繁刷盘;设成 512k~1m 更稳 -
client_body_temp_path /var/tmp/nginx/client_body 1 2;:确保这个目录存在、磁盘空间够、nginx 运行用户(如www-data)有读写权限 -
client_body_timeout 300s;:允许客户端分多次传完,尤其对弱网或大文件很关键。设太短(如默认 60s)容易中断
反向代理场景要额外关掉缓冲
如果 Nginx 后面还接了后端服务(如 PHP、Node.js、Spring Boot),默认 proxy_request_buffering on 会让 Nginx 把整个大文件先收全再转发——这会导致上传卡在 99%、内存暴涨甚至超时断连。
- 必须在对应
location块中加:proxy_request_buffering off; - 同时延长代理超时:
proxy_read_timeout 3600;和proxy_send_timeout 3600; - 别忘了同步调大后端限制(如 PHP 的
upload_max_filesize和post_max_size)
安全建议:别全局放开,按需分级设限
生产环境不建议在 http 或 server 块设过大值(比如 0 或 10G),否则所有 POST 接口(登录、表单提交等)都暴露风险。
- 非上传类接口(如
/login、/api/v1/user):保持1m或显式设为5m - 明确上传路径(如
/upload、/files):单独设合理上限,例如200m -
client_max_body_size 0仅限内网调试,生产禁用











