小服务器监控:不用 Zabbix,几个脚本也够

米阳 2025-11-8 4 11/8

只有一两台机器的时候,上一套 Zabbix 或 Prometheus + Grafana 有点重。用几个脚本 + 告警,能覆盖绝大多数「出事前能发现」的需求。

要监控什么

按重要性排:

  1. 服务是否活着(HTTP 200)
  2. 磁盘使用率
  3. 内存和负载
  4. 证书到期时间
  5. 备份是否成功
  6. 数据库连接数、慢查询

这六项覆盖了个人站点 90% 的故障场景。

最简实现

#!/bin/bash
# /root/monitor/check.sh
ALERT=""

# 1. HTTP
code=$(curl -s -o /dev/null -w '%{http_code}' -m 10 https://kb.mi-blog.cn/)
[ "$code" != "200" ] && ALERT="$ALERT\n站点返回 $code"

# 2. 磁盘
use=$(df / | awk 'NR==2 {gsub(/%/,""); print $5}')
[ "$use" -gt 85 ] && ALERT="$ALERT\n磁盘使用 ${use}%"

# 3. 内存
mem=$(free | awk '/Mem:/ {printf "%.0f", $3/$2*100}')
[ "$mem" -gt 90 ] && ALERT="$ALERT\n内存使用 ${mem}%"

# 4. 负载
load=$(awk '{print int($1)}' /proc/loadavg)
cpu=$(nproc)
[ "$load" -gt $((cpu * 2)) ] && ALERT="$ALERT\n负载 $load($cpu 核)"

# 5. 证书剩余天数
days=$(( ($(date -d "$(openssl s_client -connect kb.mi-blog.cn:443 -servername kb.mi-blog.cn 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)" +%s) - $(date +%s)) / 86400 ))
[ "$days" -lt 15 ] && ALERT="$ALERT\n证书剩余 ${days} 天"

# 6. 服务
systemctl is-active --quiet kb-web || ALERT="$ALERT\nkb-web 未运行"

if [ -n "$ALERT" ]; then
  echo -e "[$(hostname)] 告警:$ALERT" | mail -s "服务器告警" you@example.com
fi

cron 每 5 分钟跑一次。

告警渠道

邮件容易被忽略,国内更实用的是:

  • 企业微信/钉钉机器人 webhook
  • Server 酱推送到微信
  • Telegram Bot

webhook 最简单:

curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx" \
  -H 'Content-Type: application/json' \
  -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$(echo -e $ALERT)\"}}"

加一份历史数据

只告警看不到趋势。把每次采集的结果追加到 CSV,用的时候能画图:

echo "$(date +%F_%T),$use,$mem,$load,$code" >> /root/monitor/metrics.log

出问题时回头看「什么时候开始变差的」,比看单点数值有用得多。

别做的事

  • 不要每分钟查一次全站,自己给自己制造压力
  • 不要告警风暴,同一个问题连续告警会让人麻木。加个状态去重:上次已告警且未恢复,就跳过
  • 不要只监控不处理,告警没人看等于没监控

一个心态

监控的价值不是「画得漂亮」,是「出事之前有人知道」。哪怕只有一条 curl 检查,只要真的会通知到人,就比一堆没配告警的仪表盘有用。

- THE END -

米阳

11月08日21:10

最后修改:2025年11月8日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论