413请求实体过大-文件上传问题

180

我试图上传一个30MB的文件到我的服务器,但是无法成功。

  1. 当我上传30MB的文件时,页面显示"页面未找到"

  2. 当我上传3MB的文件时,接收到 "413请求实体太大",并带有nginx/0.6.32信息。

我正在尝试查找安装了nginx的位置,以便可以增加"client_max_body_size",但是我在服务器上无法找到nginx。我甚至尝试运行:

vi /etc/nginx/nginx.conf
或者
vi /usr/local/nginx/conf/nginx.conf

检查配置文件是否存在,但我在服务器上找不到它。

有没有解决此问题的方法?或者我必须在服务器上安装nginx。

编辑:

我已经在我的php.ini文件中做出了所有必要的更改。

post_max_size 128M
upload_max_filesize 100M
memory_limit 256M

谢谢,Raju


请查看以下链接,可能会对您有所帮助: http://www.cyberciti.biz/faq/linux-unix-bsd-nginx-413-request-entity-too-large/ https://rtcamp.com/tutorials/php/increase-file-upload-size-limit/ - Ashouri
1
嗨,Mohammad,我已经查找了nginx,但是在我的服务器上找不到它。我确定我的服务器上没有安装nginx,所以我对为什么会收到属于Nginx的错误消息感到困惑。 - Raju Vishwas
首先,您必须确保服务器上未安装ngix,但如果您完全确定,那么出于安全原因,一些服务器管理员会使用此技巧来混淆黑客。 - Ashouri
你尝试过运行 ps aux | grep nginx 命令来查看 Nginx 是否正在运行吗? - rpkamp
你尝试过 which nginx 吗?这将给出可执行文件的位置,而不是配置文件,但至少可以确认是否安装了nginx。 - Doug McLean
15个回答

274

源代码:cybercity

编辑nginx的配置文件:

nano /etc/nginx/nginx.conf

httpserver 或者 location 部分中添加一行代码:
client_max_body_size 100M;

不要使用MB,它不起作用,只有M!

还要记得重新启动nginx:

systemctl restart nginx

2
当我执行此操作时,我的413错误变成了404错误。我在EC2上使用Amazon Linux。此外,nginx文档显示小写的“m”。http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size - nu everest
更改文件需要输入密码,但我不记得设置过密码。我是不是漏了什么? - Sooraj
1
Nano的路径应为nano /etc/nginx/nginx.conf。 - MaXi32
1
对我来说有效,但请注意:如果您的配置文件已经有了一个 http { } 部分,请将其余部分添加到其中!添加新的 http {} 部分将失败,并在 Nginx 日志中给出 "http" directive is duplicate 错误。 - jerclarke
我已经编辑了答案,以便明确指出您可以将 client_max_body_size 指令添加到 httpserverlocation 部分,而不仅仅是在 http 部分。请参阅文档 - Luca Fagioli

54

-在 php.ini 文件中(位于 /etc/php.ini 内)

 max_input_time = 24000
 max_execution_time = 24000
 upload_max_filesize = 12000M
 post_max_size = 24000M
 memory_limit = 12000M

-在 nginx.conf(位于 /opt/nginx/conf 内部)

client_max_body_size 24000M

对于我的情况来说,它起作用了


嗨,Arun,我们服务器的问题是,我找不到安装了nginx,但它仍然会出现nginx错误。 - Raju Vishwas
在 /opt 或 /etc 中查找 nginx。在 nginx 中找到 conf 文件夹,然后找到 nginx.conf。 - Arun
如果上述方法不起作用,那么可以通过任何搜索工具在整个Linux系统中搜索nginx.conf文件。 - Arun
max_input_time = 24000,24000是以毫秒为单位的吗? - Rishabh Agrahari
1
@RishabhAgrahari 秒! 这将设置最大时间(以秒为单位)。 默认设置为-1,这意味着将使用max_execution_time。将其设置为0以允许无限时间。 - Sean

33

首先编辑 Nginx 配置文件 (nginx.conf)

位置: sudo nano /etc/nginx/nginx.conf

添加以下代码:

http {
        client_max_body_size 100M;
}

接着在PHP配置文件(php.ini)中添加以下行:

位置:sudo gedit /etc/php5/fpm/php.ini

添加以下代码:

memory_limit = 128M 
post_max_size = 20M  
upload_max_filesize = 10M

1
我按照指示打开了我的nginx.conf文件,但是它是空的! 我没有预料到这一点,但当我添加了你的代码后,它仍然有效...我想人们会期望它有效,但出于某种原因,我没有期望,当它确实有效时,我非常高兴! - Andrew Fox

25
sudo nano /etc/nginx/nginx.conf

