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

基础进程监控
#!/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\"}}"
}
使用说明
-
设置执行权限:
chmod +x /path/to/nginx_monitor.sh
-
添加到系统服务(可选):
# 创建系统服务 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-5分钟检查一次
- 多维度监控:结合进程、端口、HTTP响应多方面检查
- 告警分级:设置不同级别的告警(警告、严重、紧急)
- 自动恢复:配置自动重启机制
- 日志管理:定期清理和归档监控日志
- 负载均衡:如果使用负载均衡,监控所有节点
选择适合你环境的监控方案,建议从简单开始,逐步完善监控策略。