nginx需通过log_format自定义审计日志,精准捕获真实ip、request_id、脱敏身份信息、完整请求响应、高精度时间、tls详情等字段,按规范格式输出并绑定至server/location,配合real_ip配置、权限管控与持续验证。

在Nginx中通过 log_format 自定义访问日志字段,是满足等保、GDPR、金融审计等合规要求的关键操作。核心在于精准捕获请求上下文(如真实IP、用户标识、响应状态细节、耗时、协议版本等),并按审计方要求的格式输出,而非仅依赖默认的 combined 格式。
明确审计日志字段需求
不同审计场景关注点不同,需先梳理必填字段。常见强制项包括:
-
客户端真实IP:不能只记代理后IP,需从
X-Forwarded-For或X-Real-IP提取(注意防伪造,建议配合set_real_ip_from使用) -
请求唯一标识:如
$request_id(需启用ngx_http_core_module的request_id指令)或自定义 trace_id -
用户身份信息:如
$http_authorization(脱敏处理)、$cookie_user_id、或后端透传的$upstream_http_x_user_id -
完整请求行与响应结果:包括
$request(含 method、path、proto)、$status、$body_bytes_sent、$upstream_status(区分 Nginx 与后端错误) -
时间精度与来源:使用
$time_iso8601或$msec,避免仅用$time_local(时区不统一) -
协议与加密信息:如
$server_protocol、$ssl_protocol、$ssl_cipher(用于 TLS 审计)
编写符合审计规范的 log_format
在 http 块中定义格式,字段顺序、分隔符、空值占位需与审计文档一致(例如用双引号包裹字符串、空字段填 -)。示例:
log_format audit_log '$time_iso8601|$remote_addr|$http_x_forwarded_for|$request_id|' '"$request_method $request_uri $server_protocol"|' '$status|$body_bytes_sent|$upstream_status|' '"$http_user_agent"|"$http_referer"|' '$request_time|$upstream_response_time|' '$ssl_protocol/$ssl_cipher|' '"$http_authorization"';
说明:
- 用
|分隔字段,便于日志解析(比空格更可靠) -
$http_x_forwarded_for仅在可信代理链下使用;生产环境应配合real_ip_header X-Forwarded-For;和set_real_ip_from白名单 -
$request_time是请求处理总耗时(毫秒级),$upstream_response_time可定位后端慢调用 -
$http_authorization记录原始认证头,审计时需确认是否脱敏(如正则替换 Bearer Token 中间字符)
绑定日志格式到 server 或 location
在对应作用域使用 access_log 启用该格式,并指定日志路径和缓冲参数提升性能:
server {
listen 443 ssl;
server_name example.com;
<pre class="brush:php;toolbar:false;">access_log /var/log/nginx/audit_access.log audit_log buffer=128k flush=5s;
error_log /var/log/nginx/audit_error.log warn;
# 其他配置...}
关键点:
- 避免在
http块全局启用高开销格式,按业务域名或路径精细化开启 -
buffer和flush减少磁盘 I/O,但需权衡日志实时性(审计可能要求秒级落盘) - 敏感字段(如 Authorization、Cookie)若需审计留存,必须确保日志文件权限严格(
600),并纳入日志轮转与加密归档流程
验证与持续维护
上线前必须验证日志内容准确性:
- 用
curl -H "X-Forwarded-For: 203.0.113.10" https://example.com/test测试真实IP提取 - 检查
$request_id是否每请求唯一(需确认模块已加载) - 模拟后端超时或 5xx,确认
$upstream_status和$status区分正确 - 用
awk -F'|' '{print $4,$7}' /var/log/nginx/audit_access.log | head快速抽样校验字段对齐
审计日志不是一次配置完成,需随业务接口变更同步更新字段(如新增 JWT 解析头、灰度标记 header),并定期用日志分析工具(如 Loki + Promtail)做字段完整性巡检。











