nginx – client_max_body_size没有效果

nginx一直说client intended to send too large body 。 谷歌search和RTM指出我client_max_body_size 。 我把它设置为200mnginx.conf以及在vhost conf ,重新启动Nginx几次,但我仍然收到错误消息。

我忽略了什么? 后端是php-fpmmax_post_sizemax_upload_file_size地设置)。

在nginx文档之后 ,您可以在以下上下文中设置client_max_body_size 20m(或您需要的任何值):

 context: http, server, location 

NGINX大量上传在托pipe的WordPress网站上成功运行,最后(根据nembleton&rjha94的build议)

如果我在他们的build议中加了一点澄清,我认为这可能对某人有帮助。 对于初学者,请确定您已经在所有三个单独的定义块(服务器,位置和http)中包含了增加的上传指令。 每个应该有一个单独的行条目。 结果会像这样(其中…反映定义块中的其他行):

 http { ... client_max_body_size 200M; } 

(在我的ISPconfig 3设置中,这个块位于/etc/nginx/nginx.conf文件中)

 server { ... client_max_body_size 200M; } location / { ... client_max_body_size 200M; } 

(在我的ISPconfig 3设置中,这些块位于/etc/nginx/conf.d/default.conf文件中)

另外,请确保您的服务器的php.ini文件与这些NGINX设置一致。 在我的情况下,我改变了php.ini的File_Uploads部分的设置为:

 upload_max_filesize = 200M 

注意:如果您正在pipe理ISPconfig 3设置(我的设置位于CentOS 6.3上,按照Perfect Server ),您将需要在几个单独的文件中pipe理这些条目。 如果您的configuration与分步设置中的configuration类似,您需要修改的NGINXconfiguration文件位于:

 /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf 

我的php.ini文件位于这里:

 /etc/php.ini 

我继续忽略了nginx.conf文件中的http {}块。 显然,忽略这个限制上传到1M默认限制的效果。 进行相关更改后,您还需要确保重新启动您的NGINX和PHP FastCGIstream程pipe理器(PHP-FPM)服务。 在上面的configuration中,我使用下面的命令:

 /etc/init.d/nginx restart /etc/init.d/php-fpm restart 

截至2016年3月 ,我遇到了这个问题试图通过https发送json(从python请求,而不是重要的)。

诀窍是把“client_max_body_size 200M” 至less在两个地方http {}server {}

1. http目录

  • 通常在/etc/nginx/nginx.conf

2.你的虚拟主机中的server目录。

  • 对于通过apt-get安装的Debian / Ubuntu用户(以及默认安装nginx vhosts的其他发行版软件包pipe理器),对于那些没有vhosts的用户,可能是/etc/nginx/sites-available/mysite.com你的nginx.conf或者它在同一个目录下。

3. location /目录与2相同

  • 你可以比/更具体,但如果它不工作,我build议将它应用于/然后一旦它的工作更具体。

请记住 – 如果您拥有SSL,则需要您为SSL serverlocation设置上述location ,无论location如何(理想情况下与2.相同)。 我发现如果你的客户端试图在http上进行上传,并且你希望他们得到301的https,那么在redirect之前,nginx会实际上删除连接,因为这个文件对于http服务器来说太大了,所以它必须是在两个

最近的评论表明,在SSL上使用较新的nginx版本存在一个问题,但我在1.4.6上,一切都很好:)

您需要应用以下更改:

  1. 更新php.ini (从phpinfo(); )find正确的ini文件并将post_max_sizeupload_max_filesize增加到你想要的大小:

     sed -i "s/post_max_size =.*/post_max_size = 200M/g" /etc/php5/fpm/php.ini sed -i "s/upload_max_filesize =.*/upload_max_filesize = 200M/g" /etc/php5/fpm/php.ini``` 
  2. 更新您网站的NginX设置,并在您的locationhttpserver上下文中添加client_max_body_size值。

     location / { client_max_body_size 200m; ... } 
  3. 重新启动NginX和PHP-FPM:

     service nginx restart service php5-fpm restart 

注意:有时(在我的情况几乎每次)你需要杀死php-fpm进程,如果它没有正确刷新服务命令。 要做到这一点,你可以得到进程列表( ps -elf | grep php-fpm )并逐个kill -9 12345kill -9 12345 )或者使用下面的命令为你做:

 ps -elf | grep php-fpm | grep -v grep | awk '{ print $4 }' | xargs kill -9 

请看看你是否在http {}块内设置client_max_body_size指令,而不是位于{}块内。 我已经在http {}块中设置它,它的工作原理

有人纠正我,如果这是不好的,但我想尽可能locking一切,如果你只有一个目标上传(如通常情况下),然后只是针对您的更改到一个文件。 这适用于Ubuntu nginx-extras主线1.7+包:

 location = /upload.php { client_max_body_size 102M; fastcgi_param PHP_VALUE "upload_max_filesize=102M \n post_max_size=102M"; (...) } 

有同样的问题, client_max_body_size指令被忽略。

我的愚蠢的错误是,我把一个文件放在/etc/nginx/conf.d ,而不是以.conf结尾。 Nginx默认不会加载这些。

如果你使用的是windows版本的nginx,你可以尝试杀死所有的nginx进程并重新启动它来查看。 我遇到了同样的问题在我的环境中,但解决了这个解决scheme。