需规范Nginx日志格式,注入$auth_status等字段区分调用与鉴权结果;按路径过滤聚合接口调用量;分类统计鉴权失败类型;通过prometheus-nginxlog-exporter实现多维指标监控与Grafana可视化。

要监控 API 网关层面的接口调用频率与鉴权失败数,核心是让 Nginx 日志能明确区分“调用行为”和“鉴权结果”,再通过结构化日志 + 分层分析实现精准统计。不能只看总请求数或笼统的状态码,必须把路径、方法、认证头、响应状态、自定义标记等关键字段分离出来。
规范日志格式,显式记录鉴权上下文
Nginx 默认日志不包含鉴权是否触发、是否失败等信息。需主动注入标识:
- 在
log_format中加入$http_authorization(或$http_x_api_key)字段,判断凭证是否存在 - 用
map指令构造鉴权状态变量,例如:
map $http_authorization $auth_status {
"" "missing";
~^Bearer "valid";
~^API\s+key_ "valid";
default "invalid";
} - 将
$auth_status写入日志,同时保留$status和$uri,确保每行日志可回答三个问题:调了哪个接口?带没带凭证?凭证验没验过?
按接口路径聚合调用频次,排除干扰
调用频率统计必须聚焦真实业务接口,避免被健康检查、静态资源、爬虫污染:
- 过滤条件示例(用 awk):
awk '$9 >= 200 && $9 < 400 && $7 ~ /^\/api\// && $7 !~ /\.(ico|js|css|png)$ && $7 !~ /^\/healthz|^\/metrics/ && $11 != "missing" {print $7}' api.log - 其中 $7 是
$uri(归一化路径),$9 是$status,$11 是上面定义的$auth_status - 再配合
sort | uniq -c | sort -nr即可得到各接口每分钟/小时调用量
单独提取鉴权失败请求,定位问题类型
鉴权失败不等于 401/403——有些请求根本没送进鉴权逻辑(如 header 缺失),有些是 token 过期,有些是 key 不存在。需分类统计:
-
凭证缺失:日志中
$auth_status == "missing"且$status == 401 -
凭证无效:日志中
$auth_status == "invalid"且$status == 401 -
鉴权通过但权限不足:需后端返回特定状态码(如 403)或在 Nginx 中用
proxy_pass后置响应头标记(如$upstream_http_x_auth_result) - 命令示例:
awk '$11 == "missing" && $9 == 401 {count++} END {print "missing:", count+0}' api.log
接入 Prometheus 实现持续可观测
人工查日志只能做抽查,生产环境需指标化:
- 用
nginx-exporter抓取基础连接与请求量,但无法区分接口或鉴权状态 - 更优方案:用
prometheus-nginxlog-exporter(支持 Grok 解析),将日志中$uri、$auth_status、$status组合成多维指标,例如:
nginx_http_requests_total{host="gateway", path="/api/v1/users", auth_status="missing", status="401"} - 在 Grafana 中即可绘制:各接口每分钟调用量趋势、401 请求中 missing/invalid 占比、高频出错 IP Top10 等图表


















