Prometheus采集Nginx状态

网站访问量突然下降却不知道原因,往往是因为没有采集 Nginx 的连接数和请求数。
这篇教程会带你用 nginx-prometheus-exporter 把 Nginx 状态暴露给 Prometheus,最终在 Prometheus 里查询到活跃连接、总请求数等关键指标。

准备条件与检查清单

开始前,请确认服务器上已经运行 Nginx,并且安装了 Prometheus。
如果还没有 Prometheus,需要先完成它的安装和启动。
另外,nginx-prometheus-exporter 是一个独立小程序,它负责读取 Nginx 的 stub_status 页面,再转换成 Prometheus 能识别的格式。

检查 Nginx 是否支持 stub_status 模块:

nginx -V 2>&1 | grep -o with-http_stub_status_module

如果输出 with-http_stub_status_module,说明支持。
如果没有输出,需要重新编译 Nginx 或更换支持该模块的版本。

开启 Nginx 状态页并验证

在 Nginx 配置目录中,找到站点配置文件,通常在 /etc/nginx/conf.d//etc/nginx/sites-enabled/ 下。
添加一个单独的状态访问路径。

server {
    listen 127.0.0.1:8080;
    server_name localhost;

    location /stub_status {
        stub_status;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

这段配置只允许本机访问,避免状态信息暴露到公网。
保存后执行:

nginx -t && nginx -s reload

打开浏览器或使用 curl 验证:

curl http://127.0.0.1:8080/stub_status

如果看到类似下面的内容,说明状态页已生效:

Active connections: 1 
server accepts handled requests
 10 10 25 
Reading: 0 Writing: 1 Waiting: 0 

其中 Active connections 是当前活跃连接数,accepts 是已接受连接总数,handled 是已处理连接总数,requests 是客户端请求总数。

安装并运行 nginx-prometheus-exporter

nginx-prometheus-exporter 可以从 GitHub Releases 下载二进制文件,也可以使用 Docker 运行。
下面以二进制方式为例。

wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v1.1.0/nginx-prometheus-exporter_1.1.0_linux_amd64.tar.gz
tar -xzf nginx-prometheus-exporter_1.1.0_linux_amd64.tar.gz
sudo mv nginx-prometheus-exporter /usr/local/bin/

启动 exporter,让它去抓取刚才配置的 stub_status 地址:

nginx-prometheus-exporter -nginx.scrape-uri http://127.0.0.1:8080/stub_status

默认监听 9113 端口。
验证 exporter 是否正常:

curl http://127.0.0.1:9113/metrics | grep nginx

你应该能看到 nginx_connections_activenginx_http_requests_total 等指标。
如果看不到,检查 exporter 进程是否在运行,以及 scrape-uri 是否填写正确。

为了让 exporter 长期运行,建议用 systemd 管理。
创建文件 /etc/systemd/system/nginx-exporter.service

[Unit]
Description=Nginx Prometheus Exporter
After=network.target

[Service]
User=nobody
ExecStart=/usr/local/bin/nginx-prometheus-exporter -nginx.scrape-uri http://127.0.0.1:8080/stub_status
Restart=on-failure

[Install]
WantedBy=multi-user.target

然后启用并启动:

sudo systemctl daemon-reload
sudo systemctl enable --now nginx-exporter

在 Prometheus 中配置抓取任务

打开 Prometheus 配置文件 prometheus.yml,在 scrape_configs 下新增一个 job:

scrape_configs:
  - job_name: 'nginx'
    static_configs:
      - targets: ['127.0.0.1:9113']

保存后重启 Prometheus 或发送重载信号:

curl -X POST http://127.0.0.1:9090/-/reload

进入 Prometheus 的 Web 界面,点击顶部菜单 Status -> Targets,查看 nginx 这个 job 的状态是否为 UP
如果显示 DOWN,把鼠标悬停在错误信息上,常见原因是 exporter 未启动或防火墙拦截了 9113 端口。

常用查询与告警思路

在 Prometheus 的查询框中输入以下表达式,可以快速查看网站访问指标:

  • 当前活跃连接数:nginx_connections_active
  • 总请求数:nginx_http_requests_total
  • 每秒请求速率:rate(nginx_http_requests_total[1m])

如果希望连接数过高时收到通知,可以基于 nginx_connections_active > 100 这样的条件创建告警规则。
注意阈值需要根据你的服务器实际承载能力调整,不要直接照搬。

避坑与排查要点

状态页无法访问:检查 Nginx 配置中 listen 的端口是否被占用,以及 allowdeny 规则是否误拦了本机地址。

exporter 启动失败:确认 -nginx.scrape-uri 参数指向的地址能通过 curl 正常返回数据。
如果 Nginx 状态页使用了 HTTPS,需要把 URI 改成 https:// 并确保证书有效。

Prometheus 抓取不到数据:先检查 exporter 的 /metrics 接口是否有数据,再检查 Prometheus 的 targets 页面报错信息。
如果服务器开了防火墙,需要放行 9113 端口,但只建议对内网开放。

指标不更新:Nginx 的 stub_status 数据是实时变化的,如果 Prometheus 里长时间没有新数据,查看 exporter 日志是否出现连接超时。

如何确认监控已经生效

完成以上步骤后,在 Prometheus 查询框输入 nginx_http_requests_total,点击 Execute,如果能看到数值并随时间增加,说明 Prometheus 采集 Nginx 状态已经成功。
此时你可以进一步在 Grafana 中添加面板,把连接数和请求速率可视化,方便日常巡检。

如果刚开始接触,建议先只监控活跃连接数和总请求数这两个指标,等熟悉后再添加更复杂的告警规则。

分享到:
上一篇
Zabbix监控磁盘使用率,满盘自动告警
下一篇
Ansible部署LNMP环境,多服务器一键搭建
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意