Nginx - client_max_body_size没有效果

nginx一直说client intended to send too large body。谷歌和RTM指向我client_max_body_size。我在nginx.confvhost conf中将其设置为200m,重新启动Nginx几次,但我仍然得到错误消息。

我是不是忽略了什么?后端是php-fpm (max_post_sizemax_upload_file_size是相应设置的)。

379400 次浏览

请查看是否在http{}块中设置client_max_body_size指令,而不是在location{}块中设置client_max_body_size指令。我已经在http{}块内设置了它,它可以工作

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

context: http, server, location

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

我的愚蠢错误是,我在/etc/nginx/conf.d中放入了一个文件,该文件没有以.conf结尾。Nginx默认情况下不会加载这些。

NGINX大上传在托管的WordPress站点上成功工作,最后(根据nembleton &的建议;rjha94)

我想如果我对他们的建议稍加澄清,可能会对某些人有所帮助。对于初学者,请确保你已经在所有三个单独的定义块(服务器,位置和放大器;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

注意:如果你正在管理ISPconfig 3设置(我的设置是在CentOS 6.3上,根据完美的服务器),你将需要在几个单独的文件中管理这些条目。如果你的配置与步骤设置中的配置类似,你需要修改的NGINX conf文件位于这里:

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

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

/etc/php.ini

我继续忽略nginx.conf文件中的http{}块。显然,忽略这一点会将上传限制为1M的默认限制。在做了相关的更改之后,你还需要确保重新启动你的NGINX和PHP FastCGI Process Manager (PHP- fpm)服务。在上面的配置中,我使用以下命令:

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

如果这不好,有人会纠正我,但我喜欢尽可能地锁定所有内容,如果您只有一个上传目标(通常情况下),那么只需将您的更改定向到一个文件。这适用于我的Ubuntu nginx-extras mainline 1.7+包:

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

您需要应用以下更改:

  1. 更新php.ini(从phpinfo();中找到右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. Update NginX settings for your website and add client_max_body_size value in your location, http, or server context.

    location / {
    client_max_body_size 200m;
    ...
    }
    
  3. Restart NginX and PHP-FPM:

    service nginx restart
    service php5-fpm restart
    

NOTE: Sometime (In my case almost every time) you need to kill php-fpm process if it didn't refresh by service command properly. To do that you can get list of processes (ps -elf | grep php-fpm) and kill one by one (kill -9 12345) or use following command to do it for you:

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

作为2016年3月,我遇到了这个问题,试图通过https POST json(从python请求,这并不重要)。

诀窍是放入"client_max_body_size 200M;"至少在两个地方__ABC0和server {}:

1. http目录

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

2.: vhost中的server目录。

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

3.location /目录添加到与2.相同的位置

  • 你可以比/更具体,但如果它根本不起作用,我建议将此应用于/,然后一旦它起作用就更具体。

还记得 -如果你有SSL,这将要求你为SSL设置上面的serverlocation,无论它们在哪里(理想情况下与2.相同)。我发现,如果你的客户端试图在http上上传,你希望他们得到301到https, nginx实际上会在重定向之前放弃连接,因为文件对http服务器来说太大了,所以它必须在这两个中。

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

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

假设你已经在其他答案中设置了client_max_body_size和各种PHP设置(upload_max_filesize / post_max_size等),然后重新启动或重新加载NGINX和PHP,没有任何结果,运行这个…

nginx - t

这会让你在NGINX配置中出现任何未解决的错误。在我的情况下,我在413错误中挣扎了一整天,才意识到NGINX配置中还有其他一些未解决的SSL错误(certs的错误路径)需要更正。一旦我修复了从'nginx -T'得到的未解决的问题,重新加载nginx,尤里卡!!这就解决了问题。

我正在设置一个开发服务器来使用我们过时的生活镜像,我使用完美的服务器- Ubuntu 14.04 (nginx, BIND, MySQL, PHP, Postfix, Dovecot和ISPConfig 3)

在经历了同样的问题后,我看到了这篇文章,但没有任何工作。我改变了每个推荐文件(nginx.conf, ispconfig. conf)中的值。Vhost, /sites-available/default,等等)

最后,在我的/etc/nginx/sites-available/apps.vhost中改变client_max_body_size并重新启动nginx是什么把戏。希望它能帮助到其他人。

我遇到了同样的问题,但我发现它与nginx无关。我使用nodejs作为后端服务器,使用nginx作为反向代理,413代码是由节点服务器触发的。节点使用洋槐解析正文。Koa限制url编码的长度。

formLimit: url编码体的限制。如果主体最终大于此限制,则返回413错误代码。默认为56kb。

将formLimit设置为更大可以解决这个问题。

我最近有一个类似的问题,并发现,client_max_body_size 0;可以解决这样的问题。这将把client_max_body_size设置为无限制。但最佳实践是改进您的代码,因此没有必要增加这个限制。

如果你尝试了上面的选项,没有成功,你也使用IIS (iisnode)托管你的节点应用程序,把这段代码放在web上。Config帮我解决了这个问题:

这里是引用:https://www.inflectra.com/support/knowledgebase/kb306.aspx

此外,您可以更改允许的长度,因为现在我认为它是2GB。根据你的需要修改它。

  <security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147483648" />
</requestFiltering>
</security>

如果您正在使用Kubernetes,请在Ingress中添加以下注释:

annotations:
nginx.ingress.kubernetes.io/client-max-body-size: "5m"
nginx.ingress.kubernetes.io/client-body-buffer-size: "8k"
nginx.ingress.kubernetes.io/proxy-body-size: "5m"
nginx.ingress.kubernetes.io/proxy-buffer-size: "8k"

确认已应用更改:

kubectl -n <namespace> describe ingress <ingress-name>

引用:

  • < a href = " https://kubernetes.github。io/ingress-nginx/user-guide/nginx-configuration/annotations/# Client - Body - Buffer - Size " rel="nofollow noreferrer">客户端缓冲区大小 . io/ingress-nginx/user-guide/nginx-configuration/annotations/# Client - Body - Buffer - Size " rel="nofollow noreferrer">
  • < a href = " https://kubernetes.github。io/ingress-nginx/user-guide/nginx-configuration/annotations/# Custom -max-body-size" rel="nofollow noreferrer">自定义的最大body尺寸 .