Nginx 413 错误:请求实体过大?解决方案在此 – wiki大全

Nginx 413 错误:请求实体过大?解决方案在此

在使用 Nginx 作为 Web 服务器或反向代理时,您可能偶尔会遇到“413 Request Entity Too Large”(请求实体过大)的错误。这个错误意味着客户端发送的请求体(例如,文件上传、POST 数据)超出了 Nginx 服务器允许的最大大小。本文将详细解释这个错误的原因以及如何有效地解决它。

什么是 Nginx 413 错误?

当客户端向 Nginx 服务器发送一个 HTTP 请求,并且该请求的请求体(Body)大小超过了服务器设定的限制时,Nginx 就会返回 HTTP 状态码 413,并显示“Request Entity Too Large”的错误信息。

常见场景:
* 上传大文件到服务器时。
* 提交包含大量数据的表单时。
* 通过 API 发送大型 JSON 或 XML 有效载荷时。

错误原因:client_max_body_size

Nginx 引入了一个名为 client_max_body_size 的指令,用于限制客户端请求体的最大允许大小。这个限制是为了防止恶意攻击(如拒绝服务攻击)以及避免服务器因处理过大的请求而耗尽资源。

Nginx 的默认 client_max_body_size 通常为 1 兆字节(1M)。这意味着任何超过 1MB 的请求体都将被 Nginx 拒绝,从而导致 413 错误。

解决方案:调整 client_max_body_size

解决 Nginx 413 错误的核心方法是增加 Nginx 配置中 client_max_body_size 指令的值。

在何处配置 client_max_body_size

client_max_body_size 指令可以在 Nginx 配置的三个不同层级进行设置:httpserverlocation 块。选择哪个层级取决于您希望更改的适用范围。

  1. http 块 (全局设置)
    http 块中设置 client_max_body_size 将对 Nginx 服务器上的所有虚拟主机(server 块)生效。如果您希望所有网站都应用相同的上传限制,这是最方便的选择。

    nginx
    http {
    # ... 其他 http 配置
    client_max_body_size 100M; # 将限制设置为 100 兆字节
    # ...
    }

  2. server 块 (针对特定网站)
    如果您只想为某个特定的虚拟主机(网站)调整限制,可以在该 server 块中设置 client_max_body_size。这不会影响 Nginx 配置中的其他网站。

    nginx
    server {
    listen 80;
    server_name your-domain.com;
    # ... 其他 server 配置
    client_max_body_size 100M; # 仅对 your-domain.com 网站生效
    # ...
    }

  3. location 块 (针对特定 URL 路径)
    对于更精细的控制,您可以为某个 location 块设置 client_max_body_size,这意味着只有访问该特定 URL 路径时,才会应用这个限制。

    nginx
    location /uploads {
    # ... 其他 location 配置
    client_max_body_size 200M; # 仅对 /uploads 路径生效
    # ...
    }

    注意: 如果您的应用程序使用 URL 重写(例如 try_files),将 client_max_body_size 放置在 location 块中可能无法按预期工作,特别是对于重写后的 URL。在这种情况下,将其定义在 server 上下文会更安全。

单位说明:
* K 代表千字节 (Kilobytes)
* M 代表兆字节 (Megabytes)
* G 代表千兆字节 (Gigabytes)

禁用限制:
client_max_body_size 设置为 0 将完全禁用客户端请求体大小的检查。但请谨慎使用此选项,因为它可能使您的服务器容易受到某些类型的攻击。

实施解决方案的步骤

  1. 定位 Nginx 配置文件
    Nginx 的主配置文件通常位于 /etc/nginx/nginx.conf。此外,还可能存在以下目录:

    • /etc/nginx/conf.d/:包含额外的配置文件。
    • /etc/nginx/sites-available/:存放每个站点的配置文件,通常通过软链接到 /etc/nginx/sites-enabled/ 来启用。
  2. 编辑配置文件
    使用您喜欢的文本编辑器(如 vinano)打开相关的 Nginx 配置文件,并在适当的 httpserverlocation 块中添加或修改 client_max_body_size 指令。例如,要将限制设置为 100MB:

    “`nginx

    示例:在 http 块中设置

    http {
    client_max_body_size 100M;
    # …
    }
    “`

  3. 测试 Nginx 配置
    在重新加载或重启 Nginx 服务之前,务必测试配置文件的语法是否正确,以避免潜在的服务中断:

    bash
    sudo nginx -t

    如果一切正常,您将看到类似“syntax is ok”和“test is successful”的输出。

  4. 重新加载或重启 Nginx
    应用配置更改需要重新加载或重启 Nginx 服务。建议使用重新加载,因为它可以在不中断现有连接的情况下应用更改,从而最大限度地减少停机时间。

    • 重新加载 (推荐):
      bash
      sudo systemctl reload nginx
      # 或者
      sudo service nginx reload
      # 或者
      sudo nginx -s reload

    • 重启 (如果重新加载无效或进行了重大更改):
      bash
      sudo systemctl restart nginx
      # 或者
      sudo service nginx restart

重要考虑:应用程序层面的设置

如果您的 Nginx 是作为后端应用程序(如 PHP、Python、Node.js 应用)的反向代理,并且即使增加了 client_max_body_size 仍然遇到问题,那么您还需要检查应用程序自身的上传限制。

以 PHP 为例,您需要在 php.ini 文件中调整以下指令:

  • upload_max_filesize: 允许上传文件的最大大小。
  • post_max_size: POST 数据允许的最大大小。

确保这些值等于或大于您在 Nginx 中设置的 client_max_body_size。例如:

ini
; php.ini 示例
upload_max_filesize = 100M
post_max_size = 100M

修改 php.ini 后,通常需要重启您的 PHP-FPM 服务(例如 sudo systemctl restart php-fpmsudo service php7.4-fpm restart)。

总结

Nginx 413 “Request Entity Too Large” 错误是一个常见的配置问题,通过调整 client_max_body_size 指令即可解决。务必根据您的需求选择合适的配置层级,并在应用更改前测试配置。此外,对于使用后端应用程序的场景,别忘了同步检查并调整应用程序自身的上传限制。通过这些步骤,您可以确保 Nginx 能够顺利处理更大尺寸的请求。

滚动至顶部