nginx stub_status模块不支持按域名隔离统计,仅提供worker进程级全局指标;可通过独立实例部署、access_log实时聚合或nginx-module-vts模块实现单域名并发量监控。

Nginx 的 stub_status 模块本身不支持按域名隔离统计,它暴露的是整个 worker 进程维度的全局连接与请求指标。也就是说,无论你配置多少个 server 块(即多少个域名),只要它们共用同一个 worker 进程,/nginx-status 返回的 Active connections、requests 等数值就是所有域名的总和,无法直接拆分出“某个域名当前有多少并发连接”。
但你可以通过以下几种方式,逼近单域名实时并发量的可观测目标:
为关键域名部署独立 Nginx 实例
这是唯一能获得真正“单域名级 stub_status”的方法:
- 给该域名单独启动一个 Nginx 进程(不同
pid文件、不同conf目录、不同监听端口或 IP) - 在其配置中启用
stub_status,例如:server { listen 127.0.0.1:8081; server_name api.example.com; location /status { stub_status; access_log off; allow 127.0.0.1; deny all; } } - 此时
/status返回的数据就仅代表该域名的全部流量,包括其Active connections和requests
适合核心 API、高 SLA 要求的业务,资源开销可控时推荐。
利用 access_log + 实时脚本聚合(低成本常用方案)
不改动 Nginx 架构,靠日志反推近似并发行为:
- 在对应
server块中开启带$host和$request_time的日志,例如:log_format host_req '$host $request_time $status $request'; access_log /var/log/nginx/api_access.log host_req;
- 用
awk或goaccess等工具,按秒级统计当前活跃连接的“最近请求时间窗口”:- 比如:过去 5 秒内有日志记录的
api.example.com的 IP 数 ≈ 当前活跃客户端数 - 或统计
request_time > 0.5的请求数,反映慢连接堆积情况
- 比如:过去 5 秒内有日志记录的
- 配合
logrotate按秒切日志 +tail -f流式解析,可实现准实时估算
该方法不依赖模块编译,但属于间接推算,不能等同于 TCP 层并发连接数。
使用 nginx-module-vts 替代 stub_status(生产推荐)
vts(Virtual Host Traffic Status)是社区成熟模块,原生支持域名维度:
- 编译时添加
--add-module=../nginx-module-vts,启用后在server块中加:vhost_traffic_status on;
- 访问
/status(需另配 location)返回 JSON,含每个server_name的:-
in_bytes,out_bytes,connections,requests,responses.2xx等 - 支持
/status/format/json?filter=server&filter_value=api.example.com精确过滤
-
它弥补了 stub_status 的根本缺陷,且提供 Grafana Dashboard 和 Prometheus Exporter,适合中大型生产环境。
不复杂但容易忽略:stub_status 是进程级快照,不是域名级探针;要监控单域名,并非“配对 location 就行”,而需架构或工具层面的适配。