然后在http部分添加一行

http {
    client_max_body_size 100M;
}

不要使用MB,只使用M。

systemctl restart nginx

然后对于 PHP 位置。

sudo gedit /etc/php5/fpm/php.ini

目前最常用的是PHP 7.0或更高版本。

sudo nano /etc/php/7.2/fpm/php.ini     //7.3,7.2 or 7.1 which php you use

根据你的意愿检查那些增加的内容。

memory_limit = 128M 
post_max_size = 20M  
upload_max_filesize = 10M

重启php-fpm

service php-fpm restart 

16

我直接将更改添加到虚拟主机而不是nginx的全局配置中,像这样:

   server {
     client_max_body_size 100M;
     ...
   }

然后我修改了php.ini中的参数,就像上面的注释一样:

   max_input_time = 24000
   max_execution_time = 24000
   upload_max_filesize = 12000M
   post_max_size = 24000M
   memory_limit = 12000M

而你不能忘记的是要重启nginx和php-fpm,在CentOS 7上操作方式如下:

  systemctl restart nginx
  systemctl restart php-fpm

8
请在下方输入nginx配置文件的域名:
nano /etc/nginx/sites-available/domain.set

将此代码添加到文件中

client_max_body_size 24000M;

如果出现错误,请使用以下命令

nginx -t

8

我遇到了同样的错误,并通过以下步骤进行了修复。

  1. 首先,编辑nginx.conf文件。

    vi /etc/nginx/nginx.conf

在HTTP部分中,添加了以下行。

http {

    client_max_body_size 100M;
}
  1. 最后,使用以下命令重新启动了Nginx。

systemctl restart nginx


6
假设您已经在php.ini文件中做出了必要的更改:
您可以通过在nginx.conf文件中添加以下行来解决此问题,该文件位于以下路径中:
/etc/nginx/nginx.conf

然后使用vim文本编辑器编辑文件,具体如下:
vi /etc/nginx/nginx.conf

并添加client_max_body_size,值足够大,例如:

client_max_body_size 20MB;

接着,确保使用 :xi:wq 保存。

然后重新启动你的 nginx。

就这样。

对我有用,希望能对你有所帮助。


3
首先,你需要注意响应状态码:
  • 如果显示“413 Content Too Large”,那是由php本身返回的(php.ini文件)
  • 如果显示“413 Request Entity Too Large”,那是由nginx返回的(如果你使用了它)。
  • 如果显示“403 Forbidden”(如果你安装了Modsecurity),那很可能是由Modsecurity返回的。

  • 如果是由php返回的,那么你需要更改以下内容:
  • "post_max_size"(适用于请求中发送的所有文件)
  • "upload_max_filesize"(适用于单个文件)

  • 无论如何
  • "/etc/php/8.2/fpm/php.ini"
  • 或者
  • "/etc/php/8.2/cli/php.ini"(Nginx服务器通常与fpm一起使用)。

  • 如果由nginx返回,则需要将"client_max_body_size 22M;"指令添加到您网站的.conf文件中。
    如果由Modsecurity返回,则需要将/etc/nginx/modsec/modsecurity.conf文件中的"SecRequestBodyLimit"指令更改为类似"SecRequestBodyLimit 23068672"的内容(以字节为单位)。

    非常有帮助,关于哪个服务导致问题的信息。帮了很大的忙。 - undefined

    2

    我已经通过以上更改使上传工作正常。但是,当我进行更改后,文件上传时我开始收到404响应,这促使我进一步调试并通过检查nginx error.log发现这是权限问题。

    解决方案:

    检查/var/lib/nginx的当前用户和组所有权。

    $ ls -ld /var/lib/nginx
    

    drwx------. 3 nginx nginx 17 Oct 5 19:31 /var/lib/nginx

    这说明可能不存在的用户名和组名nginx拥有此文件夹。这会阻止文件上传。

    在我的情况下,"/etc/nginx/nginx.conf"中提到的用户名是

    user vagrant; 
    

    将文件夹的所有权更改为在nginx.conf中定义的用户,本例中为vagrant。
    $ sudo chown -Rf vagrant:vagrant /var/lib/nginx
    

    确保它已经发生了变化。

    $ ls -ld /var/lib/nginx
    drwx------. 3 vagrant vagrant 17 Oct  5 19:31 /var/lib/nginx
    

    重新加载nginx和php-fpm以确保安全。

    $ sudo service nginx reload
    $ sudo service php-fpm reload
    

    权限被拒绝的错误现在应该已经消失了。请检查 error.log 文件(基于 nginx.conf 中 error_log 的位置)。
    $ sudo nano /path/to/nginx/error.log
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接