Shell脚本如何监控Nginx服务状态

wen 实用脚本 1

我来介绍几种监控Nginx服务状态的Shell脚本方法:

Shell脚本如何监控Nginx服务状态

基础进程监控

#!/bin/bash
# 检查nginx进程是否存在
if pgrep -x nginx > /dev/null; then
    echo "Nginx 服务运行正常"
else
    echo "Nginx 服务未运行"
    # 启动nginx
    systemctl start nginx 2>/dev/null || /usr/local/nginx/sbin/nginx
fi

HTTP状态码检测

#!/bin/bash
# Nginx访问地址
URL="http://localhost"
# 检测超时时间(秒)
TIMEOUT=5
# 使用curl检测HTTP状态
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout $TIMEOUT $URL)
if [ "$HTTP_CODE" -eq 200 ] || [ "$HTTP_CODE" -eq 301 ] || [ "$HTTP_CODE" -eq 302 ]; then
    echo "Nginx 服务正常 (HTTP $HTTP_CODE)"
else
    echo "Nginx 服务异常 (HTTP $HTTP_CODE)"
fi

完整监控脚本(包含告警)

#!/bin/bash
# 配置参数
NGINX_BIN="/usr/sbin/nginx"  # nginx二进制路径
NGINX_PID="/run/nginx.pid"   # pid文件路径
CHECK_URL="http://localhost"  # 检测URL
LOG_FILE="/var/log/nginx_monitor.log"  # 日志文件
ALERT_EMAIL="admin@example.com"  # 告警邮箱
# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
# 发送告警
send_alert() {
    local subject="Nginx服务告警"
    local message="$1"
    echo "$message" | mail -s "$subject" $ALERT_EMAIL
    log "告警已发送: $message"
}
# 检查进程
check_process() {
    if [ -f "$NGINX_PID" ]; then
        PID=$(cat $NGINX_PID)
        if kill -0 $PID 2>/dev/null; then
            return 0
        fi
    fi
    if pgrep -x nginx > /dev/null; then
        return 0
    fi
    return 1
}
# 检查HTTP响应
check_http() {
    HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 $CHECK_URL)
    case $HTTP_CODE in
        200|301|302)
            return 0
            ;;
        *)
            return 1
            ;;
    esac
}
# 重启nginx
restart_nginx() {
    log "尝试重启Nginx服务"
    $NGINX_BIN -t >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        systemctl restart nginx 2>/dev/null || $NGINX_BIN -s reload
        sleep 2
        if check_process; then
            log "Nginx重启成功"
            return 0
        else
            log "Nginx重启失败"
            return 1
        fi
    else
        log "Nginx配置文件有误"
        return 1
    fi
}
# 主监控逻辑
main() {
    log "开始Nginx服务检查"
    # 检查进程
    if check_process; then
        log "Nginx进程运行正常"
    else
        log "Nginx进程未运行"
        send_alert "Nginx进程未运行,正在尝试重启"
        restart_nginx
        exit 1
    fi
    # 检查HTTP响应
    if check_http; then
        log "Nginx HTTP响应正常"
    else
        log "Nginx HTTP响应异常"
        send_alert "Nginx HTTP响应异常"
        # 尝试重启
        restart_nginx
        if [ $? -eq 0 ]; then
            log "重启后自动恢复"
        else
            send_alert "Nginx重启失败,需要人工干预"
        fi
    fi
}
# 执行主程序
main

使用systemd状态检查(CentOS 7+)

#!/bin/bash
# 检查nginx服务状态
SERVICE_STATUS=$(systemctl is-active nginx)
case $SERVICE_STATUS in
    active)
        echo "Nginx 服务状态: 运行中"
        ;;
    inactive)
        echo "Nginx 服务状态: 已停止"
        # 尝试启动
        systemctl start nginx
        if [ $? -eq 0 ]; then
            echo "Nginx 服务已启动"
        else
            echo "Nginx 启动失败"
        fi
        ;;
    failed)
        echo "Nginx 服务状态: 故障"
        systemctl restart nginx
        ;;
esac

定时监控脚本(crontab配置)

# 编辑crontab
crontab -e
# 添加以下行,每5分钟执行一次监控
*/5 * * * * /usr/local/bin/nginx_monitor.sh
# 每小时的第一次执行,并记录日志
0 * * * * /usr/local/bin/nginx_monitor.sh >> /var/log/nginx_cron.log 2>&1

资源使用监控

#!/bin/bash
# 监控nginx资源使用
MONITOR_LOG="/var/log/nginx_resource.log"
# CPU和内存使用率
CPU_USAGE=$(ps aux | grep nginx | grep -v grep | awk '{sum+=$3} END {print sum}')
MEM_USAGE=$(ps aux | grep nginx | grep -v grep | awk '{sum+=$4} END {print sum}')
CONNECTIONS=$(ss -tan | grep :80 | wc -l)
# 写入日志
echo "$(date '+%Y-%m-%d %H:%M:%S') CPU:${CPU_USAGE}% MEM:${MEM_USAGE}% CONN:${CONNECTIONS}" >> $MONITOR_LOG
# 异常告警
if [ $(echo "$CPU_USAGE > 80" | bc) -eq 1 ]; then
    echo "告警: Nginx CPU使用率超过80%"
fi
if [ $(echo "$MEM_USAGE > 80" | bc) -eq 1 ]; then
    echo "告警: Nginx 内存使用率超过80%"
fi

邮件告警配置

#!/bin/bash
# 安装mailx用于发送邮件
# CentOS: yum install mailx -y
# Ubuntu: apt-get install mailutils -y
# 配置邮件发送
send_mail() {
    local subject="$1"
    local body="$2"
    # 方式1:使用mail命令
    echo "$body" | mail -s "$subject" admin@example.com
    # 方式2:使用sendmail
    # echo -e "Subject: $subject\n\n$body" | sendmail -t admin@example.com
    # 方式3:使用curl发送企业微信/钉钉通知
    # curl -X POST https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY \
    #   -H 'Content-Type: application/json' \
    #   -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$subject: $body\"}}"
}

使用说明

  1. 设置执行权限

    chmod +x /path/to/nginx_monitor.sh
  2. 添加到系统服务(可选):

    # 创建系统服务
    cat > /etc/systemd/system/nginx-monitor.service << EOF
    [Unit]
    Description=Nginx Monitor Service
    After=network.target

[Service] Type=simple ExecStart=/path/to/nginx_monitor.sh Restart=always

[Install] WantedBy=multi-user.target EOF

启用服务

systemctl enable nginx-monitor systemctl start nginx-monitor


3. **测试脚本**:
```bash
# 手动测试
bash /path/to/nginx_monitor.sh
# 查看日志
cat /var/log/nginx_monitor.log

最佳实践建议

  1. 监控频率:生产环境建议1-5分钟检查一次
  2. 多维度监控:结合进程、端口、HTTP响应多方面检查
  3. 告警分级:设置不同级别的告警(警告、严重、紧急)
  4. 自动恢复:配置自动重启机制
  5. 日志管理:定期清理和归档监控日志
  6. 负载均衡:如果使用负载均衡,监控所有节点

选择适合你环境的监控方案,建议从简单开始,逐步完善监控策略。

抱歉,评论功能暂时关闭!