要给一台 VPS 或几台 VPS 做轻量级服务器监控,老实说候选清单很短,而选哪一个取决于你想回答的问题。想知道机器健不健康,用 Beszel。想知道用户能不能打开你的网站,用 Uptime Kuma。想要一块跨地域的 VPS 机群面板,用 Nezha;只看当下的一台机器,用 Glances;想要故障时每秒一次的细节,用 Netdata。大多数人只需要其中一个,偶尔两个,很少需要一整套可观测性方案。
利益披露:我们开发 Termalin,它也是下面的选项之一。文中的开源工具均依据其公开文档描述,核对于 2026 年 10 月 15 日,而且其中有几个在一些对比项上明显胜出。
本文讲清楚每个工具监控什么、“轻量”到底要付出多少代价,以及搜索结果里排在前面的文章都略过的那些部分:当 VPS 本身挂掉时,谁来盯着监控;怎样不让告警变成噪声;一个小小的兜底脚本;以及如何监控一台没有开放端口的机器。
简短答案:哪个工具回答哪个问题
- Beszel——“我的机器还好吗?”一个中枢(hub)加上每台服务器上一个很小的代理。采集主机指标和 Docker 统计,告警可发往 Telegram 等。轻量级的默认之选。
- Netdata——“就在那一秒到底发生了什么?”每秒一次的指标,以及细到每个进程的深度数据。它是这里最吃数据的一个——而这正是它的意义所在。
- Uptime Kuma——“外面的世界能访问到我的服务吗?”HTTP、TCP、ping 和 DNS 探测,还带状态页。它不监控 CPU、内存或磁盘。
- Nezha(哪吒监控)——“我分布在不同服务商和地域的那一堆 VPS 怎么样了?”一块探针式面板,带网页终端,在多地域部署里很受欢迎。
- Glances——“这一台机器现在正在干什么?”一个实时视图,像
htop或btop,但屏幕上信息更多。不是告警工具。 - Termalin——“盯着我的服务器并在出事时通知我,不用额外装任何东西。”监控搭在你已经在用的那条 SSH 访问连接上。付费,并且有实打实的限制(见下文)。
“轻量”对服务器监控到底意味着什么
“轻量”通常被拿代理占用的内存来衡量,可那是个错的数字。要把整件事都算进去:
- 每台机器上的代理——通常是一个编译好的二进制文件,设计上就很小。
- 中枢或仪表盘——分量都压在这里:一个 Web 应用,往往还带一个数据库,得跑在某处并保持常开。
- 开放端口——每一个监听端口,都是你从此要承担的攻击面。
- 需要打补丁的容器和服务——又多了一样要永远保持更新的东西。
按这个标准,Beszel(一个代理 + 一个中枢容器)和 Uptime Kuma(一个容器)是真正轻量的。Netdata 每秒一次的采集,在 CPU 和存储两方面都是这一组里最吃资源的——这是它换取高精度所付的代价。而经典的“大套件”——Prometheus 加 node_exporter 加 Grafana 加 Alertmanager——是四个要部署、加固和打补丁的活件。它很出色,但它不轻量,对于一到二十台服务器来说,通常超出了需要。
候选工具
Beszel
一个中枢(基于 PocketBase)加上每台服务器上一个小巧的 Go 代理。代理有两种运行方式:中枢通过 SSH 在 45876 端口连上它,或者代理带着一个 token 通过 WebSocket 向外拨到中枢——后一种模式不需要任何入站端口,在 NAT 之后也能用。它读取主机指标和 Docker 容器统计,并对 CPU、内存、磁盘、带宽、温度和上下线状态发出告警,可发往 25+ 个渠道,包括 Telegram 和 ntfy。采用 MIT 许可;写作时文档停在 v0.21。要比拼纯粹的“我的机器健不健康”,这一个就是要被超越的标杆。
Netdata
每秒一次的指标,配一块信息密集的实时仪表盘,还有大量自动采集的每进程、每服务细节。代理免费,在你自己的主机上数量不限,并在本地提供自己的仪表盘。把各个代理串起来、负责分发通知的 Netdata Cloud,在 Community 档免费,最多 5 个接入节点;超过之后是 Homelab,$90/年(不限量,合理使用),或 Business,$4.50/节点/月,按年计费。当你在排查一次尖峰、而一分钟的平均值太粗时,就该用它。
Uptime Kuma
自托管的可用性监控工具:HTTP(s)、TCP、关键字、ping、DNS、push 和 Docker 容器探测,90+ 种通知服务,还有公开状态页。约 92k 个 GitHub star,MIT 许可。有一点要说清楚:Uptime Kuma 不采集主机的 CPU、内存或磁盘——它从外部监测服务是否响应。这让它成了主机指标工具的天然搭档,而不是替代品;人们搜“自托管的 Uptime Kuma 替代品”,真正的答案其实是“把 Kuma 和 Beszel 搭在一起”。
Nezha
一块面板,加一个代理:代理上报系统状态,执行 HTTP/TCP/ping 探测和证书到期检查,发出告警,运行计划任务,并给你一个通往每台主机的网页终端。代理向外拨到面板。在中文和韩文社区里,它是事实上的 VPS“探针”面板;当你有许多分散在不同服务商和地域的小 VPS、想用一个页面看全部时,它尤其出色。
Glances(以及 htop/btop)
Glances 是一个实时的单机视图:CPU、内存、磁盘、网络、进程等等一屏显示,通过 SSH 或一个可选的本地网页查看。和 htop、btop 一样,它回答“这台机器现在在干什么”,仅此而已——没有历史,也没有真正的告警。把它留在工具箱里做动手排查;别指望它来呼你。
对比表
| 工具 | 监控什么 | 告警与渠道 | 需要入站端口吗? | 价格 | 最擅长 |
|---|---|---|---|---|---|
| Beszel | 主机指标 + Docker 统计 | CPU/内存/磁盘/带宽/温度/状态;25+ 渠道(Telegram、ntfy) | WebSocket 模式不需要;SSH 模式需要(45876) | 免费,MIT(自托管) | 轻量级机群健康监控 |
| Netdata | 主机指标,每秒一次 | 内置告警;通过代理或 Cloud 发送通知 | 本地仪表盘在 19999;连 Cloud 的链路是出站的 | 代理免费;Cloud 免费至 5 个节点,之后 $90/年 或 $4.50/节点/月 | 高精度的故障细节 |
| Uptime Kuma | 可用性:HTTP/TCP/ping/DNS/push/容器(无主机指标) | 90+ 种服务;状态页 | 主动探测目标;仪表盘由你自己托管 | 免费,MIT(自托管) | 外部可用性 + 状态页 |
| Nezha | 系统状态 + HTTP/TCP/ping + 证书到期 | 告警、计划任务;网页终端 | 代理向外拨到面板 | 免费(自托管) | 多地域 VPS 面板 |
| Glances | 单台机器,实时 | 不是告警工具 | 本地;可选的网页视图 | 免费(自托管) | 当下的单台机器 |
| Termalin | 通过 Connector 采集主机指标(无需第二个代理) | 默认阈值告警;邮件、iOS 推送、Telegram、webhook | 不需要——Connector 仅出站 | Pro $10/月 或按年 $8/月;Team 每用户 $15 | 健康监控 + 告警,无需安装任何东西 |
VPS 挂了,谁来盯着监控?
这是大多数对比都略过的一个缺口。如果你的中枢或仪表盘就跑在它所监控的那台 VPS 上,那它会和这台 VPS 一起死——而一台死掉的服务器没法告诉你它死了。“服务器离线”恰恰是你最想要的那条告警,而它只有从第二个观察点才管用。
三种办法来覆盖它:
- 在另一个位置放第二台便宜的 VPS,由它来跑外部检查。我们就是这么做的:我们在一台单独的低成本 VPS 上跑 Uptime Kuma,它唯一的任务就是察觉主力机器什么时候不再应答。
- 一个免费的外部检查服务,从你的网络之外去 ping 你的公开端点。
- 一个托管服务,它判断“在不在线”的逻辑跑在不属于你的基础设施上,所以你的机器倒下时它还活着。
无论你选哪个,规则都很简单:检测“离线”的那个东西,绝不能住在那台会离线的机器上。
不会把你训练到对它视而不见的告警
一个一小时呼你十次的监控,一周之内就会被你静音,那时它比没有还糟。开箱即用的工具,往往要么在你写规则之前一声不吭,要么在你调教之前喋喋不休。无论哪种,要做的功课都一样:
- 一个问题出现时一条消息,解除时一条消息——而不是每五分钟提醒一次。
- 分组——同一分钟里的几个问题合成一条消息送达;真正严重的那条,仍然径直发出。
- 同一天不重复同一个问题,除非它严重且持续存在。
- 头一天保持安静,这样一台刚纳入监控的机器,不会把所有早已存在的失败单元和过期证书一股脑全砸给你。
- 按告警、按服务器分别静音,这样一个吵闹的检查项,不会逼你把一切都静音掉。
再挑一些有意义的阈值:磁盘 90% 警告、95% 严重,或预测在一天之内写满;inode 耗尽;发生 OOM kill;一个失败的 systemd 单元;一张 TLS 证书距到期还有 14 天(3 天时转为严重);以及“离线”要在几分钟之后才算,这样一次重启不会触发告警。无论你选哪个工具,这番调教才是监控真正的功课——比选工具更重要。
十行兜底方案:发往 Telegram 的磁盘空间告警
在你部署任何东西之前,用 cron、df 和 curl 就能覆盖 VPS 最常见的那一种故障——磁盘写满。当你还不想要一块仪表盘时,这就是“disk space alert script linux”和“server monitoring telegram alerts”的答案。
别把机密写进脚本,从环境变量里读取:
#!/usr/bin/env bash
# disk-alert.sh — warn via Telegram when a filesystem is too full.
set -euo pipefail
: "${TELEGRAM_BOT_TOKEN:?set TELEGRAM_BOT_TOKEN}"
: "${TELEGRAM_CHAT_ID:?set TELEGRAM_CHAT_ID}"
threshold="${DISK_THRESHOLD:-90}"
df -x tmpfs -x devtmpfs --output=pcent,target | tail -n +2 | while read -r pct mount; do
used="${pct%\%}"
[ "$used" -ge "$threshold" ] || continue
curl -fsS --max-time 15 \
--data-urlencode "chat_id=${TELEGRAM_CHAT_ID}" \
--data-urlencode "text=$(hostname): ${mount} is ${used}% full" \
"https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" >/dev/null
done
把真实的值放进一个只有 root 能读的文件里,绝不要放进脚本或 crontab:
# /etc/disk-alert.env — chmod 600, owned by root
export TELEGRAM_BOT_TOKEN=123456789:replace-with-your-bot-token
export TELEGRAM_CHAT_ID=987654321
export DISK_THRESHOLD=90
然后用 cron 每十五分钟跑一次。把下面这一行存成 /etc/cron.d/disk-alert(这种带用户名的格式,是给 /etc/cron.d/ 里的文件用的):
*/15 * * * * root . /etc/disk-alert.env && /usr/local/bin/disk-alert.sh
只要磁盘一直是满的,它就每十五分钟重复一次。对一个最后兜底的告警来说,这是故意的;如果太吵,就改成每小时跑一次。
用 @BotFather 建一个 bot,给它发一条消息,好让它能回复你,再从 getUpdates 里读一次你的 chat_id。整件事就这么多:没有代理,没有端口,没有仪表盘。它扩展不到几台机器以上,但它能逮住把大多数 VPS 搞垮的那种故障。
在 NAT、CGNAT 之后,或没有开放端口时的监控
一台在 NAT 或 CGNAT 之后的机器,没法接受入站连接,所以任何靠连接到机器来工作的监控都出局了。能用的那些都是同一个路数——由机器主动向外连接:
- WebSocket 模式下的 Beszel:代理向外拨到中枢,没有入站端口。(SSH 模式需要入站的
45876,这里要避开它。) - Netdata:代理到 Netdata Cloud 的链路是出站的。
- Uptime Kuma:用一个 push 监控——机器按计划去调用一个 Kuma URL,当调用停止时 Kuma 就告警。
- Termalin:Connector 仅出站,从不监听端口。
这个通用手法——以及为什么“让它向外连”是私有机器唯一安全的答案——在 SSH 穿越 NAT 无需端口转发(英文)里讲了,而家庭实验室的版本在 SSH 连接家里的 NAS 或服务器里。
Termalin 的位置——以及它不适用的地方
Termalin 的切入角度和上面这些工具不同:它根本不加一个监控代理。如果一台服务器已经装了 Termalin 的 Connector——就是你用来做无密钥 SSH 访问的那个仅出站、无入站端口的代理——那它就已经在被监控了。没有第二个代理:Termalin 每分钟通过 Connector 已经持有的那条连接,跑几条只读命令(/proc、df、ps 之类)。对机器的开销是几毫秒的 CPU,以及每分钟约 1 KB。
它读取的是常规的健康画面:CPU(含 iowait 和 steal)、负载与压力、内存与交换、磁盘空间与 inode、磁盘与网络 I/O、套接字与打开的文件、进程、容器、失败的服务、失败的 SSH 登录、待安装的安全更新、监听端口,以及带剩余到期天数的 TLS 证书。告警用的是默认阈值,不用写任何规则,而且生来就为了保持安静:进来一次、出去一次,分组,同一天不重复,头一天平静,还能按告警分别静音。告警发往邮件、iOS 推送、Telegram(一键接上 bot),以及 Slack 和 Discord 都接受的 webhook,用 HMAC-SHA256 签名。历史记录在 Pro 上是 90 天,在 Team 上是两年。
因为 AI 代理可以通过 Termalin 的托管 MCP 端点读取同样的数据(server_metrics 和 alerts_list),你也可以直接在 Claude 或 ChatGPT 里问一句“我的服务器怎么样了?”,答案就从已收集的数据里来。在网页终端里,选中输出里的一处错误,选择 解释选中内容:助手写出一段简短的大白话诊断,并在末尾给出几条只读的检查命令,点一下按钮就替你把它们敲进会话。完整的图景在服务器监控页面上。
下面是老实的限制,因为在其中好几项上,开源工具都胜过它:
- **没有外部可用性检查,也没有状态页。**这是一个主机指标加告警的工具,不是可用性监控——Uptime Kuma 仍然是它的补充。
- **不收集日志,也没有自定义指标。**它不是 Grafana/Prometheus 的替代品。
- 仪表盘目前只在网页控制台里,桌面应用里暂时没有——不过桌面应用确实会在它的状态栏里,以及在监控网格(英文)里,实时显示一台已连接主机的 CPU、内存和磁盘。
- **不是端到端加密。**这些数字以服务可读的形式存储,因为服务必须读取它们才能绘制图表、发出告警。
- **Free 版不提供。**它需要一个 Connector,而 Connector 属于 Pro($10/月,或按年付费 $8/月——每年 $96)和 Team(每用户 $15),并带有一个无需绑卡的 14 天 Pro 试用。
如果“免费且自托管”是硬性要求,那 Beszel 或 Uptime Kuma 就是你的答案,这是个合理的选择。Termalin 的适用面更窄:你本来就在用它做 SSH 访问,而你宁愿不去另起一套监控套件、再成天盯着它,只为了拿到健康图表和靠谱的告警。
按场景的推荐
- **一台业余玩的 VPS。**用 Beszel 看健康,或者如果你只怕磁盘写满,上面那个
cron脚本就够了。以后要是你跑了个公开网站,再加上 Uptime Kuma。 - 跨服务商的 5~20 台 VPS(Hetzner、Contabo、Hostinger,再加一两台 droplet)。用 Beszel 收指标,加 Uptime Kuma 看可用性,并把 Kuma 实例放在一台单独的机器上。如果你更想要一块带网页终端的面板,用 Nezha。如果你已经在用 Termalin 做 SSH,把它的监控打开,省掉那套额外的套件。
- **CGNAT 之后的家庭实验室。**任何仅出站的方案:WebSocket 模式的 Beszel、连 Cloud 的 Netdata,或一个 Kuma push 监控——见 NAT 穿越指南(英文)。
- **“我想让我的 AI 助手回答‘我的服务器怎么样’。”**这正是 Termalin 的场景:人看到的同一份数据,由 AI 代理通过 MCP 读取。
常见问题
**Netdata 免费吗?**代理免费,在你自己的主机上数量不限,带自己的本地仪表盘。Netdata Cloud 的 Community 档免费,最多 5 个接入节点;超过之后是 Homelab,$90/年,或 Business,$4.50/节点/月,按年计费。
**Uptime Kuma 监控 CPU、内存或磁盘吗?**不。Uptime Kuma 从外部检测服务是否响应——HTTP、TCP、ping、DNS、容器和 push。要看主机的 CPU、内存和磁盘,把它和 Beszel、Netdata 或 Termalin 搭在一起。
**Beszel 对比 Netdata——哪个更轻?**Beszel。它是每台机器一个小代理,加上一个中枢。Netdata 每秒采集,是这一组里最吃资源的;你选它是为了精度,不是为了轻。
**带 Telegram 告警的最佳免费 VPS 监控是哪个?**要看主机健康,Beszel 能发到 Telegram,而且自托管免费。要看可用性,Uptime Kuma 也能。想要一个免安装的临时方案,上面那个 cron + curl 脚本直接发到 Telegram,后台不跑任何东西。
**我怎么监控一台在 NAT 之后、或没有开放端口的 VPS?**用一个由机器向外连接的工具:WebSocket 模式的 Beszel、连 Cloud 的 Netdata 代理、一个 Kuma push 监控,或一个 Termalin Connector。它们都不需要入站端口。见 SSH 穿越 NAT 无需端口转发(英文)。
Termalin 是一款跨平台 SSH 客户端;在 Pro 和 Team 上,每一台装了 Connector 的服务器都会被监控,带有图表和默认阈值告警,机器上不额外安装任何东西——见服务器监控或下载它。