要在nginx中记录详细访问审计日志,需自定义log_format包含真实ip(配合set_real_ip_from和real_ip_header)、请求时间、uri、状态码、耗时、user-agent等字段,并启用access_log;前端有代理时必须配置可信代理网段及x-forwarded-for头解析。

要在 Nginx 中记录详细的访问审计日志,核心是自定义 log_format 并启用对应 access_log,同时确保日志包含客户端真实 IP、请求时间、完整 URI、响应状态、耗时、User-Agent、Referer 等关键字段。特别注意当 Nginx 前有代理(如 CDN、LB)时,需正确提取真实客户端 IP。
定义高信息量的 log_format
在 http 块中定义一个包含审计所需字段的日志格式,例如:
log_format audit '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time '
'$http_x_forwarded_for $http_x_real_ip;
说明:
• $remote_addr 是直接连接 Nginx 的地址(可能是代理),所以需配合 $http_x_forwarded_for 或 $http_x_real_ip 获取真实 IP
• $request_time 记录请求总处理时间(秒,精度毫秒),$upstream_response_time 仅在反向代理场景下有效,表示后端响应耗时
• $body_bytes_sent 是实际发送给客户端的响应体字节数(不含响应头)
配置 access_log 使用 audit 格式
在 server 或 location 块中启用该日志:
access_log /var/log/nginx/audit.log audit;
建议:
• 日志路径使用绝对路径,确保 Nginx worker 进程有写入权限
• 可添加 buffer=32k flush=1s 提升性能:`access_log /var/log/nginx/audit.log audit buffer=32k flush=1s;`
• 若需按天轮转,用 logrotate 配置,或借助 `open_log_file_cache` 减少频繁 open/close 开销
确保获取真实客户端 IP
若 Nginx 前有反向代理(如 SLB、CDN),默认 $remote_addr 是代理地址。需做两件事:
- 在
http块顶部添加:set_real_ip_from 10.0.0.0/8;(替换为你的可信代理网段) - 启用 realip 模块行为:
real_ip_header X-Forwarded-For;或X-Real-IP(取决于代理实际传的 header) - 确认已编译或加载了
ngx_http_realip_module(主流发行版默认内置)
验证方式:curl 请求时加 `-H "X-Forwarded-For: 192.168.1.100"`,检查日志中是否出现该 IP 而非本机地址
可选:记录敏感请求参数或请求体
Nginx 默认不记录 POST body 或 query string 中的敏感字段(如 password),出于安全与性能考虑也不建议直接记录全量 body。如确需审计特定参数:
- 用
$arg_paramname提取指定 query 参数,例如$arg_username - 对登录接口等 location,可单独定义 log_format 并添加
$request_body—— 但必须开启lua_need_request_body on;或使用第三方模块(如 nginx-module-vts 不支持),且仅限调试,生产环境慎用 - 更稳妥做法:由上游应用记录完整请求上下文,Nginx 仅保留 trace_id、request_id、URI、状态码等用于关联追踪











