单位必须小写且带字母(k/m/g),大写、省略、空格或非法单位均导致client_max_body_size配置失效;用nginx -t确认生效值,错误日志中字节数可反推实际限制。

单位写错是 client_max_body_size 配置失效最隐蔽、最高频的原因——语法检查(nginx -t)根本不会报错,但配置实际不生效,上传仍报 413。
单位必须小写且带字母,不能省略或混用
Nginx 只识别 k(KB)、m(MB)、g(GB)三种小写单位。以下写法全部非法:
-
client_max_body_size 50M;→ 大写 M 不识别,会被当作“50 字节”处理 -
client_max_body_size 100;→ 没单位 = 100 字节,远低于默认 1MB -
client_max_body_size 2GB;→ GB 不被支持,G 可用但必须小写,且空格也不允许 -
client_max_body_size 50 MB;→ 单位前有空格,Nginx 解析失败,该行被静默忽略
用 nginx -T 看真实生效值
nginx -t 只校验语法,不验证语义。要确认单位是否被正确加载,运行:
nginx -T 2>/dev/null | grep -A1 -B1 client_max_body_size
观察输出中该指令是否出现在你预期的 location/server 块里,且值显示为 50m、100m 这类小写带单位格式。如果显示为 50 或 50M,说明单位写错了。
结合错误日志反向验证
触发 413 时,Nginx 错误日志(如 /var/log/nginx/error.log)会记录完整错误行,例如:
client intended to send too large body: 20971520 bytes
这个数字是实际请求体字节数。换算成 MB:
20971520 ÷ 1048576 = 20 → 说明 Nginx 当前生效限制就是 20m。
如果你配的是 50M 却看到 20m,基本可断定单位写错导致配置未加载,系统回退到了更外层(比如 server 块里写的 20m)或默认值。











