VTS 提供实时细粒度流量指标,需结合差分计算、多维聚合与基线比对识别异常流量,并联动日志分析、限流及防火墙实现闭环响应。
在 Nginx 中识别异常流量突发,关键不是单纯看总请求数,而是结合来源 IP、User-Agent、URI 模式、响应状态等维度做实时聚合与对比。Vhost-Traffic-Stat(简称 VTS)本身不直接检测“异常”,但它提供了高精度、低开销的按虚拟主机(vhost)、上游(upstream)、甚至按状态码/请求方法细分的实时流量指标,是构建异常流量感知体系的基础数据源。
启用 VTS 并暴露细粒度指标
VTS 的核心价值在于它把原本需日志分析才能获得的维度(如每个 server_name 下每秒 404 数、每个 upstream 的失败率)变成可实时抓取的 JSON 接口。务必开启以下配置:
在
http
块中加载模块:
(路径依编译方式而定)
添加
vhost_traffic_status_zone
指令,例如:
(使用默认共享内存区)或自定义大小:
配置一个专用 location 暴露指标,例如:
确保该 location 不被外部随意访问,建议加 IP 白名单或 basic auth
聚焦关键维度识别突发源头
直接看
的全局汇总意义有限。要定位异常源,需主动拉取并解析其嵌套结构:
按 server_name 分组
:检查哪个域名 QPS 突增(如
近 60 秒值 vs 历史基线)
按 upstream 分组
:若后端有多个集群(如
,
),对比各组 active、5xx、response time 是否失衡
按 code 和 method 维度
:突发大量
或
请求常指向扫描器;突增
且 429 飙升可能为暴力破解
结合 request.time 和 bytes_sent
:高 QPS 但平均
极低(如 <100B),大概率是探测或心跳包
用轻量脚本实现基线比对与告警
VTS 不带分析逻辑,需外部工具消费其 JSON。一个实用做法是用 Python + requests 每 30 秒抓一次 /status,缓存最近 10 分钟数据,计算滑动窗口标准差:
Nginx
在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。
下载
提取每个
的增量(当前值 - 上次值),得到每 30 秒请求数
对每个 vhost 维护一个长度为 20 的队列,计算均值 μ 和标准差 σ
当新周期增量 > μ + 3σ,且该 vhost 的
或
同步上升,则触发告警
进一步可关联
,确认是客户端问题还是后端崩了
与日志和限流联动提升响应能力
VTS 提供“发现”,后续动作需配合其他机制:
一旦发现某 vhost 的 UA 出现高频
、
字样(需在 log_format 中记录 $http_user_agent),可动态更新 geo 或 map 模块,将该 UA 前缀加入黑名单
对突发的特定 URI(如
),用 limit_req_zone 基于 $binary_remote_addr + $request_uri 创建二级限流,避免误伤正常用户
将 VTS 中识别出的恶意 IP 段,同步写入 ipset,由 iptables 快速丢弃后续连接(绕过 Nginx 解析开销)
不复杂但容易忽略:VTS 的计数器是累计值,必须做差分才能得到速率;它的数据刷新频率取决于 Nginx worker 处理请求的节奏,不是严格定时,所以监控脚本要容忍小幅抖动。
load_module modules/ngx_http_vhost_traffic_status_module.so;vhost_traffic_status_zone;vhost_traffic_status_zone size=1m;location /status { vhost_traffic_status_display; vhost_traffic_status_display_format json; }/statusdata.vhosts["api.example.com"].request.counterupstreams.backend-v1upstreams.backend-v2403HEADPOST /loginbytes_sentvhosts.*.request.countercodes.4xxcodes.5xxvhosts.*.upstreamZones.*.responses.5xxsqlmapnuclei/wp-login.php