【监控告警 01】VPS 监控与告警:CPU、流量、宕机怎么早发现

等用户投诉才发现有机器挂了,那是被动救火。本文用 Uptime Kuma 做外部探活、node_exporter + Prometheus + Grafana 看 CPU/内存/磁盘/流量,配 Telegram/邮件/Webhook 告警,讲清阈值怎么设、开源方案怎么选,并给出最小可行部署清单,让你在出事前就收到提醒。

延伸阅读

更多相关攻略推荐:Ollama AI系列(2):VPS上的AI推理与API应用Ollama AI系列(2):VPS上的AI推理与API应用【CPU选型 01】搭载 AMD Ryzen 9950X 的 VPSARM / Ampere 席卷 VPS:性价比真香还是兼容陷阱?Ollama AI系列(2):VPS上的AI推理与API应用

一、为什么要监控:被动救火 vs 主动预警

VPS 跑着跑着挂了,最糟的剧本是:用户群里炸了、老板电话来了,你才登上去看,发现 CPU 打满三天、磁盘早写满、证书半个月前就过期。这就是被动救火——你永远是最后一个知道出事的人。监控的目的不是"出了事再看",而是在用户感知之前就收到提醒,把故障掐在苗头里。一句话区分:uptime 告诉你"通不通",资源监控告诉你"为什么不通/快不通了"。两者叠起来才是完整的安全网。

很多人觉得小机器没必要上监控,其实恰恰相反——大厂有 SRE 团队兜底,个人和小团队全靠自己。一个 5 美元的监控机就能盯住十几台业务机,性价比极高。与其等宕机后手忙脚乱,不如花两小时把眼睛装上。下面给你一套从"能看"到"会叫"的最小可行方案。

再把话说透一点:监控省下的是真金白银。一次数据库盘写满导致站点停摆半天,按小站的转化算可能就是几百块广告和订阅收入打水漂,更别提 SEO 排名因为反复不可达被搜索引擎降权。而监控的边际成本几乎为零——一台独立小机器、几个开源容器,半年花销比一次故障损失还低。把监控当成"保险费"而不是"负担",心态就对了。另外一个常被忽视的点:监控数据本身就是容量规划的依据,你看三个月的流量曲线,才知道该什么时候升级配置、该不该加带宽,而不是拍脑袋。

二、Uptime Kuma:自建外部探活,机器挂没挂一眼看清

Uptime Kuma 是目前最火的自托管探活工具,开源、界面友好,最新稳定版是 2.x 系列(近期已到 2.5.0),默认跑在 3001 端口。它从外部周期性访问你的服务,所以哪怕你的 VPS 内部已经崩了、SSH 都登不上,只要它还能被网络访问,Kuma 就能告诉你"网站打不开了"。支持的探测类型很全:HTTP(s)、TCP 端口、Ping、DNS 记录、WebSocket、Docker 容器,甚至关键字和 JSON 查询(比如检查返回的页面里有没有某个词)。还能一键生成公开状态页,给用户看"当前服务正常"省去一堆投诉。

最稳的部署是用 Docker,而且监控机千万不要和被监控机放一起——你自己的机器挂了,监控也跟着挂,那叫自己骗自己。在一台独立的小机器上跑:

docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:2

跑起来后访问 http://监控机IP:3001,添加监控:选 HTTP 填你的域名,或选 TCP 填 IP:端口 探 SSH/数据库端口,间隔设 20 秒到 1 分钟都行。探活只解决"通不通",要搞清"为什么慢",得上资源监控。

顺手说几个实用细节。第一,Kuma 的状态页(Status Page)强烈建议开,把链接发给用户或挂在网站 footer,服务抖动时用户自己看一眼就知道"官方已知情在处理",能挡掉一大半"是不是挂了"的工单。第二,监控本身也要被监控:给 Kuma 也配一个外部心跳(比如再借一台机器 ping 它的 3001 端口),防止监控沉默失效你却以为天下太平。第三,通知别只挂一个渠道,Telegram 收即时推送、邮件留书面记录,双保险。最后提醒,Kuma 的数据目录用卷挂载了,迁移机器时把这个卷一起带走,历史和配置不会丢。

三、node_exporter + Prometheus + Grafana:看清 CPU/内存/磁盘/流量

这套是资源监控的黄金组合,三个角色分工明确。node_exporter 装在每台被监控的 VPS 上,负责把系统指标(CPU、内存、磁盘、网络流量、负载)暴露出来,默认监听 9100 端口;Prometheus 像个监控录像机,定时去各个 exporter 拉数据存起来;Grafana 把冷冰冰的数字画成漂亮的曲线和仪表盘。Uptime Kuma 说"挂没挂",这套说"为什么"。

在被监控机上装 node_exporter(Docker 方式最简单,避免和系统包冲突):

docker run -d --restart=always --name node-exporter \
  -p 127.0.0.1:9100:9100 \
  prom/node-exporter:latest

注意我把它绑在 127.0.0.1,再用反向代理或 Prometheus 所在机器通过隧道访问,避免 9100 裸奔到公网被扫。然后 Prometheus 的 prometheus.yml 里加抓取目标:

