《踩坑记录:nginx_exporter 监控无数据?问题根因与配置详解》
项目场景:使用 Prometheus 和 Grafana 抓取 Nginx 的指标
问题描述:
部署 nginx_exporter 后,在 Prometheus 或 Grafana 中看不到 Nginx 指标(如 nginx_connections_active),或者 nginx_exporter 日志报错,提示连接被拒绝、访问被禁止或返回404/非200状态码。
原因分析:
简要说明一下 nginx_exporter 本身不生成数据,它只是一个“翻译器”,其工作原理是定期去访问一个特定的 HTTP 端点(默认为 http://nginx-host:8080/stub_status),将 Nginx 原生状态页面的文本信息转化为 Prometheus 可识别的指标格式。
-
检查 Nginx 是否编译了
ngx_http_stub_status_module模块:执行nginx -V 2>&1 | grep -o stub_status_module。如果没有任何输出,则说明 Nginx 根本不支持stub_status指令,这是根本性问题。 -
检查
stub_status配置是否正确:
-
可能是位置错误:
stub_status指令必须包含在server块的location上下文中。 -
可能是访问控制过严:配置中的
allow 127.0.0.1; deny all;是关键。如果nginx_exporter和 Nginx 不在同一台机器的同一个网络命名空间(例如,nginx_exporter运行在容器内,而 Nginx 在宿主机),那么127.0.0.1这个回环地址将无法连通。这是最常见的配置陷阱之一。 -
查看端口与路径:确保
nginx_exporter启动参数(如-nginx.scrape-uri)中的 URL 与你 Nginx 配置中的listen端口和location路径完全匹配。
解决方案:
-
方案一:为
nginx_exporter配置独立的状态页面(推荐)
优点是与主业务隔离,安全且专用于监控。并提供一个完整的、可直接复用的配置块。
# Nginx 状态页面
server {
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1; # 只允许本地访问
deny all;
}
}# 为nginx-exporter专门配置的状态页面
server {
listen 8080;
server_name localhost;# 只允许本地访问
allow 127.0.0.1;
deny all;location /stub_status {
stub_status on;
access_log off;
}location = / {
return 404;
}
}
-
方案二:修改现有配置的安全策略
如果状态页面在主server块中,需要根据nginx_exporter的实际部署位置调整allow指令。例如,如果nginx_exporter在同一个 Docker 网络的其他容器中,可能需要允许 Docker 网桥IP段(如172.17.0.0/16)。 -
方案三:重新编译 Nginx(针对模块缺失)
如果第一步诊断发现模块未编译,需要提供简明的重新编译或通过包管理器重新安装带此模块的 Nginx 的步骤。
更多推荐



所有评论(0)