Nginx可通过map指令结合access_log的if=条件精准过滤健康检查请求:在http块定义$loggable变量匹配/healthz、/ping等路径并赋值0,server中配置access_log if=$loggable实现仅记录非探针请求。

在 Nginx 中,可以通过 map 指令预先判断请求是否为健康检查(如 /healthz、/ping 等),再结合 access_log 的条件记录功能,实现**不记录探针请求日志**,既减少磁盘 I/O 和日志体积,又便于后续分析真实业务访问。
1. 定义 map 变量标记健康检查请求
在 http 块中定义一个变量(如 $loggable),根据 request_uri 或 user_agent 等字段匹配探针路径,赋值为 0(不记录)或 1(记录):
http {
# 匹配常见健康检查路径(支持正则)
map $request_uri $loggable {
default 1;
~^/healthz$ 0;
~^/ping$ 0;
~^/readyz$ 0;
~^/livez$ 0;
~^/metrics$ 0;
}
}注意:
- map 必须在 http 块顶层,不能放在 server 或 location 内;
- 使用 ~^/path$ 实现精确路径匹配(避免误杀 /healthz/test);
- 若探针带查询参数(如 /healthz?cache=0),可改用 ~^/healthz(\?|$)。
2. 在 server 或 location 中启用条件日志
在对应作用域(通常为 server 块)中,将 access_log 的第三个参数设为刚才定义的变量:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;">access_log /var/log/nginx/access.log main if=$loggable;
location / {
proxy_pass http://backend;
}}
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
if=$loggable 表示:仅当变量值为非空且非 0 时才写入日志。
- 值为 0 → 不记录;
- 值为 1 或任意非零/非空字符串 → 记录。
3. 验证与调试技巧
配置后建议验证是否生效:
- 执行
nginx -t确保语法正确; - 重载配置:
nginx -s reload; - 手动触发探针:
curl http://localhost/healthz,检查access.log是否无新增; - 同时访问正常路径(如
/),确认日志仍正常写入; - 临时加一条
add_header X-Loggable $loggable;到location,用curl -I查看响应头辅助调试。
4. 进阶:按 User-Agent 或 Header 过滤
某些探针由特定组件发起(如 Kubernetes liveness probe 默认带 User-Agent: kube-probe),也可配合过滤:
map $http_user_agent $loggable {
default 1;
"~*kube-probe" 0;
"~*Prometheus" 0;
}
# 或组合判断(需先定义多个 map,再用嵌套逻辑,但更推荐单 map 多条件)若需复杂逻辑(如「是 /healthz 且 User-Agent 是 kube-probe」),可借助 map + geo 或 Lua 模块,但对多数场景,路径匹配已足够可靠。










