大流量的服务器经常出现502错误,占比在万分之一左右。
错误码502表示 bad gateway错误,跟踪相关的请求之后发现,基本都是后端php执行超时导致,如下:
[22-Jan-2017
13:20:57
] WARNING:
[pool
] child 1593
, script 'xx
.php'
(request: "GET /Website/contents/ContentAction.php"
) execution timed out
(10.609713 sec
), terminating
[22-Jan-2017
13:20:57
] WARNING:
[pool
] child 1593 exited on signal 15
(SIGTERM
) after 890.004041 seconds from start
[22-Jan-2017
13:21:45
] WARNING:
[pool
] child 1727
, script 'xx
.php'
(request: "GET /Website/contents/ContentAction.php"
) execution timed out
(10.502281 sec
), terminating
[22-Jan-2017
13:21:45
] WARNING:
[pool
] child 1727 exited on signal 15
(SIGTERM
) after 122.138616 seconds from start
在php.ini和php-fpm.conf中分别有这样两个配置项:max_execution_time和request_terminate_timeout。这两项都是用来配置一个PHP脚本的最大执行时间的。当超过这个时间时,PHP-FPM不只会终止脚本的执行,还会终止执行脚本的Worker进程。所以Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误。
除此之外,php的配置参数pm.max_requests如果过小的话,可能会出现fpm进程在一段时间内集中退出的情况,导致fpm进程数不够用,从而出现502错误。