关键是在Nginx配置层用location+map指令标记动静请求,通过双通道日志隔离并实时聚合计算比例:静态匹配后缀或路径前缀,动态记录upstream信息,再用awk或PromQL秒级统计占比。

要监控动态请求与静态资源的流量分离比例,关键是在 Nginx 配置层就对两类请求做明确标记和日志隔离,再通过轻量聚合得出实时占比——不依赖外部代理或重写逻辑,也不需要改编译模块。
用 location + map 指令打标区分动静请求
在 http 块中定义一个 $is_static 变量,统一标识请求类型:
- 匹配常见静态后缀(.js/.css/.png/.jpg/.woff2/.svg等)或约定路径前缀(如 /static/、/assets/、/images/)
- 用 map 指令生成布尔变量,比重复写正则更高效、更易维护
- 示例配置:
map $request_uri $is_static {
~*\.(js|css|png|jpg|gif|ico|woff2|ttf|eot|svg)$ "1";
~*^/static/|^/assets/|^/images/ "1";
default "0";
}
配置双通道日志,分别记录动静流量
定义两个精简日志格式,只保留统计所需字段,并写入不同文件:
- 静态日志含 $is_static、$status、$body_bytes_sent、$request_time,写入 /var/log/nginx/static.log
- 动态日志同样带 $is_static 标记,但额外记录 $upstream_addr、$upstream_response_time,写入 /var/log/nginx/dynamic.log
- 在 server 块中启用:
access_log /var/log/nginx/access.log main if=$is_static;
access_log /var/log/nginx/access.log dynamic if=$is_static = "0"; - 关闭无关路径日志(如 /health、/favicon.ico、/robots.txt),避免干扰比例计算
用脚本或 exporter 实时计算分离比例
无需引入 Kafka 或 ELK,几行命令就能跑出秒级占比:
- 用 tail -f + awk 每 10 秒统计一次:静态请求数 / 总请求数 × 100%
- 若已部署 nginx-prometheus-exporter,它会自动按 nginx_vts_server_request_count{is_static="1"} 和 {is_static="0"} 暴露指标,PromQL 直接写:
rate(nginx_vts_server_request_count{is_static="1"}[1m]) / rate(nginx_vts_server_request_count[1m]) - 也可将结果推送到 Redis,供前端看板轮询展示实时饼图
补充验证:检查是否真分离成功
仅靠日志打标还不够,需交叉验证实际流向是否符合预期:
- 查静态 location 是否真的没走 proxy_pass:curl -I http://yoursite.com/app.js 应返回 200 OK 且无 X-Proxy-By 类响应头
- 查动态请求是否命中 upstream:grep "proxy_pass" /etc/nginx/conf.d/*.conf 确认 / 路径或 /api/ 等规则指向了 app_backend
- 用 stub_status 对比活跃连接数与 access.log 中的动静请求数趋势是否匹配,排除漏标或误判


















