最近一个用dedecms搭建的网站增加了大量的内容,三个栏目包含了2000多篇文章,生成栏目列表的时候出现了两个栏目2300多篇文章。504网关超时服务器用nginx,我不太懂。服务器维护人员在网上找到一篇文章,修改了nginx的缓存设置。如果不行,他就不管了,但是我不能不管,不能生成。
我把数据库下载到本地,本地配置nginx,试了很多次,都不行。我改成了阿帕奇,更夸张。生成83页后,我无法继续。好像nginx更厉害一点。虽然出现504网关超时,但至少可以生成。
我不得不继续在网上寻找更多的解决方案。试了N次,终于找到了一个有用的方法。想着以后可能会遇到这样的问题,就把那篇文章抄下来放在这里,以备日后参考。对有同样问题的朋友也是一种帮助。
下面是引用部分。我自己不懂技术,但在我的dedecms5.6里有用,其他人可以自己试试。
NGX502BAD Gateway表示请求的php-CGI已经执行,但是由于某种原因(通常是读取资源的问题),PHP-CGI的进程已经终止。
NGX504网关超时的意思是被请求的网关没有请求,简单来说就是没有请求可执行的PHP-CGI。
要解决这两个问题,需要综合考虑。一般来说,Nginx 502坏网关和php-fpm.conf的设置有关,Nginx 504网关超时和nginx.conf的设置有关
但正确的设置需要考虑服务器本身的性能、访客数量等多重因素。
以我现在的服务器为例。CPU是centos系统,1.5G CPU,1GB内存。大约50名游客同时在线。
但是大多数上网的人需要请求PHP-CGI进行大量的信息处理,所以我把nginx.conf设置为:
fastcgi _ connect _ timeout 300s
fastcgi _ send _ timeout 300s
fastcgi _ read _ timeout 300s
fastcgi _ buffer _ size 128k
fastcgi _ buffers 8 128k#8 128
fastcgi _ busy _ buffers _ size 256k
fastcgi _ temp _ file _ write _ size 256k;
fastcgi _ intercept _ errors on
这里最重要的设置是前三个,即
fastcgi _ connect _ timeout 300s
fastcgi _ send _ timeout 300s
fastcgi _ read _ timeout 300s
这里规定了PHP-CGI连接、发送、读取的时间,300秒足够了。因此,504网关超时错误很少出现在我的服务器上。最重要的是php-fpm.conf的设置,会直接导致502坏网关和504网关超时。
我们来仔细分析一下php-fpm.conf的几个重要参数:
Php-fpm.conf有两个关键参数,一个是“max_children ”,另一个是“request_terminate_timeout”
我的两个设置的值分别是“40”和“900”,但是这个值不是通用的,需要自己计算。
计算方法如下:
如果你的服务器性能够好,宽带资源够用,PHP脚本不是循环或者bug,可以直接设置“request_terminate_timeout”为0s。0s的意思是保持PHP-CGI运行没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现了BUG,或者你的宽带不够或者其他原因可以导致你的PHP-CGI假死,那么建议你给“request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能来设置。一般来说,性能越好,可以设置的越高,大概需要20 -30分钟。因为我的服务器PHP脚本需要运行很长时间,有的可能要10分钟以上,所以我把它设置为900秒,这样就不会造成PHP-CGI死机,造成502坏网关错误。
以及“max_children”的值是如何计算的?原则上,值越大越好。php-cgi中进程多了,处理的就快了,队列中的请求就少了。设置“max_children”也需要根据服务器的性能来设置。一般来说,一个服务器中每个php-cgi消耗的内存正常情况下在20M左右,所以我把我的“max_children”设置为40,20M*40=800M,也就是说所有PHP-CGI消耗的内存在峰值时在800M以内,低于我1Gb的有效内存。而如果我的“max_children”设置很小,比如说5-10,那么php-cgi就会“很累”,处理速度慢,等待时间长。如果长时间没有处理请求,就会出现504网关超时错误,而那些正在处理的累php-cgi遇到问题就会出现502坏网关错误。