nginx平滑监控关键在于以进程生命周期和资源行为差异为信号源,通过reload锚点、worker状态比对、资源分布偏差分析实现无感观测与精准告警。

盯住 worker 进程状态变化,而非只看存活
worker 存在 ≠ 正常服务。平滑场景下,新旧 worker 共存是常态,监控要区分“该不该在”:
- 执行 ps -eo pid,comm,lstart | grep nginx,比对启动时间:新 worker 应集中在 reload 时间点附近;若发现多个早于 5 分钟前的 worker 仍大量存在且连接数不降,说明退出卡滞
- 用 pgrep -f "nginx: worker" | wc -l 统计数量,应始终等于
worker_processes配置值 —— 少了说明新 worker 启动失败,多了可能是旧进程残留未退出 - 配合 ss -tnlp | grep :80 确认监听 PID 是否属于新 master,避免端口被旧进程独占导致新 worker 实际无法 accept
用资源分布差异识别异常 worker
每个 worker 是独立调度单元,CPU、连接数、内存使用天然存在合理波动;大幅偏离均值就是早期风险信号:
-
CPU 持续 >90%:用
top -p $(pgrep -f "nginx: worker" | xargs | tr ' ' ',') -b -n1 | head -20抓快照,连续 2 次出现同一 PID 占比过高,可能陷入长连接处理或正则回溯 -
lsof 数明显偏高:对单个 worker 执行
lsof -p <pid> | wc -l</pid>,若超过其他 worker 均值 2 倍(如均值 400,某 worker 达 1000+),说明连接分发不均或存在 keepalive 泄漏 -
RSS 持续上涨不回落:用
ps -o pid,rss,comm -C nginx | grep worker定期采样,某 worker RSS 在 10 分钟内增长超 50MB 且无下降趋势,需排查大 body 缓存未释放或模块内存泄漏
把 reload 行为本身变成监控锚点
每次 nginx -s reload 都是一次轻量级“健康检查窗口”,可同步验证配置生效与流量承接:
- reload 后立即执行 nginx -T | grep -A2 "your_modified_block",确认修改已加载(如新增的 proxy_pass 或 limit_req)
- 用 curl -I http://your-domain/test-path 访问受改动影响的路径,检查响应头是否含新配置效果(如新 set-cookie、新 header)
- 在 reload 同步发起持续请求:
while true; do curl -s -o /dev/null -w "%{http_code}\n" http://localhost/health; sleep 0.1; done,全程应稳定返回 200,出现 502/000 即说明 worker 切换异常或 upstream 未就绪
轻量脚本 + cron 实现可持续预警
无需 Prometheus 或商业 APM,一个 shell 脚本就能覆盖核心场景:
- 每 2 分钟运行一次校验:worker 数量匹配、最高 CPU worker 是否连续 3 次超阈值、lsof 数是否突破 2000
- 异常时写入
/var/log/nginx/monitor.log并触发systemctl reload nginx(先nginx -t校验) - 搭配
journalctl -u nginx --since "1 hour ago" | grep -E "(worker.*exit|segfault|abort)"捕获静默崩溃,避免误判为“运行正常”











