网站可用性监控完整方案:UptimeRobot + 自建监控脚本 + 多渠道告警配置

网站宕机最怕的不是宕了,而是不知道宕了——用户已经流失几小时,你却浑然不知。完善的可用性监控让你在宕机的第一分钟就收到告警。本文给出从免费工具到自建方案的完整监控配置。

一、监控维度规划

监控维度检测内容推荐工具告警阈值
HTTP可用性网站是否返回200状态码UptimeRobot / 自建脚本连续2次失败触发告警
SSL证书证书是否即将过期UptimeRobot SSL监控剩余<30天告警
服务器资源CPU/内存/磁盘使用率Prometheus + Grafana(见第25篇)超过85%告警
域名到期域名是否即将到期自建脚本剩余<30天告警
关键词监控页面是否包含特定内容UptimeRobot关键词监控关键词消失则告警
端口监控SSH/数据库端口是否开放UptimeRobot端口监控端口不通则告警

二、UptimeRobot免费配置

UptimeRobot提供每5分钟一次的监控检查,免费版支持50个监控项,足够大多数站长使用。

配置步骤

  1. 访问 uptimerobot.com 注册免费账号
  2. Add New Monitor → HTTP(S) Monitor
  3. 填写监控名称(如"主站首页")和URL(如 https://yourdomain.com
  4. 监控间隔:5分钟(免费版最短)
  5. Keyword Monitoring:勾选并填入关键词(如网站标题),确认页面内容正确
  6. Alert Contacts:配置告警接收方式

配置告警渠道

  • 邮件:默认支持,注册邮箱自动接收
  • Webhook:支持自定义HTTP回调,可接入钉钉、企业微信
  • Telegram:通过Bot接收告警
  • Slack:直接集成支持

UptimeRobot Webhook接钉钉

<code"># UptimeRobot → My Settings → Alert Contacts → Add Alert Contact
# Type: Webhook
# URL: https://你的中转服务/uptimerobot-to-dingtalk

# 中转服务(简单Node.js脚本)
const express = require('express');
const axios = require('axios');
const app = express();
app.use(express.json());

app.post('/uptimerobot-to-dingtalk', async (req, res) => {
    const { monitorURL, alertType, alertDetails } = req.body;
    const emoji = alertType === 2 ? '🔴' : '✅';
    const status = alertType === 2 ? '网站宕机' : '网站恢复';

    await axios.post(process.env.DINGTALK_WEBHOOK, {
        msgtype: 'text',
        text: {
            content: `${emoji} ${status}\n地址:${monitorURL}\n详情:${alertDetails}\n时间:${new Date().toLocaleString('zh-CN')}`
        }
    });
    res.json({ ok: true });
});

app.listen(3100);

三、自建HTTP监控脚本

自建监控不依赖第三方服务,可以从多个地理位置同时检测:

<code">#!/bin/bash
# /usr/local/bin/uptime-check.sh
# 每分钟运行,检测网站可用性

SITES=(
    "https://yourdomain.com|主站首页"
    "https://yourdomain.com/shop|商店页面"
    "https://api.yourdomain.com/health|API健康检查"
)

DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=你的Token"
LOG="/var/log/uptime-check.log"
STATE_DIR="/tmp/uptime-states"
mkdir -p "$STATE_DIR"

send_alert() {
    local message="$1"
    curl -s -X POST "$DINGTALK_WEBHOOK" \
        -H "Content-Type: application/json" \
        -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$message\"}}" \
        > /dev/null
}

for SITE_INFO in "${SITES[@]}"; do
    URL="${SITE_INFO%%|*}"
    NAME="${SITE_INFO##*|}"
    STATE_FILE="$STATE_DIR/$(echo $URL | md5sum | cut -d' ' -f1)"

    # 检测HTTP状态码和响应时间
    RESULT=$(curl -s -o /dev/null -w "%{http_code}|%{time_total}" \
        --connect-timeout 10 --max-time 30 "$URL")
    HTTP_CODE="${RESULT%%|*}"
    RESPONSE_TIME="${RESULT##*|}"

    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

    if [[ "$HTTP_CODE" == "200" || "$HTTP_CODE" == "301" || "$HTTP_CODE" == "302" ]]; then
        # 网站正常
        if [ -f "$STATE_FILE" ]; then
            # 之前是宕机状态,现在恢复了
            DOWN_SINCE=$(cat "$STATE_FILE")
            rm -f "$STATE_FILE"
            send_alert "✅ 网站已恢复\n名称:$NAME\n地址:$URL\n恢复时间:$TIMESTAMP\n宕机开始:$DOWN_SINCE"
        fi
        echo "$TIMESTAMP OK $HTTP_CODE ${RESPONSE_TIME}s $URL" >> "$LOG"
    else
        # 网站异常
        if [ ! -f "$STATE_FILE" ]; then
            # 首次检测到宕机
            echo "$TIMESTAMP" > "$STATE_FILE"
            send_alert "🔴 网站宕机告警\n名称:$NAME\n地址:$URL\n状态码:$HTTP_CODE\n时间:$TIMESTAMP"
        fi
        echo "$TIMESTAMP FAIL $HTTP_CODE $URL" >> "$LOG"
    fi
done
<code"># 添加到crontab,每分钟执行
* * * * * /usr/local/bin/uptime-check.sh

四、SSL证书到期监控

<code">#!/bin/bash
# /usr/local/bin/ssl-expiry-check.sh

DOMAINS=("yourdomain.com" "api.yourdomain.com" "mail.yourdomain.com")
WARN_DAYS=30
DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=你的Token"

for DOMAIN in "${DOMAINS[@]}"; do
    # 获取证书到期日期
    EXPIRY=$(echo | openssl s_client -connect "$DOMAIN:443" \
        -servername "$DOMAIN" 2>/dev/null \
        | openssl x509 -noout -enddate 2>/dev/null \
        | cut -d= -f2)

    if [ -z "$EXPIRY" ]; then
        echo "❌ 无法获取 $DOMAIN 的证书信息"
        continue
    fi

    EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
    NOW_EPOCH=$(date +%s)
    DAYS_LEFT=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 ))

    echo "$DOMAIN SSL证书还有 $DAYS_LEFT 天到期"

    if [ "$DAYS_LEFT" -lt "$WARN_DAYS" ]; then
        curl -s -X POST "$DINGTALK_WEBHOOK" \
            -H "Content-Type: application/json" \
            -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"⚠️ SSL证书即将到期\n域名:$DOMAIN\n剩余天数:$DAYS_LEFT 天\n到期时间:$EXPIRY\n请及时续签!\"}}"
    fi
