要让Grafana实时查看Nginx的QPS和连接数,需先通过nginx-module-vts或nginx-lua-prometheus暴露指标,再由Prometheus抓取,最后在Grafana中用PromQL(如sum(rate(nginx_http_requests_total[1m]))和nginx_vts_server_connections{state="active"})可视化。

要让 Grafana 实时查看 Nginx 的 QPS(每秒请求数)和连接数,关键不是直接在 Grafana 里“配置 Nginx”,而是先让 Nginx 暴露指标数据,再通过 Prometheus 抓取,最后在 Grafana 中用对应 PromQL 查询并可视化。整个链路必须打通,缺一不可。
Nginx 必须暴露可采集的指标端点
Grafana 本身不采集数据,它只展示。所以第一步是确保 Nginx 正确输出结构化指标(如 Prometheus 格式)。主流方式有两种,选其一即可:
-
方式一:使用 nginx-module-vts + nginx-vts-exporter
- 编译安装
nginx-module-vts(支持 HTML/JSON/Prometheus 多种输出格式) - 启用 vts 状态页,例如在
server块中加:location /status { vhost_traffic_status_display; vhost_traffic_status_display_format prometheus; } - 部署
nginx-vts-exporter(一个轻量服务),监听 Nginx 的/status接口,把数据转成标准 Prometheus metrics 并暴露在:9913/metrics - Prometheus 配置 job 抓取该 exporter 地址
- 编译安装
-
方式二:使用 nginx-lua-prometheus(推荐轻量、动态场景)
- 要求 Nginx 编译含 Lua 支持(OpenResty 或带
--with-http_lua_module) - 在
http块中定义共享字典和指标:lua_shared_dict prometheus_metrics 10M; lua_package_path "/path/to/nginx-lua-prometheus/?.lua;;"; init_worker_by_lua_block { local prometheus = require("prometheus").init("prometheus_metrics") metric_requests = prometheus:counter("nginx_http_requests_total", "Total requests", {"host","status"}) } - 在
location /中用access_by_lua_block计数,在location /metrics中用content_by_lua_block { prometheus:collect() }暴露指标
- 要求 Nginx 编译含 Lua 支持(OpenResty 或带
两种方式暴露的指标里都包含:
-
nginx_http_requests_total{host="xxx",status="200"}→ 用于计算 QPS -
nginx_vts_server_connections{state="active"}或nginx_connections{state="active"}→ 活跃连接数 - 其他如
reading、writing、waiting等细分连接状态(来自 stub_status 或 vts)
Prometheus 需正确抓取并存储这些指标
在 prometheus.yml 中添加 job,例如:
- job_name: 'nginx-vts' static_configs: - targets: ['nginx-exporter-host:9913']
或针对 lua 方式:
- job_name: 'nginx-lua' static_configs: - targets: ['nginx-host:8080'] # 假设 /metrics 在 8080 上
确认 Prometheus 的 Targets 页面显示该 job 为 UP,且能访问到 /metrics 内容(含 nginx_http_requests_total 和 nginx_vts_server_connections 等指标)。
Grafana 中创建面板:QPS 与连接数实时看板
进入 Grafana,新建 Dashboard,添加两个 Panel:
-
QPS 面板(每秒请求数)
- 数据源选已配置的 Prometheus
- Query 使用 PromQL:
sum(rate(nginx_http_requests_total[1m])) by (job)
或更细粒度(按 host 或 status):
sum by (host) (rate(nginx_http_requests_total[1m]))
- 图表类型选 Time series,单位设为
req/sec - 可叠加
sum by (status) (rate(nginx_http_requests_total[1m]))查看各状态码 QPS 分布
-
连接数面板(实时活动连接)
- 若用 vts 模块,查:
nginx_vts_server_connections{state="active"} - 若用 stub_status(需配合 exporter 如
nginx-prometheus-exporter),查:nginx_connections{state="active"} - 可并列展示
reading,writing,waiting,用 Stat 或 Bar gauge 类型更直观 - 注意:
waiting表示 keepalive 空闲连接,高值通常正常;active持续飙升可能预示异常流量或后端阻塞
- 若用 vts 模块,查:
补充建议:提升实时性与稳定性
- Prometheus 抓取间隔建议设为
15s(scrape_interval: 15s),保障 QPS 计算平滑 - Grafana 刷新频率设为
10s或Auto,避免界面滞后 - 在 Nginx 配置中开启
keepalive_timeout 65,避免短连接频繁重建干扰连接数统计 - 生产环境务必限制
/metrics接口访问权限(如用allow/deny或反向代理鉴权),防止指标泄露
不复杂但容易忽略的是指标路径是否真实存在、Prometheus 是否真正拉到了数据——建议先在 Prometheus Graph 页面手动执行查询,验证指标返回再建面板。


















