SRE 碎碎念:极简流量哨兵
推文发出去了。Twitterbot 开始疯狂抓取,Nginx 日志在翻滚。然后呢?
盯着 tail -f access.log 看两分钟还行,看两小时眼睛就废了。上 Prometheus + Grafana?为一个个人项目搭一整套监控栈,杀鸡用牛刀。我需要的是:一个哨兵,站在那里,没事别烦我,有事喊一声。
为什么不用大厂方案
Prometheus + Grafana + AlertManager,这套组合拳确实强。但对于一个个人服务器来说,它是过度工程。我的需求极其简单:过去 60 分钟内,独立访客 IP 有没有超过 100?超过了,告诉我。没超过,闭嘴。
一个 70 行的 Bash 脚本,加上 cron,加上一个 access.log。这就够了。
核心逻辑
脚本只做一件事:用 awk 扫描日志时间窗口,统计独立 IP。阈值到了,写告警标记,防止重复触发。没到,清掉标记,继续巡逻。
#!/bin/bash
# traffic-sentinel.sh — 极简流量哨兵
# 每5分钟由cron调度,监控独立访客数
THRESHOLD=100
WINDOW=60 # minutes
LOG_PATH="$HOME/javis-notes/logs/nginx/access.log"
ALERT_DIR="/tmp/traffic-sentinel"
ALERT_FILE="$ALERT_DIR/alert.flag"
mkdir -p "$ALERT_DIR"
# 解析参数
while [[ $# -gt 0 ]]; do
case $1 in
--threshold) THRESHOLD="$2"; shift 2 ;;
--window) WINDOW="$2"; shift 2 ;;
*) shift ;;
esac
done
# awk扫描时间窗口内独立IP
SINCE=$(date -d "-${WINDOW} minutes" '+%d/%b/%Y:%H:%M')
COUNT=$(awk -v since="$SINCE" '
$0 ~ since { ips[$1]=1 }
END { for (ip in ips) count++; print count+0 }
' "$LOG_PATH")
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
if [ "$COUNT" -ge "$THRESHOLD" ]; then
if [ -f "$ALERT_FILE" ]; then
echo "[sentinel] $TIMESTAMP — already alerted ($COUNT/$THRESHOLD)"
exit 0
fi
touch "$ALERT_FILE"
echo "[sentinel] $TIMESTAMP — 🚀 TRAFFIC SPIKE! $COUNT unique IPs"
else
rm -f "$ALERT_FILE" 2>/dev/null
echo "[sentinel] $TIMESTAMP — ${COUNT}/${THRESHOLD} patrol OK"
fi部署
一行 crontab 搞定,不依赖任何运行时:
*/5 * * * * ~/javis-notes/scripts/traffic-sentinel.sh \\
--threshold 100 --window 60 >> /tmp/traffic-sentinel/monitor.log 2>&1每 5 分钟巡逻一次,60 分钟滑动窗口,100 独立 IP 触发告警。没有 Docker 镜像,没有 Node.js 依赖,没有 YAML 配置文件。一个 .sh,一个 crontab,完事。
哲学
真正的监控不需要 1GB 的依赖包。几行 Bash 脚本 + 一个 access.log,就能给工程师足够的安全感。
这就是南硅谷实验室的运维美学——够用,且绝对可靠。
想要实测?
去 /lab 制造一点动静 →2026-04-12 · SRE碎碎念 · diffserv.xyz