done
<code"># 每天早上9点检查SSL证书
0 9 * * * /usr/local/bin/ssl-expiry-check.sh

五、搭建状态页(Status Page)

状态页是向用户公开展示服务运行状态的专用页面,让用户在出现问题时能主动查看状态而不是联系客服。

使用UptimeRobot内置状态页

  1. UptimeRobot Dashboard → Status Pages → Create Status Page
  2. 选择要显示的监控项
  3. 绑定自定义域名(如 status.yourdomain.com
  4. 在DNS中添加CNAME记录指向UptimeRobot提供的地址

自建轻量状态页(静态页面)

<code">



    
    
    
    

 

🟢 系统运行正常

 

更新时间:加载中...

 

主站(yourdomain.com)
检测中...

 

API服务(api.yourdomain.com)
检测中...

六、监控告警分级策略

级别触发条件通知渠道响应时限
P1 - 严重主站完全宕机电话 + 钉钉 + 邮件15分钟内响应
P2 - 高核心功能(下单/支付)异常钉钉 + 邮件30分钟内响应
P3 - 中SSL证书<30天、磁盘>85%邮件工作日内处理
P4 - 低响应时间慢、次要功能异常日报汇总本周内处理

七、总结

可用性监控体系的核心是:外部监控(UptimeRobot)+ 自建脚本(多维度检测)+ 多渠道告警(钉钉+邮件)+ 状态页(用户自助查看)。IDC.Net的香港服务器稳定性高,配合完善的监控体系,可以实现99.9%以上的服务可用性,第一时间掌握服务器状态。

THE END