Nginx中client_max_body_size必须在location块中显式配置才真正生效,因其优先级最高;还需同步调大client_body_buffer_size、确保client_body_temp_path权限正确、延长proxy_read_timeout等超时参数,并校准后端限制与请求头缓冲,否则仍会因缓冲、权限、超时或头部过大导致413/500/502/400错误。

在 Nginx 的 nginx.conf 中设置 client_max_body_size,是用来限制客户端请求体(比如文件上传)的最大尺寸。这个值默认是 1MB,如果用户上传的文件超过该限制,Nginx 会直接返回 413 Request Entity Too Large 错误,请求甚至不会到达后端应用(如 PHP、Node.js 等)。
作用范围决定是否生效
client_max_body_size 可以在 http、server 或 location 块中配置,优先级从高到低:
-
location块中的设置覆盖server块 -
server块中的设置覆盖http块 - 若某 location 没有显式设置,就继承上级 scope 的值
例如:你只在 http 块设了 20M,但某个用于上传的 location /upload 里没重写,那它就用 20M;但如果该 location 里写了 client_max_body_size 5M;,那就只允许传最大 5MB。
常见写法和单位
支持的单位有 m(兆字节)、k(千字节)、g(GB),大小写不敏感:
-
client_max_body_size 100m;→ 允许最大 100MB -
client_max_body_size 2g;→ 允许最大 2GB -
client_max_body_size 0;→ 关闭限制(慎用,存在安全风险)
注意:不能写成 100MB 或 100M(必须小写 m),否则 Nginx 启动会报错。
配合后端也要检查
仅调大 Nginx 限制还不够。后端服务(如 PHP 的 upload_max_filesize 和 post_max_size,或 Python 的 Flask/Werkzeug 配置)也需同步调整,否则请求会在后端被拦截,可能返回 500 或静默失败。
- PHP 示例:
upload_max_filesize = 100Mpost_max_size = 100M - Node.js(Express + multer):
multer({ limits: { fileSize: 100 * 1024 * 1024 } })
验证是否生效
修改配置后别忘了重载 Nginx:
-
nginx -t检查语法 -
nginx -s reload或systemctl reload nginx
然后用 curl 测试:
curl -X POST -F "file=@large-file.zip" http://your-domain.com/upload
如果仍返回 413,检查错误日志:/var/log/nginx/error.log,确认是 Nginx 报错还是后端报错。


















