PHP服务器架构大都是nginx proxy->nginx web->php-fpm,“Nginx 502 Bad Gateway”错误的含义是请求的PHP-CGI已经执行,但是由于读取资源问题等原因没有执行完毕,而导致PHP-CGI进程终止,一般来说“Nginx 502 Bad Gateway”错误和php-fpm.conf的设置有关。
问题原因
常见的原因可能是php-cgi进程数不够用、MySQL语句执行慢导致PHP执行时间长、或者是php-cgi进程异常中断,都会出现502错误。
1、使用nginx代理,而后端服务器发生故障;或者php-cgi进程数不够用;php执行时间长,或者是php-cgi进程死掉;已经fastCGI使用情况等都会导致502。
2、502 是指请求的php-fpm已经执行,但是由于某种原因而没有执行完毕,最终导致php-fpm进程终止。
一般来说,与php-fpm.conf的设置有关,也与php的执行程序性能有关,网站的访问量大,而php-cgi的进程数偏少。针对这种情况的502错误,只需增加php-cgi的进程数。
解决方案
针对不同的问题原因,提供以下不同的解决方法。当磁盘空间不足时,可以执行df -h
命令,查看磁盘使用量。
- 在Nginx安装后可正常访问网站的环境中,运行一段时间出现502错误码,一般默认php-cgi进程是5个,可能因为php-cgi进程不够用而造成502错误,需要修改
/usr/local/php/etc/php-fpm.conf
文件,将其中的max_children值适当增加。 - PHP执行超时,修改
/usr/local/php/etc/php.ini
文件,将max_execution_time改为300。
通常的排查方法如下。
查看nginx日志,查看php-fpm日志
1、依次执如下命令,查看php fastcgi的进程数,及max_children的值。
查看phpcgi进程数,如果接近预设值,说明不够用,需要增加:
netstat -anop | grep php-cgi | wc -l
netstat -anpo | grep php-fpm | wc -l
显示其他用户启动的进程(a)
查看系统中属于自己的进程(x)
启动这个进程的用户和它启动的时间(u)
grep:
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
-c 计算符合范本样式的列数。
系统显示类似如下。
2、执行如下命令,查看当前进程。
ps aux | grep php-fpm
系统显示类似如下,观察fastcgi、php-fpm进程数,假如使用的进程数等于或高于5个,说明需要增加。
3、修改/usr/local/php/etc/php-fpm.conf
配置文件中的相关参数,将pm.max_children参数的值修改为5,将request_terminate_timeout参数的值修改为60。
注:
设置”max_children” 也需要根据服务器的性能进行设定。每一个php-cgi进程数量也可以根据 内存/30M,比如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在 2G-3G的样子。max_children增多,则php-cgi的进程增多就会处理的很快,排队的请求就会很少。但是设置request_terminate_timeout执行的时间为60秒,request_terminate_timeout值可以根据服务器的性能进行设定。一般来说性能越好您可以设置越高,20分钟~30分钟都可以。
pm.max_children:静态方式下开启的php-fpm进程数量
pm.max_requests:php-fpm子进程能处理的最大请求数
pm.start_servers:动态方式下的起始php-fpm进程数量
pm.min_spare_servers:动态方式下的最小php-fpm进程数
pm.max_spare_servers:动态方式下的最大php-fpm进程数量
pm.max_children,pm.max_spare_servers 多大合适,这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。
4、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,内容类似如下。
看一下nginx.conf配置文件中Nginx的等待时间的设置,可以相应增加
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_connect_timeout 指定连接到后端FastCGI的超时时间。
fastcgi_send_timeout 是指nginx进程向fastcgi进程发送request的整个过程的超时时间
fastcgi_read_timeout 是指fastcgi进程向nginx进程发送response的整个过程的超时时间