Nginx基于路径分类审计日志需三步:1.用map按正则匹配$request_uri打标$log_category;2.用log_format audit_json定义含$category等字段的JSON格式;3.通过access_log $audit_log_path audit_json统一写入分类文件。

在 Nginx 中实现基于请求路径的分类审计日志,核心是利用 log_format 定义差异化日志格式,并结合 map 指令对 request_uri 或 location 进行路径匹配打标,再通过 access_log 的条件判断(if=)将不同类别的请求写入独立日志文件。
定义按路径分类的标记变量
使用 map 指令从请求路径中提取业务维度标签(如 /api/v1/users 归为 user_api,/admin/ 归为 admin_access),便于后续路由和日志分流:
# 在 http 块中定义
map $request_uri $log_category {
~^/api/v1/(users|orders) user_api;
~^/api/v2/(products|search) product_api;
~^/admin/.* admin_access;
~^/healthz health_check;
default general;
}
注意:map 支持正则匹配(以 ~ 开头)、前缀匹配(无修饰符)和大小写敏感控制(~*)。变量值可自由命名,建议语义清晰、无特殊字符。
定制面向审计的日志格式
审计日志需包含可追溯的关键字段,例如时间、客户端真实 IP(考虑代理场景)、HTTP 方法、完整路径、状态码、响应体大小、Referer、User-Agent,以及上一步生成的分类标签:
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
log_format audit_json escape=json
'{'
'"time_local":"$time_local",'
'"remote_addr":"$real_ip",'
'"http_x_forwarded_for":"$http_x_forwarded_for",'
'"method":"$request_method",'
'"uri":"$request_uri",'
'"status":"$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"referer":"$http_referer",'
'"user_agent":"$http_user_agent",'
'"category":"$log_category"'
'}';
使用 escape=json 可自动转义双引号与换行,确保每条日志为合法 JSON 行,方便后续用 Filebeat / Fluentd 采集解析。
按分类启用条件化 access_log
在 server 或 location 块中,为每个关注路径类别单独配置 access_log,并用 if= 控制是否写入:
access_log /var/log/nginx/user_api.log audit_json if=$user_api; access_log /var/log/nginx/product_api.log audit_json if=$product_api; access_log /var/log/nginx/admin_access.log audit_json if=$admin_access; access_log /var/log/nginx/audit_all.log audit_json if=$log_category;
更推荐方式是复用 $log_category 变量,配合 map 构建日志路径:
map $log_category $audit_log_path {
user_api "/var/log/nginx/user_api.log";
product_api "/var/log/nginx/product_api.log";
admin_access "/var/log/nginx/admin_access.log";
health_check "/var/log/nginx/health.log";
default "/var/log/nginx/general.log";
}
access_log $audit_log_path audit_json;
该方式简洁统一,避免重复声明多个 access_log 行,也利于运维管理。
补充审计增强实践
-
记录请求体关键字段:Nginx 默认不记录 POST body。如需审计参数(如
username、action),需搭配lua-nginx-module或 OpenResty 使用ngx.req.get_post_args()提取后注入日志变量。 -
敏感路径脱敏:对含 token、ID 等的 URI(如
/api/v1/users/123?token=abc),可用map+ 正则替换(set不支持正则替换,需用sub_filter或 Lua)隐藏敏感段,防止日志泄露。 -
日志轮转与权限管控:审计日志应由专用系统用户(如
nginx-audit)拥有,权限设为640;配合logrotate启用压缩、加密归档及保留周期策略(如 90 天),满足等保或 SOC2 合规要求。