scrape_configs:
  - job_name: 'vps_nodes'
    static_configs:
      - targets: ['1.2.3.4:9100', '5.6.7.8:9100']

抓取间隔设 15 到 30 秒足够。Grafana 接上 Prometheus 数据源后,导入社区现成的 Node Exporter 仪表盘模板(模板 ID 如 893 一类),CPU、内存、磁盘 I/O、网络流量曲线就全有了。看到磁盘快满、内存泄漏、流量异常飙高,你比用户早半天发现问题。

新手面对一堆图表容易懵,先盯四个最要命的指标就够了:磁盘使用率(写满直接服务崩,优先级最高)、内存可用量(持续走低往往是泄漏,不是业务增长)、CPU 负载(load average 长期高于核心数说明排队严重)、网络出入流量(出网突增常是被挖矿或遭攻击,入网突增可能是被刷)。这四个指标配好告警,就能拦住八成以上的突发故障。剩下的像磁盘 I/O 等待、TCP 重传率属于进阶项,等你有精力再细看。记住,监控不是图表越多越好,是"出事前能提醒你的那几个"够准够早。

四、日志与告警渠道:Telegram / 邮件 / Webhook

监控能看还不够,得"会叫"。Uptime Kuma 的通知渠道非常丰富,官方支持 Telegram、Discord、Slack、Pushover、邮件(SMTP),外加 90 多种第三方通知服务,也包括 Webhook。实际用下来最顺手的是 Telegram:手机秒推、能回看历史、免费;邮件适合留档但慢;Webhook 最灵活,可以转发到你自己的飞书/钉钉/企业微信机器人,或触发自动化脚本。

在 Kuma 的"通知"里新建一个 Telegram,按提示找 @BotFather 建机器人拿到 token,再填你的 chat_id 即可。Prometheus 一侧的告警则由 Alertmanager 或 Grafana 内置告警负责,同样能推到 Telegram、邮件、Webhook。一个实用建议:把 uptime 告警和性能告警分到不同频道(比如 #宕机 和 #性能),半夜被叫醒时一眼知道是"挂了"还是"只是慢了"。

五、阈值怎么设:别让你的手机被告警轰炸

新手最容易犯的错是两个极端:要么阈值设太低,CPU 一抖就狂响,三天后你直接静音,真出事反而漏了;要么设太高,机器都冒烟了才提醒。靠谱的设法是分层 + 持续时长。比如 CPU:持续 5 分钟高于 85% 才告警(避免瞬时抖动误报);内存:可用低于 10% 且持续 10 分钟;磁盘:用量超过 85% 就提醒,到 95% 升为紧急;流量:单日出网突增 3 倍以上,警惕被挖矿或被打。Grafana 告警规则示例(YAML 思路):

alert: HighCpuUsage
expr: 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 5m
labels:
  severity: warning
annotations:
  summary: "CPU 持续 5 分钟高于 85%"

关键在 for: 5m——必须持续满足条件才触发,过滤掉尖峰。告警文案写清楚"是什么、在哪台、持续多久",收到就能直接动手,不用再猜。宁可少而准,不要多而吵。

六、开源方案对比与最小可行部署

市面上监控方案一大把,给你一张取舍表。商业 SaaS(Datadog、Pingdom)开箱即用但按主机/指标计费,三台机器一年能到几百美元;Uptime Kuma 专攻探活和状态页,轻量免费,但不看系统内部指标;Prometheus + Grafana 是资源监控的事实标准,强但组件多一点;Netdata 开箱最猛,秒级图表但长期存储弱;厂商自带面板(CloudConeRackNerdVultr 后台都有基础图表)零成本但只看单机、无跨机聚合也无灵活告警。

给你一套最小可行部署(MVP):在一台独立的 5 美元小机器上跑 Uptime Kuma(盯宕机和状态页)+ node_exporter/Prometheus/Grafana(盯资源),被监控机只装 node_exporter 并把 9100 限绑内网。初期甚至可以先只上 Uptime Kuma,半天搞定,先把"挂没挂"解决;有余力再加 Grafana 看趋势。记住一条铁律:监控机独立部署,不然被监控机和监控机一起没,等于没监控。成本?一台监控机钱,换来的是睡安稳觉。

给你一张可以直接照做的落地清单:① 开一台独立小机器,装 Docker;② 跑 Uptime Kuma 容器,用 Nginx/Caddy 反代到子域名并上 HTTPS(别让 3001 裸奔公网);③ 给 Kuma 配 Telegram 通知,建机器人拿 token 和 chat_id;④ 在被监控机装 node_exporter,端口只绑内网或走隧道;⑤ 跑 Prometheus + Grafana,导入 Node Exporter 仪表盘模板;⑥ 按第五节的分层阈值加告警规则;⑦ 把 uptime 和性能告警分到不同频道;⑧ 每月故意停一台测试机,验证告警真的能响。做完这八步,你的 VPS 就从"瞎子"变成"装了报警器的人"。

💡 Read More: For deeper dives into infrastructure and architecture, visit our VPS Guide Hub for comprehensive strategies.