精准把控响应时间分布关键在于掌握请求耗时在各区间占比,需区分静态(用$request_time)与动态(用$upstream_response_time)场景,按路径分流日志,借助nginx-module-vts暴露直方图指标供Prometheus分析Pxx及抖动。

精准把控响应时间分布,关键不是看平均值,而是掌握请求耗时在不同区间内的实际占比——比如多少请求落在 10ms 内、多少卡在 500ms 以上。这需要从采集、打标、分维度聚合到可视化分析形成闭环,且必须排除干扰项。
用对变量:静态与动态场景各取所需
静态资源(如 JS/CSS/图片)不经过后端,$upstream_response_time 为空或为“-”,此时唯一可信的是 $request_time(单位秒,含毫秒精度),它覆盖文件打开、读取、发送全过程;而动态接口必须依赖 $upstream_response_time,它只记录后端返回响应头的时间,剔除 Nginx 自身开销。
- 静态日志格式示例:log_format static_log '$remote_addr "$request" $status $body_bytes_sent $request_time $msec';
- 动态日志格式示例:log_format api_log '$remote_addr "$request" $status $upstream_addr $upstream_response_time $request_time';
- 切忌用 $time_local 做耗时计算——它只有秒级精度,无法支撑毫秒级分布分析
按路径与来源分离日志流
混在一起的日志无法做有效分布统计。需通过 location 精准匹配并分流:
- 对 /static/、/assets/、/img/ 等路径单独配置 access_log,启用独立 log_format
- 对 /api/v1/、/user/ 等接口路径也设专属日志,并在响应头中打标:add_header X-Path-Type "api";
- 若需监控特定 IP 或 User-Agent 行为,可用 map 指令预标记:map $remote_addr $is_target_ip { "192.168.1.100" "1"; },再写入对应日志
暴露直方图指标供 Prometheus 分析
原始日志只是起点,真正做分布分析得靠直方图(histogram)。原生 Nginx 不支持路径级直方图,需借助增强模块:
- 使用 nginx-module-vts(需编译安装),它能暴露带 path 标签的指标,例如:nginx_vts_server_request_seconds_bucket{path="/login",le="0.1"}
- 配合 Prometheus 抓取 /vts/status/format/prometheus 接口,即可按路径绘制 P50/P95/P99 曲线
- 查某路径的响应时间分布:用 PromQL histogram_quantile(0.95, sum(rate(nginx_vts_server_request_seconds_bucket{path="/api/order"}[5m])) by (le))
识别抖动与异常分布突变
分布稳定比绝对快更重要。关注两类信号:
- P95 突然上冲 + 标准差放大:用 stddev_over_time(nginx_vts_server_request_seconds_sum[5m]) / avg_over_time(nginx_vts_server_request_seconds_count[5m]),持续 >0.3 表示抖动显著
- 大量请求集中在某个 bucket 尾部(如 le="1.0" 突增但 le="0.5" 平稳):说明有少量慢请求拖累整体分布,需结合 $upstream_cache_status 或 $sent_http_x_cache 判断是否缓存失效引发
- 对比命中缓存与未命中的分布曲线,确认延迟是否集中在 MISS 区间


















