轻量监控:不装 Prometheus 也能知道机器什么时候出事

个人服务器装一整套 Prometheus + Grafana 有点重:吃内存、要维护。但其实我需要知道的就三件事:机器活着吗、磁盘还剩多少、站点能打开吗。用脚本就够了。

一、先做最基础的:日志别把磁盘写满

nginx
# /etc/logrotate.d/nginx(默认已有,确认一下)
/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    sharedscripts
    postrotate
        [ -f /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
    endscript
}
bash
logrotate -d /etc/logrotate.d/nginx   # 调试模式,看会做什么
logrotate -f /etc/logrotate.d/nginx   # 强制执行一次

# journald 也要限制
sudo journalctl --vacuum-size=300M

/etc/systemd/journald.conf 里设 SystemMaxUse=300M 可以一劳永逸。

二、磁盘与内存告警脚本

bash
#!/usr/bin/env bash
# /opt/scripts/watch.sh
THRESHOLD=80
usage=$(df -h / | awk "NR==2 {print $5}" | tr -d "%")

if [ "$usage" -gt "$THRESHOLD" ]; then
  echo "[$(date)] disk usage ${usage}% over ${THRESHOLD}%" >> /var/log/watch.log
  # 这里换成你自己的通知方式
  curl -s -X POST "https://your-notify-hook" \
    -d "disk ${usage}% on $(hostname)" > /dev/null
fi
bash
chmod +x /opt/scripts/watch.sh
crontab -e
*/10 * * * * /opt/scripts/watch.sh

三、站点可用性探测

bash
#!/usr/bin/env bash
# /opt/scripts/healthcheck.sh
URL="https://www.bzii.cn"
code=$(curl -o /dev/null -s -w "%{http_code}" --max-time 10 "$URL")
cost=$(curl -o /dev/null -s -w "%{time_total}" --max-time 10 "$URL")

if [ "$code" != "200" ]; then
  echo "[$(date)] site down, code=$code" >> /var/log/health.log
  systemctl restart nginx    # 简单的自愈尝试
fi

# 响应超过 3 秒也记一笔,慢也是故障
awk -v c="$cost" "BEGIN{exit !(c>3)}" && echo "[$(date)] slow: ${cost}s" >> /var/log/health.log

四、顺便看证书还剩几天

bash
#!/usr/bin/env bash
end=$(echo | openssl s_client -connect www.bzii.cn:443 -servername www.bzii.cn 2>/dev/null \
  | openssl x509 -noout -enddate | cut -d= -f2)
left=$(( ( $(date -d "$end" +%s) - $(date +%s) ) / 86400 ))
echo "证书剩余天数: $left"
[ "$left" -lt 15 ] && echo "证书即将过期!" >> /var/log/health.log

五、实时看机器状态

装个 btop 就够了,比 top 好看得多:

bash
apt install -y btop
btop

或者一行看关键指标:

bash
echo "负载: $(cat /proc/loadavg | cut -d" " -f1-3) | 内存: $(free -m | awk "NR==2{printf "%.0f%%", $3*100/$2}") | 磁盘: $(df -h / | awk "NR==2{print $5}")"

六、什么时候该上真监控系统

出现下面任一情况,就别自己写脚本了:

  • 机器超过 5 台,需要统一视图;
  • 需要看历史趋势(比如「上周三内存为什么涨了」);
  • 需要精细告警(5 分钟内连续 3 次失败才告警);
  • 需要监控应用内部指标(请求量、P99 延迟)。

那时候推荐:

方案特点
Prometheus + Grafana标准方案,吃资源,学习曲线陡
Netdata装一条命令,开箱即用的漂亮图表,单机很合适
Uptime Kuma轻量可用性监控,支持几十种通知渠道
Cloudflare / 云厂商自带零成本,够看基础指标

个人站点我现在用:Cloudflare 看流量 + 一个每日健康检查脚本 + Uptime Kuma 探测可用性。够用了。

七、别忘了告警渠道本身要可靠

告警发到哪?常见的选择:

  • Server 酱 / 企业微信机器人 / Telegram Bot:免费、可靠;
  • 邮件:容易被当垃圾邮件,但胜在有存档;
  • 短信/电话:付费,真出大事才用。

最后提醒:告警规则别设太敏感,否则你会习惯性忽略它们——那跟没监控一样。