自托管服务器的监控与磁盘自愈实践
监控的三层
- 存活层:端口可达、进程在跑(最粗但最关键)
- 资源层:CPU、内存、磁盘使用率、inode
- 业务层:关键接口响应时间、错误率
技术笔记类站点只需前两层就能覆盖绝大多数事故。
磁盘是头号杀手
ENOSPC(磁盘满)会导致构建失败、数据库写崩、日志截断。监控磁盘不能只看使用率,还要看 inode 与增长速度:
df -h # 空间
df -i # inode
du -x -h --max-depth=1 /var | sort -h # 定位大户
自愈脚本
把"发现满 -> 清理 -> 通知"写成一个轻量脚本,由 cron 分钟级触发:
#!/bin/bash
THRESH=85
USE=$(df --output=pcent / | tail -1 | tr -dc '0-9')
if [ "$USE" -ge "$THRESH" ]; then
journalctl --vacuum-time=7d
docker system prune -f
# 清理旧构建产物、日志
curl -s -X POST "$ALERT_URL" -d "disk $USE% on $(hostname)"
fi
注意:自愈脚本自身要幂等,且清理范围必须白名单化,绝不能 rm -rf 未限定目录。
外部探活
最便宜的外部探活是一个定时 curl:从另一台机器访问 http://域名/healthz,非 200 即告警。Nginx 侧为 healthz 单独放行:
location = /healthz { return 200 "ok"; }
经验
监控的价值不在"看到数字",而在"该发生时有人被叫醒"。没有告警通道的监控,只是自我安慰的仪表盘。