Nginx 反向代理报 413 错误是因为请求体超过了默认的 1MB 限制,修改配置文件中的 client_max_body_size 指令即可解决。适用场景为文件上传或大 POST 请求,风险边界在于设置过大可能增加服务器内存压力。
先说结论:修改 Nginx 配置增加 client_max_body_size 值并重载服务可消除 413 错误,需同时检查后端语言限制。
- 适合:Nginx 作为反向代理或 Web 服务器接收大文件上传的场景。
- 先准备:确认 Nginx 配置文件路径,备份原配置,评估预期文件大小。
- 验收:使用 curl 或浏览器上传测试文件,确认状态码变为 200 且无报错。
命令速用版
以下命令用于测试配置语法和重载 Nginx,执行前请确保已修改配置文件。
nginx -t
nginx -s reload
为什么会这样
Nginx 默认限制客户端请求体大小为 1 兆字节,超过该值直接返回 413 状态码。
该限制是 Nginx 核心模块 ngx_http_core_module 的保护机制,防止恶意大请求占用过多内存或磁盘空间。默认值在官方文档中明确定义为 1m,未修改配置时所有超过 1MB 的 POST 请求都会被拦截。
分步处理
第一步:找到 Nginx 配置文件,通常位于/etc/nginx/nginx.conf 或/etc/nginx/conf.d/下的站点配置文件中。
第二步:在 http、server 或 location 块中添加 client_max_body_size 指令,例如设置为 100M。
server {
listen 80;
server_name example.com;
client_max_body_size 100M;
location / {
proxy_pass http://backend;
}
}
第三步:执行 nginx -t 检查配置语法,确认成功后执行 nginx -s reload 重载配置。
第四步:如果后端是 PHP 等语言,需同步修改 php.ini 中的 upload_max_filesize 和 post_max_size,否则请求会通过 Nginx 但被后端拒绝。
怎么验证是否生效
使用 curl 命令构造大于 1MB 的文件进行上传测试,观察返回状态码。
curl -X POST -F "file=@largefile.zip" http://your-domain.com/upload
检查 Nginx 错误日志/usr/local/nginx/logs/error.log 或/var/log/nginx/error.log,确认不再出现 413 相关记录。如果返回 200 OK 且业务逻辑处理成功,说明配置生效。
常见坑
仅修改 Nginx 限制而忽略后端语言限制,导致请求穿透 Nginx 后被应用层拒绝。proxy_read_timeout 设置过短,大文件上传超时导致 504 错误而非 413。客户端自身限制,如浏览器插件或代码中的请求大小限制未调整。
常见问题
client_max_body_size 默认值是多少?
默认值为 1 兆字节(1m),这是 Nginx 官方文档定义的初始配置。
配置放在 http 块还是 server 块更好?
放在 server 块或 location 块更灵活,可针对不同站点或接口设置不同大小,http 块会影响所有站点。
修改配置后需要重启服务器吗?
不需要重启服务器,执行 nginx -s reload 重载配置即可生效,不会中断现有连接。
参考来源
Nginx 官方文档 - ngx_http_core_module - client_max_body_size: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size