关键是要用logrotate建立自动、可验证、不可绕过的日志生命周期管理机制,如配置daily+rotate 30实现30天自动轮转清理,并通过postrotate发送usr1信号确保nginx重开日志文件,辅以find兜底清理和ip等字段匿名化,满足gdpr存储限制与等保三级180天等合规要求。

要让 Nginx 日志满足合规审计的保留时长要求,关键不是“只配 Nginx”,而是建立一套自动、可验证、不可绕过的日志生命周期管理机制。Nginx 本身不提供日志自动删除功能,必须依赖外部工具(主要是 logrotate)配合策略落地。
明确合规目标再定保留天数
不同法规对日志保留期有不同导向:
- GDPR:强调“存储限制”,不规定具体天数,但实践中通常设为 7–30 天,且需同步对 IP、User-Agent 等字段做匿名化处理
- 等保三级:明确要求访问日志保留 ≥180 天,错误日志也需同等保留
- 金融或行业规范:部分场景要求 ≥2 年,此时需结合归档与冷存储(如对象存储+生命周期策略),而非仅靠本地轮转
保留天数一旦确定,就必须在配置中硬编码,不能依赖人工清理。
用 logrotate 实现可靠轮转与限期清理
这是最通用、最被审计认可的方式。以保留 30 天为例,在 /etc/logrotate.d/nginx 中配置:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
sharedscripts
postrotate
[ -f /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
endscript
}
重点说明:
-
rotate 30表示只保留最近 30 个归档文件(对应 30 天),超出即自动删除 -
postrotate中的kill -USR1是必需操作,通知 Nginx 关闭旧文件句柄、打开新日志文件,避免日志丢失 -
compress+delaycompress可节省磁盘空间,且不影响当日排查(当日日志不压缩)
⚠️ 注意:确保 Nginx 进程有权限读取
/run/nginx.pid;若使用容器或非标准路径,需同步调整pid文件位置和postrotate脚本。
补充兜底机制,防止单点失效
logrotate 依赖定时任务(cron)执行,存在失败可能。建议增加一层保障:
- 每日凌晨运行一次
find清理超期文件(作为冗余手段,非替代 logrotate):find /var/log/nginx/ -name "access.log.*" -mtime +30 -delete
- 将该命令加入 crontab,并配合简单日志记录,便于审计回溯:
0 2 * * * find /var/log/nginx/ -name "access.log.*" -mtime +30 -print -delete >> /var/log/nginx/cleanup.log 2>&1
配合日志内容治理,提升合规深度
保留时长只是合规的一半,另一半是日志里存了什么:
- 对 IP 地址脱敏:在
log_format中用map指令截断或哈希,例如只保留前两段192.168.x.x - 敏感头字段(如
Authorization、Cookie)默认不记录;如必须审计,需先正则替换令牌中间字符 - 使用结构化格式(如 JSON)并启用
request_id,方便后续按请求全链路追溯,减少对原始日志的长期依赖
合规审计不仅看“有没有删”,更查“删得准不准、留得有没有依据、改没改过配置”。把 logrotate 配置纳入版本管理,每次变更附带合规依据说明(如“响应等保三级第8.1.4条”),才是真正可落地的实践。











