Nginx反向代理大文件上传为什么会报413 Request Entity Too Large?怎么解决?

文章导读
Nginx 反向代理报 413 错误是因为请求体超过了默认的 1MB 限制,修改配置文件中的 client_max_body_size 指令即可解决。适用场景为文件上传或大 POST 请求,风险边界在于设置过大可能增加服务器内存压力。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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/下的站点配置文件中。

Nginx反向代理大文件上传为什么会报413 Request Entity Too Large?怎么解决?

第二步:在 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反向代理大文件上传为什么会报413 Request Entity Too Large?怎么解决?

常见坑

仅修改 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