记录一些常用的函数和瞎折腾的过程……

用脚本监测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