Uptime Kuma 自建站点监控告警实战:Docker 部署、探针设计与跨机监控防盲区

网站挂了两天你才知道,问题不在技术,在于没有监控

个人站长最容易犯的错,是把全部精力放在"把站建起来",却忘了"站挂了怎么第一时间知道"。现实往往是:证书过期了、磁盘写满了、PHP-FPM 进程死了、域名被墙了,你忙着做别的事,直到读者发邮件问"你的站怎么打不开",才发现已经宕了几个小时甚至两天。对靠站点流量吃饭的人来说,每一分钟不可用都是实打实的损失。

解决方案不需要花钱买商业监控。开源项目 Uptime Kuma 是一个颜值高、部署简单、功能完备的自建监控面板,支持 HTTP/TCP/Ping/DNS 等多种探针、支持多种告警渠道(Telegram、邮件、飞书、Webhook 等)、支持状态页。本文讲清楚用 Docker 十分钟把它跑起来、配置探针、接入告警,以及个人站长做监控时最容易忽略的几个盲区。

为什么选 Uptime Kuma

市面上自建监控的方案不少:Zabbix 太重、Prometheus + Grafana 强大但学习曲线陡、Netdata 偏性能指标而非可用性探测。Uptime Kuma 的定位很清楚——专注"服务活着吗 / 内容对吗 / 证书快过期了吗",用起来像商业的 UptimeRobot,但完全自托管、数据在自己手里、没有免费版限制。它有这些实用特性:

  • 探针类型丰富:HTTP(s)、TCP 端口、Ping、DNS 解析、关键词匹配、JSON 查询、推送心跳。
  • 告警渠道覆盖广:Telegram、Discord、Slack、邮件 SMTP、飞书、企业微信、Webhook、Gotify 等。
  • 每条探针可配置重试次数、心跳间隔、超时,避免误报。
  • 内置状态页(Status Page),可以对外展示你的服务状态。
  • 证书到期提醒、域名到期提醒(需配合相应检查)。

第一步:用 Docker 十分钟部署

Uptime Kuma 官方推荐 Docker 部署,配置和数据库都放在一个挂载卷里,升级和迁移都方便:

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

注意这里用 127.0.0.1:3001:3001 而不是 3001:3001,意思是只监听本机,不直接暴露到公网。监控面板本身含有你的服务器信息和配置,暴露到公网是安全隐患。正确的做法是前面挂一个 Nginx 反代,加上 HTTPS 和访问认证。反代配置示例:

