Nginx 用 map 指令将 $request_time 动态映射为 $alert_level 实现慢请求分级标记,按阈值分 INFO/WARN/CRITICAL 三级,需设默认值、结合敏感路径白名单,并通过日志或响应头透出供告警系统识别。

直接用 Nginx 的 map 指令结合 $request_time 对慢请求做动态分级标记,核心是把耗时映射为自定义变量(如 $alert_level),再在日志或响应头中输出,供后续告警系统识别。
定义耗时分级映射关系
在 http 块中使用 map 将 $request_time 转为可读性强的告警级别:
- 建议按业务性能预算设定阈值,例如:≤0.3s 正常,0.3–1.0s 警告,>1.0s 高危
-
map必须声明默认值,否则未匹配时变量为空,易引发日志截断或判断失效 - 注意
$request_time是浮点数(单位秒,精度毫秒),map内部自动按数值比较,无需转字符串
示例配置:
map $request_time $alert_level {
default "INFO";
~^[0-9]*\.?[0-9]{0,3}$ "INFO"; # 安全兜底,防空值或异常格式
0.3 "WARN";
1.0 "CRITICAL";
}将标记注入访问日志或响应头
仅定义变量还不够,需让监控系统能采集到该标记:
- 写入日志:在
log_format中加入$alert_level,确保日志采集器(如 Filebeat、Fluentd)能提取该字段 - 透出响应头(可选):用
add_header向客户端返回X-Alert-Level,便于前端埋点或灰度链路追踪 - 避免在
if或location中重复判断——map已完成计算,直接复用最高效
配合安全路径白名单精准触发
不是所有慢请求都该告警,需限定在关键路径(如登录、支付、数据导出等):
- 用
map嵌套判断:先匹配$uri是否属于高危路径,再结合$request_time判级 - 或拆分为两层
map:一层筛路径($is_sensitive_path),一层判耗时($alert_level),最后用map组合逻辑 - 路径匹配推荐用正则(
~)而非前缀匹配,支持精确控制,例如^/api/v1/(order|login|export)/
对接告警系统的关键细节
标记本身不触发告警,需下游系统识别并响应:
- 日志侧:ELK 或 Loki 中设置告警规则,例如
level="CRITICAL" AND status>=500或连续 3 次CRITICAL触发电话告警 - 指标侧:用 Prometheus + nginx-vts-exporter 时,可新增 label
alert_level,再通过rate聚合慢请求比例 - 注意时区与采样精度:
$request_time是请求处理时间,不含网络延迟;若需端到端耗时,应改用前端上报或 Jaeger 追踪



















