内网物理隔离下nginx监控报警链路需全本地化:启用stub_status模块暴露基础指标;用curl+shell+cron每30秒采集并写入日志;告警通过syslog、led/蜂鸣器及html状态页实现;连续3次失败后自动reload或重启,并归档上下文供审计。

在内网物理隔离环境下构建 Nginx 的监控报警链路,核心难点不是“能不能装监控”,而是“如何让监控系统自身不依赖外网、不引入新风险、又能真实反映 Nginx 健康状态”。它不是简单加个 Prometheus 或 Zabbix 客户端就完事——那些工具本身也需要运行环境、数据采集通道和告警出口,而这些在断网场景下全部失效或需重构。
一、监控目标必须聚焦 Nginx 自身可导出的关键指标
离线环境无法拉取外部 exporter,也不宜部署重型采集器。应优先利用 Nginx 内置模块直接暴露基础健康信号:
-
启用 stub_status 模块:编译时确认已包含(默认 CentOS/RHEL 系发行版的 nginx 包通常启用),在配置中添加:
location /nginx_status {
stub_status on;
allow 127.0.0.1;
allow 10.10.0.0/16; # 内网监控节点IP段
deny all;
} -
关键指标仅需三类:Active connections(活跃连接)、accepts/handled/requests(连接处理趋势)、Reading/Writing/Waiting(I/O 状态)。这些可通过
curl http://localhost/nginx_status获取纯文本,无需 JSON 解析或额外依赖。 - 禁用所有需网络回调的功能:如第三方 health check 调用、远程日志转发、动态 upstream 检测等。所有判断逻辑必须本地闭环。
二、采集与判断必须全本地化、无守护进程依赖
不部署常驻采集服务(如 node_exporter),改用轻量、按需触发的 shell + cron 方案:
- 写一个检查脚本(如
/opt/nginx-monitor/check.sh),每 30 秒执行一次:
curl -sf http://127.0.0.1/nginx_status 2>/dev/null | grep 'Active connections' && echo "OK" || echo "DOWN" - 将结果写入本地时间戳文件(如
/var/log/nginx/health.log),保留最近 24 小时记录;同时用stat -c "%Y" /var/log/nginx/health.log判断文件是否更新,间接验证采集进程是否存活。 - 告警不走邮件或短信网关,改为:
• 写入系统日志(logger -t nginx-health "Nginx down at $(date)")→ 可被现有 syslog-ng/rsyslog 收集归档
• 触发本地 LED 灯(如有 BMC/IPMI)或蜂鸣器(通过echo -e "\a")用于现场值守提醒
• 更新一个 HTML 状态页(由 Nginx 自身托管),供内网人员浏览器直查
三、报警响应必须脱离“通知通道”,转向“自愈动作”
物理隔离意味着没有 Slack/钉钉/飞书入口,报警的意义在于驱动确定性动作:
- 当检测到连续 3 次失败(即 90 秒无响应),自动执行:
/usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload 2>/dev/null || systemctl restart nginx - 重启前记录完整上下文:
• 当前配置哈希(sha256sum /usr/local/nginx/conf/nginx.conf)
• 最近 10 行 error.log(tail -n10 /usr/local/nginx/logs/error.log)
• 进程树快照(ps auxf | grep nginx) - 所有日志和快照统一归档到
/var/log/nginx/auto-recover/$(date +%Y%m%d_%H%M%S),供事后审计——这是离线环境中唯一可靠的“告警留存”方式。
四、验证链路必须绕过网络,靠人工可触达方式闭环
没有 Grafana 看板?没关系。用最原始但最可靠的方式验证整条链路是否有效:
- 手动停掉 Nginx:
killall nginx,等待 90 秒;确认本地日志出现 “DOWN” 记录 +logger条目 + HTML 状态页变红; - 观察是否触发自动恢复,再检查
ps aux | grep nginx是否回归,以及curl /nginx_status是否返回正常; - 打开浏览器访问
http://[内网IP]/status.html,页面应实时显示“Last OK: 2 min ago”或类似可读信息——这是给值班人员看的最终交付物。