server {
    listen 443 ssl http2;
    server_name status.example.com;

    ssl_certificate     /etc/letsencrypt/live/status.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/status.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;

        # 加一层基础认证,双保险
        auth_basic "Monitor";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

WebSocket 升级头(Upgrade / Connection)不能少,Uptime Kuma 的实时状态推送依赖 WebSocket,漏了会导致面板一直转圈。生成密码文件用 htpasswd -c /etc/nginx/.htpasswd youruser。

第二步:配置第一批关键探针

首次访问 https://status.example.com 会引导你创建管理员账号。登录后点"添加新的监控项",个人站最该先配这几类:

  1. 网站首页 HTTP(s):URL 填你的首页,方法 GET,期望状态码 200,心跳间隔 60 秒,重试 2 次。这是我最重要的探针——首页打不开一切都白搭。
  2. 关键接口 / 内容关键词:选 HTTP(s) - Keyword 类型,在响应里匹配一段你首页固定出现的文字(比如站名)。这一招能识别"页面返回 200 但实际是错误页 / 数据库连不上吐的空白页"的情况,比单纯看状态码可靠得多。
  3. 数据库端口 TCP:TCP 监控 127.0.0.1:3306,确认 MySQL 进程活着。端口通不代表查询正常,但能抓住进程崩溃的场景。
  4. 证书过期监控:HTTPS 类型探针会自动解析并提示证书剩余天数,提前 14 天告警,避免 Let's Encrypt 自动续期失败后临期才发现。
  5. 推送心跳(Push):给 cron 备份任务配一个 Push 探针,备份脚本跑成功后 curl 一下那个专属 URL。如果某天没收到心跳,说明备份悄悄失败了——这是最容易被忽视、后果最严重的一类故障。

第三步:接一条真正能叫醒你的告警

监控的价值 100% 取决于告警能不能及时到达你。Uptime Kuma 的告警配置分两步:先在"设置 - 通知"里添加一个渠道,再在探针里勾选它。推荐个人站长至少配一条即时通讯渠道:

  • Telegram:机器人推送最稳定,国内网络环境下也能通过代理到达。在 Telegram 里 @BotFather 建机器人拿 Token,获取你的 chat id 填进去即可。
  • 飞书 / 企业微信机器人:Webhook 方式,配置简单,适合国内使用。
  • 邮件 SMTP:作为兜底,但邮件容易被漏看,不建议作为唯一渠道。
  • Webhook / Gotify:进阶玩法,可以推送到你自己的服务或自建通知网关。

强烈建议配 两条不同渠道。单一渠道出问题(比如 Telegram 被墙、SMTP 被限流)时,你有第二道保险。告警本身的可靠性,就是整个监控体系的天花板。

个人站长最容易忽略的几个盲区

  • 监控服务器和被监控服务器是同一台:如果这台机器整机宕了,监控也一起死,你收不到任何告警。正确做法是把 Uptime Kuma 部署在另一台 VPS 上,监控你的主站。跨机器的可用性才是真正的可用性。
  • 只监控首页状态码:返回 200 不等于内容正常。一定要加关键词探针,或者对关键的动态接口单独探。
  • 心跳间隔太短造成误报:设成 30 秒且重试 0 次,网络一抖动就狂发告警,很快你就不看告警了。合理值:间隔 60 秒、重试 2~3 次。
  • 忘了监控"监控本身":如果 Uptime Kuma 进程挂了,你不会收到任何通知。可以再给它的状态页加一个外部免费监控(或另一台机器上的脚本)做兜底。
  • 不监控资源水位:硬盘、内存、inode 会在无声无息中被耗光,直到某天写不进去。Uptime Kuma 本身偏可用性,磁盘水位可以用一个简单的 cron + 告警 Webhook 或另配轻量脚本补齐。

用状态页对外建立信任

Uptime Kuma 内置的状态页功能对个人站长来说是个被低估的资产。你可以创建一个公开的状态页,只挂上几个对外服务的探针(首页、API、静态资源),给它一个好看的域名和主题色,然后在网站页脚放一个"服务状态"的链接。这带来的价值有两层:一是让读者知道"如果打不开,不是你的问题,是我们正在处理",减少无谓的困惑;二是出现故障时透明公开,反而比假装没事更能积累长期信任。状态页可以只暴露你想让用户看到的部分,内部的数据库端口、备份心跳这类探针不必放上去。

配置状态页时注意两件事:一是状态页的访问是公开的,别把含内部信息的探针名称写得太具体(比如别叫"10.0.0.5 生产库");二是可以给状态页单独设一个不暴露管理入口的域名,管理面板和状态页分离。这些细节没有技术门槛,但体现的是运营一个正经站点的专业度。

把监控纳入日常运维节奏

监控搭好之后,真正的功夫在于把它变成一个习惯而非一次性任务。建议给自己定几条简单的规则:收到告警后,无论多晚都先确认一下是真故障还是误报,并记录在案;每周抽十分钟看一眼状态页的历史,观察有没有周期性的小抖动被忽略;每次给网站做重大改动(换主题、改反代、升级 PHP)之后,主动刷新探针确认一切正常再离开。监控不是用来事后追责的,而是用来把故障窗口压缩到最短的工具。个人站长没有团队值班,唯一能替代"人盯着"的,就是一套配置得当、告警可靠、你真的会看它的监控体系。

为什么这套投入值得

搭好 Uptime Kuma 大约只花一个下午,却能在未来几年里持续救命:证书快过期了提前十几天提醒你、数据库半夜崩了立刻通知你、备份静默失败了第一时间暴露、CDN 配置改错导致全站 502 也在几分钟内被发现。对个人站长来说,可观测性不是大厂的奢侈品,而是独立站活下去的必需品。先让"站挂了你能知道"这件事成立,其他优化才有意义。

Last modification:October 4th, 2026 at 07:23 pm

Leave a Comment