用脚本监测nginx、mysql、php-fpm服务
我自己使用云服务器,可能会因瞬时连接数过多、或是云供应商自带的杀毒后台运行等导致内存不够用了,mysql服务就可能会被系统杀死,从而导致网站无法打开,影响了网站的运行。
为了避免自己没及时发现问题导致网站长时间处于宕机状态,可以使用定时任务触发脚本进行检测,若有服务不可用,则重启服务,服务虽有中断,但能在短时间内让服务尽快恢复。
我用的lnmp环境,使用了如下脚本:
#!/bin/bash
# ---------------------------
# 服务监控脚本
# 检测 nginx / php-fpm / mysql
# 异常自动重启并记录日志
# ---------------------------
LOG="/data/logs/check_services.log"
# 定义要检测的服务和启动命令(根据你的系统修改)
declare -A SERVICES
SERVICES=(
["nginx"]="nginx"
["php-fpm"]="php-fpm"
["mysql"]="mysql"
)
# 定义重启命令
declare -A RESTART_CMDS
RESTART_CMDS=(
["nginx"]="lnmp nginx restart"
["php-fpm"]="lnmp php-fpm restart"
["mysql"]="lnmp mysql restart"
)
# 时间戳函数
timestamp() {
date '+%Y-%m-%d %H:%M:%S'
}
# ---------------------------
# 循环检测每个服务
# ---------------------------
for SERVICE in "${!SERVICES[@]}"; do
CMD="${SERVICES[$SERVICE]}"
# 检测进程是否存在
if ! pgrep -f "$CMD" > /dev/null 2>&1; then
echo "$(timestamp) ❌ $SERVICE 未运行,尝试重启" >> $LOG
# 执行重启命令并记录输出
${RESTART_CMDS[$SERVICE]} >> $LOG 2>&1
if [ $? -eq 0 ]; then
echo "$(timestamp) ✅ $SERVICE 重启成功" >> $LOG
else
echo "$(timestamp) ⚠️ $SERVICE 重启失败,请手动检查" >> $LOG
fi
else
echo "$(timestamp) ✅ $SERVICE 正常运行" >> $LOG
fi
done
然后在crontab里加上:
*/5 * * * * /bin/bash /data/bash/check_services.sh >> /data/logs/check_services.log 2>&1
这样5分钟会检测一次,遇到nginx、mysql、php-fpm任意服务不可用时就重启该服务。
确认crontab是否正常执行,可以使用如下命令查看:
tail -f /var/log/syslog | grep CRON
下面是一个更简单暴力的监测方法,直接监视网站url,看状态码是否为200,否则直接重启服务:
#!/bin/bash
URL="https://www.yourdomain.com/"
TIMEOUT=10
# 使用 curl 检测 HTTP 状态码
HTTP_CODE=$(curl -o /dev/null -s -m $TIMEOUT -w "%{http_code}" $URL)
# 如果不是 200,就重启 lnmp
if [ "$HTTP_CODE" != "200" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') 网站访问异常,HTTP_CODE=$HTTP_CODE,执行 lnmp mysql restart" >> /data/logs/check_web.log
lnmp restart
else
echo "$(date '+%Y-%m-%d %H:%M:%S') 网站正常" >> /data/logs/check_web.log
fi
鄂公网安备 42050602000066号