一份实用的分步指南:从外部监控服务器正常运行时间、从内部观测健康状况,并在出现故障时几秒内收到告警——全部使用 Skyline Cloud VPS 上免费、开源的工具。
“正常运行时间监控”到底是什么意思
正常运行时间监控回答的是两个不同的问题,而要运行一项可靠的服务,这两个问题你都需要关注:
- 我的服务器从外部能否访问?(外部/黑盒监控)——通过互联网访问的真实客户端能否得到健康的响应?
- 我的服务器内部是否健康?(内部/白盒监控)——CPU、内存、磁盘,以及 Nginx、MySQL 或你的应用进程等单个服务。
外部检查能捕捉到用户能看到的中断。内部检查则能捕捉到这些中断的_根本原因_——磁盘被占满、进程失控、swap 频繁换页——往往在它们演变成服务中断之前就能被发现。本指南将在一台 Linux VPS 上同时设置这两种监控,外加能在几秒内通知你的告警。文中命令假定运行在 Skyline Cloud 服务器上的 Ubuntu 22.04/24.04 或 Debian;对于 AlmaLinux/RHEL,请相应调整软件包名称。
第 1 步——外部正常运行时间检查
最简单的外部检查,就是从你服务器_之外_的一台机器发起一个 HTTP 请求。在另一台主机(或你的笔记本电脑)上运行下面的命令,确认网站能够响应:
curl -sS -o /dev/null -w "HTTP %{http_code} in %{time_total}s\n" \
https://example.com/
健康的结果看起来像 HTTP 200 in 0.184s。如果不想自己写代码就实现持续监控,可以使用 UptimeRobot 这类托管检查服务,或者 Uptime Kuma 这类自托管方案。自托管能让你的监控数据保留在境内——这对 PDPL 与 NCA 合规对齐很有帮助。
使用 Docker 将 Uptime Kuma 运行在一台_独立的、小型_ VPS 上(绝不要放在它所监控的那台服务器上):
docker run -d --restart=always \
-p 3001:3001 \
-v uptime-kuma:/app/data \
--name uptime-kuma louislam/uptime-kuma:1
打开 http://<monitor-ip>:3001,创建你的管理员账户,然后点击 Add New Monitor(添加新监控项):
- Monitor Type(监控类型): HTTP(s)
- URL:
https://example.com/health(使用轻量级的健康检查端点,而不是首页) - Heartbeat Interval(心跳间隔): 60 秒
- Retries(重试次数): 2(避免因单次抖动就触发告警)
- Accepted Status Codes(可接受的状态码):
200-299
始终监控一个专用的 /health 端点,该端点要能确认你的应用_及其_数据库都正常运行,而不仅仅是 Web 服务器能返回一个页面。
第 2 步——使用 node_exporter 和检查脚本进行内部健康监测
对于单台服务器,你并不需要一整套 Prometheus 技术栈。一个由 cron 或 systemd 定时器运行的简短脚本就能覆盖基本需求。创建 /usr/local/bin/health-check.sh:
#!/usr/bin/env bash
set -euo pipefail
THRESH_DISK=90 # percent
THRESH_MEM=90 # percent
WEBHOOK="https://hooks.example.com/your-webhook"
alert() {
curl -fsS -X POST -H 'Content-Type: application/json' \
-d "{\"text\":\"[$(hostname)] $1\"}" "$WEBHOOK" || true
}
# Disk usage on /
disk=$(df --output=pcent / | tail -1 | tr -dc '0-9')
[ "$disk" -ge "$THRESH_DISK" ] && alert "Disk at ${disk}% on /"
# Memory usage
mem=$(free | awk '/Mem:/ {printf "%d", $3/$2*100}')
[ "$mem" -ge "$THRESH_MEM" ] && alert "Memory at ${mem}%"
# Critical service must be active
for svc in nginx mysql; do
systemctl is-active --quiet "$svc" || alert "Service $svc is DOWN"
done
赋予它可执行权限并进行测试:
sudo chmod +x /usr/local/bin/health-check.sh
sudo /usr/local/bin/health-check.sh
用 systemd 定时器来调度它——在日志记录和漏跑处理方面,它比 cron 更可靠。创建 /etc/systemd/system/health-check.service:
[Unit]
Description=Server health check
[Service]
Type=oneshot
ExecStart=/usr/local/bin/health-check.sh
以及 /etc/systemd/system/health-check.timer:
[Unit]
Description=Run health check every 2 minutes
[Timer]
[Install]
WantedBy=timers.target
启用它:
sudo systemctl daemon-reload
sudo systemctl enable --now health-check.timer
systemctl list-timers health-check.timer
如果需要更丰富的指标和历史数据,可以安装 Prometheus node_exporter,它会在 9100 端口上将 CPU、内存、磁盘和网络以指标的形式暴露出来:
sudo apt update && sudo apt install -y prometheus-node-exporter
sudo systemctl enable --now prometheus-node-exporter
curl -s http://localhost:9100/metrics | head
将它绑定到 localhost,或在防火墙中限制 9100 端口,以确保这些指标不会对外公开:
sudo ufw allow from <monitor-ip> to any port 9100 proto tcp
第 3 步——能真正触达你的告警
只有当告警快速到达、并且通过不止一个渠道送达时,它才是有用的。至少配置两个渠道,这样单个故障的服务商不会让你完全收不到通知。
| 渠道 | 适用场景 | 时延 | 备注 |
|---|---|---|---|
| 邮件 | 审计留痕、非紧急 | 数秒至数分钟 | 使用真正的 SMTP 服务,而不是服务器本身 |
| Webhook(Slack/Teams) | 团队可见性 | 数秒 | 容易接入上面的脚本 |
| 短信 / 推送 | 真正的紧急情况 | 数秒 | 仅保留给“网站宕机”这类情况 |
务必通过专门的 SMTP 中继发送告警邮件——绝不要依赖被监控服务器自己的邮件功能,因为如果服务器宕机了,它就无法向你发出警告。可以使用企业邮箱托管或任何 SMTP 服务商。一个基于 msmtp 的最简邮件告警示例:
sudo apt install -y msmtp msmtp-mta
printf 'Subject: ALERT %s\n\n%s\n' "$(hostname)" "Disk high" \
| msmtp -a default you@example.com
在 Uptime Kuma 中,于 Settings → Notifications(设置 → 通知)下添加通知方式(邮件/SMTP、Slack、Telegram 或通用 webhook),并将它们附加到每一个监控项上。
第 4 步——调优阈值,避免告警疲劳
糟糕的告警比没有告警更糟——人们会学会无视它。请遵循以下规则:
- 在告警前要求连续 2 次以上检查失败(即
Retries设置),以忽略瞬时抖动。 - 针对用户能感知的症状告警,比如 HTTP 5xx 或高延迟,而不是针对每一项内部指标。
- 设置合理的阈值:磁盘 90%、内存持续 90%、延迟超过你平时的 p95。
- 发送恢复通知,以便你知道问题何时已解除。
- 每月复盘告警,删除或调优任何“狼来了”式的误报。
验证整条链路
在你真正依赖告警之前,要对告警路径进行端到端测试。临时调低某个阈值,或停止某个非关键服务:
sudo systemctl stop nginx # triggers the service-down alert
# confirm the alert arrives, then:
sudo systemctl start nginx
如果告警在几分钟内出现在你的收件箱和聊天工具中,那么你的监控就是真实有效的。未经测试的告警链路,等同于完全没有监控。
总结
现在你已经拥有了外部正常运行时间检查、通过 systemd 定时器与 node_exporter 实现的内部健康监控,以及经过你亲自验证的多渠道告警。请让你的监控主机与它所监控的服务器保持分离,让数据保留在境内以满足 PDPL 与 NCA 合规,并随着流量增长而重新审视各项阈值。
需要一台可靠的、位于境内的 VPS 来托管你的应用和监控技术栈——还配有本地阿拉伯语支持和透明的定价?创建你的 Skyline Cloud 账户,几分钟即可完成部署。
Comments
0 total · 0 threads