海天无影's Blog

lnmp出现502 Bad Gateway报错

/ 2评 / 0

之前海天使用dnspod检测服务器的运行情况,今天突然碰到了短暂的502 Bad Gateway报错,虽然时间不长,但感觉还是不爽啊。于是上网找了,原来是php执行过程造成的问题,主要和进程数以及进程执行时间有关。按照网上说的改了下,运行一段时间看看效果。顺便把相关的内容备份下来。


一般出现502 Bad Gateway报错,首先查看当前的PHP FastCGI进程数是否够用:

netstat -anpo | grep "php-cgi" | wc -l

如果还不行就要修改timeout的时间了,两个参数的修改都在php-fpm.conf文件里,文件目录为:/usr/local/php/etc/php-fpm.conf。其中一个是”max_children”,另一个是”request_terminate_timeout”

max_children就是进程数了,计算的方式如下:

max_children这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。但是设置max_children也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的max_children我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果lnmp默认的的max_children设置的较小,只有5个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。

如果你的服务器性能足够好,且宽带资源足够充足,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 Bad gateway这个错误。

max_requests即是说每个进程若超过这个数目(跟php进程有一点点关系,关系不大),就自动杀死。

发表评论

电子邮件地址不会被公开。