问题背景
在 LNMP(Linux + Nginx + MySQL + PHP)环境中,网站偶尔会出现 "502 Bad Gateway" 错误。这通常是由于 PHP-FPM 进程池耗尽、进程崩溃或响应超时导致的。手动重启 PHP-FPM 服务可以临时解决问题,但更优的解决方案是配置一个自动监控和重启脚本。
自动监控重启脚本
以下是一个 Bash 脚本示例,它通过检查指定 URL 的 HTTP 状态码来判断服务是否正常。当检测到 502 错误时,脚本会自动重启 PHP-FPM 服务。
#!/bin/bash
# 请将以下网址替换为您需要监控的网站地址
CheckURL="https://your-website.com/"
# 使用 curl 获取 HTTP 状态码,设置超时时间为 10 秒
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
# 检测到 502 错误,重启 PHP-FPM 服务
# 根据您的系统,重启命令可能不同,常见的有:
systemctl restart php-fpm # Systemd 系统(推荐)
# /etc/init.d/php-fpm restart # SysVinit 系统
fi
脚本使用步骤
- 创建脚本文件:将上述脚本内容保存到服务器上,例如
/root/check_502.sh。请务必将脚本中的https://your-website.com/替换为您实际要监控的网站 URL。 - 赋予执行权限:使用以下命令为脚本添加可执行权限。
chmod +x /root/check_502.sh - 测试脚本:可以手动执行一次脚本,确保没有语法错误,并且路径和命令正确。
bash /root/check_502.sh
配置定时任务 (Cron)
为了让脚本定期自动执行,需要将其添加到系统的定时任务中。
- 编辑当前用户的定时任务:
crontab -e - 添加定时任务规则:在打开的编辑器中,添加以下一行。这表示每 5 分钟执行一次检查脚本。
*/5 * * * * /bin/bash /root/check_502.sh > /dev/null 2>&1说明:
> /dev/null 2>&1会将脚本的所有输出(包括错误信息)重定向到空设备,避免 Cron 发送不必要的邮件通知。如果您需要记录日志用于排查,可以将其修改为>> /var/log/check_502.log 2>&1。 - 重启 Cron 服务(可选):通常添加任务后会自动生效。如果您的系统需要,可以使用以下命令重启 cron 服务。
# 对于 Systemd 系统 systemctl restart crond # 或 systemctl restart cron # 对于 SysVinit 系统 service crond restart
补充说明与注意事项
- LNMP 一键安装包:如果您使用的是军哥的 LNMP 一键安装包,该包已内置了一个功能类似的脚本,路径通常为
/root/lnmp1.x/tools/check502.sh(请将1.x替换为您的实际版本号)。您可以直接使用并修改该脚本,无需从头创建。 - 服务重启命令:脚本中的重启命令应根据您的 Linux 发行版和初始化系统进行调整。现代 Linux 发行版(如 CentOS 7+/Ubuntu 16.04+)通常使用
systemctl restart php-fpm。较旧的系统可能使用/etc/init.d/php-fpm restart或service php-fpm restart。请使用systemctl status php-fpm或ps aux | grep php-fpm来确认服务名称。 - 根本原因排查:自动重启脚本是治标不治本的应急措施。频繁出现 502 错误通常表明服务器存在更深层次的问题,例如:
- PHP-FPM
pm.max_children等进程池配置不足。 - PHP 脚本执行超时(
max_execution_time)。 - 数据库连接缓慢或失败。
- 服务器内存或 CPU 资源不足。
建议在配置此脚本的同时,检查 PHP-FPM 和 Nginx 的错误日志(通常位于
/usr/local/php/var/log/和/usr/local/nginx/logs/),以定位并解决根本原因。 - PHP-FPM
- 脚本安全:请确保脚本存放于安全目录(如
/root/或/usr/local/bin/),并限制其权限,避免被未授权用户读取或修改。