项目场景:使用 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 可识别的指标格式。

  1. 检查 Nginx 是否编译了 ngx_http_stub_status_module 模块:执行 nginx -V 2>&1 | grep -o stub_status_module。如果没有任何输出,则说明 Nginx 根本不支持 stub_status 指令,这是根本性问题。

  2. 检查 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 的步骤。

更多推荐