风车云

Shell 脚本监控 Nginx 502 Bad Gateway 自动重启 php-fpm

Nginx 502 Bad Gateway 错误表示请求的 PHP-CGI 已经执行,但是由于读取资源问题等原因没有执行完毕,而导致 PHP-CGI 进程终止。常见原因可能是 php-cgi 进程数不够用、MySQL 语句执行慢导致 PHP 执行时间长、磁盘空间不足、内存不足或者是 php-cgi 进程异常中断,都会出现 502 错误。

「Shell 脚本监控 Nginx 502 Bad Gateway 自动重启 php-fpm:https://ae.mba/38」

Shell 脚本监控 Nginx 502 Bad Gateway 自动重启 php-fpm

此脚本可暂时解决 php-fpm 偶尔因为内存不足等挂掉导致的 Nginx 502 Bad Gateway 错误。

需确保 VPS 系统已安装 curl, CentOS 可以执行:yum install curl ;Debian/Ubuntu 可以执行:apt-get install curl 安装。

「Shell 脚本监控 Nginx 502 Bad Gateway 自动重启 php-fpm:https://ae.mba/38」

用 WinSCP 或 ssh 登录 VPS 使用 vi 命令在/root 目录下创建 check502.sh 脚本,代码如下:

#!/usr/bin/env bash

CheckURL="https://example.com/wp-admin/"

STATUS_CODE=`curl -o /dev/null -m 10 --connect-timeout 10 -s -w %{http_code} $CheckURL`
#echo "$CheckURL Status Code:\t$STATUS_CODE"
if [ "$STATUS_CODE" = "502" ]; then
systemctl restart php-fpm.service
fi

如果想记录一下 php-fpm 重启日志,可以使用下面的代码(需要在 check502.sh 脚本同目录下创建 502log.txt 文件):

#!/usr/bin/env bash

CheckURL="https://example.com/wp-admin/"

STATUS_CODE=`curl -o /dev/null -m 10 --connect-timeout 10 -s -w %{http_code} $CheckURL`
#echo "$CheckURL Status Code:\t$STATUS_CODE"
if [ "$STATUS_CODE" = "502" ]; then
systemctl restart php-fpm.service
echo -e $(date) ":502 & restart php-fpm" >> 502log.txt
fi

其中 https://example.com/wp-admin/ 改为实际需要监控地址,需要注意如果开启了缓存,缓存页面就算 php 挂了,也不会马上出 502 状态 —— 缓存失效前都还可以正常访问,此时 http 状态码是 200。

「Shell 脚本监控 Nginx 502 Bad Gateway 自动重启 php-fpm:https://ae.mba/38」

CentOS Stream release 8 使用 OneinStack 安装的 LNMP 使用 systemctl restart php-fpm.service 可正常重启 php-fpm,而使用 service php-fpm restart 在 SSH 中执行可正常运行,在定时任务中无法正常工作

Debian / Ubuntu 系统可尝试使用 /etc/init.d/php-fpm restart

修改权限:

「Shell 脚本监控 Nginx 502 Bad Gateway 自动重启 php-fpm:https://ae.mba/38」
chmod +x /root/check502.sh

用 crontab 一分钟执行一次 /root/check502.sh,crontab -e 添加如下任务:

*/1 * * * * /root/check502.sh

附:其他 Nginx 502 Bad Gateway 错误解决方法

磁盘空间不足时,可以执行 df -h 命令,检查磁盘使用量,清理不需要文件即可。

PHP 执行超时导致,可修改 /usr/local/php/etc/php.ini 配置文件,尝试将 max_execution_time 改为 300

Nginx 安装后可正常访问网站,运行一段时间出现 502 错误,有可能因为 php-cgi 进程不够用而出现 502 错误,可尝试修改 /usr/local/php/etc/php-fpm.conf 配置文件,将 max_children 值适当增加。

依次执如下命令,可检查 php fastcgi 进程数及 max_children 值:

netstat -anop | grep php-cgi | wc -l
netstat -anpo | grep php-fpm | wc -l

参考资料:

Nginx 502 Bad Gateway 自动重启脚本

How do you restart php-fpm?

退出移动版