网站可用性监控完整方案:UptimeRobot + 自建监控脚本 + 多渠道告警配置
网站宕机最怕的不是宕了,而是不知道宕了——用户已经流失几小时,你却浑然不知。完善的可用性监控让你在宕机的第一分钟就收到告警。本文给出从免费工具到自建方案的完整监控配置。
一、监控维度规划
| 监控维度 | 检测内容 | 推荐工具 | 告警阈值 |
|---|---|---|---|
| HTTP可用性 | 网站是否返回200状态码 | UptimeRobot / 自建脚本 | 连续2次失败触发告警 |
| SSL证书 | 证书是否即将过期 | UptimeRobot SSL监控 | 剩余<30天告警 |
| 服务器资源 | CPU/内存/磁盘使用率 | Prometheus + Grafana(见第25篇) | 超过85%告警 |
| 域名到期 | 域名是否即将到期 | 自建脚本 | 剩余<30天告警 |
| 关键词监控 | 页面是否包含特定内容 | UptimeRobot关键词监控 | 关键词消失则告警 |
| 端口监控 | SSH/数据库端口是否开放 | UptimeRobot端口监控 | 端口不通则告警 |
二、UptimeRobot免费配置
UptimeRobot提供每5分钟一次的监控检查,免费版支持50个监控项,足够大多数站长使用。
配置步骤
- 访问 uptimerobot.com 注册免费账号
- Add New Monitor → HTTP(S) Monitor
- 填写监控名称(如"主站首页")和URL(如
https://yourdomain.com) - 监控间隔:5分钟(免费版最短)
- Keyword Monitoring:勾选并填入关键词(如网站标题),确认页面内容正确
- 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内置状态页
- UptimeRobot Dashboard → Status Pages → Create Status Page
- 选择要显示的监控项
- 绑定自定义域名(如
status.yourdomain.com) - 在DNS中添加CNAME记录指向UptimeRobot提供的地址
自建轻量状态页(静态页面)
<code">
🟢 系统运行正常
更新时间:加载中...
主站(yourdomain.com)
检测中...
检测中...
API服务(api.yourdomain.com)
检测中...
检测中...
六、监控告警分级策略
| 级别 | 触发条件 | 通知渠道 | 响应时限 |
|---|---|---|---|
| P1 - 严重 | 主站完全宕机 | 电话 + 钉钉 + 邮件 | 15分钟内响应 |
| P2 - 高 | 核心功能(下单/支付)异常 | 钉钉 + 邮件 | 30分钟内响应 |
| P3 - 中 | SSL证书<30天、磁盘>85% | 邮件 | 工作日内处理 |
| P4 - 低 | 响应时间慢、次要功能异常 | 日报汇总 | 本周内处理 |
七、总结
可用性监控体系的核心是:外部监控(UptimeRobot)+ 自建脚本(多维度检测)+ 多渠道告警(钉钉+邮件)+ 状态页(用户自助查看)。IDC.Net的香港服务器稳定性高,配合完善的监控体系,可以实现99.9%以上的服务可用性,第一时间掌握服务器状态。
版权声明:
作者:后浪云
链接:https://idc.net/help/442802/
文章版权归作者所有,未经允许请勿转载。
THE END
