nginx — алерт при провале cache-hit-ratio (proxy_cache)
nginx proxy_cache hit-ratio упал — backend начинает гореть. Часто это «забыли в новой локации добавить proxy_cache_valid», или cache wiped, или TTL коротковат.
Рецепт
#!/usr/bin/env bash
# /etc/cron.d/nginx-cache
# */1 * * * * root /opt/nginx-cache.sh
LOG=${LOG:-/var/log/nginx/access.log}
WINDOW=60 # last 60 s
MIN_HITS_PCT=${MIN_HITS_PCT:-50} # alert when HIT < 50 % of total
SINCE=$(date -d "-${WINDOW} seconds" '+%d/%b/%Y:%H:%M:%S')
# Assumes $upstream_cache_status is in the access log format ($cs)
read TOTAL HIT < <(awk -v since="$SINCE" '
$4 >= "["since {
t++
if ($NF == "HIT") h++
}
END { print t+0, h+0 }
' "$LOG")
[ "$TOTAL" -lt 50 ] && exit 0 # too few requests to judge
PCT=$((HIT * 100 / TOTAL))
if [ "$PCT" -lt "$MIN_HITS_PCT" ]; then
curl -fsS "$HEARTBEAT_URL" --data "hit_pct=$PCT,window=60s,total=$TOTAL"
exit 2
fi
echo "OK (${PCT}% hit / 60s)"
То же самое в Enterno.io
Заверните в Enterno heartbeat — поймаете cache miss в 60 сек после деплоя нового nginx-конфига, до полного выгорания backend.
Похожие рецепты
Memcached переполнился и начал выбрасывать ключи под нагрузкой — приложение получает cache-miss и долбит БД. Нужен порог evictions/мин.
Сервер начал отвечать 503/504 — но это пропускает обычный uptime-мониторинг (главная отдаёт 200, ошибки в API).
long_query_time = 1, slow_query_log включён. Нужно понимать, когда количество медленных запросов в минуту резко вырастает (deploy сломал индекс, ORM начал N+1).