Nginx日志生命周期管理须通过logrotate自动化实现:配置独立文件、显式路径、daily/size触发、create设权限、sharedscripts+postrotate重载;启用compress/delaycompress、rotate/maxage控制保留;敏感字段需Nginx层脱敏;辅以校验告警及安全脚本规范。

在 Nginx 环境中,日志生命周期管理(生成、轮转、压缩、清理)不能仅靠手动操作,必须通过自动化脚本保障安全、合规与系统稳定。核心是防止日志无限增长导致磁盘打满,避免敏感信息长期留存,同时满足审计追溯要求。
用 logrotate 实现标准化日志轮转
logrotate 是 Linux 下最成熟、最轻量的日志管理工具,Nginx 官方也推荐使用它替代自写脚本。关键是配置合理、权限可控、动作可审计。
- 创建独立配置文件:/etc/logrotate.d/nginx,避免混入全局配置
- 显式指定日志路径(如 /var/log/nginx/*.log),不依赖通配符误匹配其他文件
- 启用 daily 或 size 100M 触发条件,避免按周轮转导致单个文件过大
- 添加 create 640 nginx nginx,确保新日志权限为 rw-r-----,防止非特权用户读取访问日志中的 URL 参数或 IP
- 使用 sharedscripts + postrotate … nginx -s reload,保证重载只执行一次,且仅在真正轮转后触发
自动压缩与保留策略控制存储风险
原始日志需及时压缩,既节省空间,又降低未授权访问明文日志的风险;保留时长必须符合内部策略与等保/GDPR 类要求(如:访问日志保留 90 天,错误日志保留 30 天)。
- 在 logrotate 配置中启用 compress(默认用 gzip),并添加 delaycompress 避免刚轮转的日志被立即压缩,方便紧急排查
- 用 rotate 90 控制归档文件总数,配合 maxage 90 确保超期文件被彻底删除(二者结合更可靠)
- 对含敏感字段(如 Authorization、Cookie、card_no)的日志,应在 Nginx 的 log_format 中提前过滤或脱敏,而不是依赖后期脚本处理
补充校验与异常告警机制
自动化不等于无感运行。需加入轻量级健康检查,防止因权限错误、磁盘只读、nginx 进程异常等导致日志停止轮转却无人知晓。
- 每日定时执行简单校验脚本(如检查 /var/log/nginx/access.log 是否 24 小时内有写入、最新 .gz 文件是否生成成功)
- 发现异常时,用 logger 写入 syslog,并通过 mail 或企业微信 webhook 推送告警(避免仅依赖本地日志)
- 禁止在脚本中硬编码密码或 token;若需调用 API 上报,使用文件方式加载凭证(如 /etc/nginx/.logwatch_auth,权限设为 600)
避免常见安全隐患的脚本编写原则
自写 Bash 脚本(如替代 logrotate)时,权限、路径、输入处理稍有疏忽就可能引入提权或路径遍历漏洞。
- 所有路径使用绝对路径(如 /usr/bin/find 而非 find),防止 $PATH 被篡改利用
- 变量引用一律加双引号:"$log_dir",避免空格或特殊字符导致命令注入
- 不使用 rm -rf /xxx/* 类危险模式;清理前先 find … -print | head -5 预览,生产环境建议改用 mv 到隔离目录 + 延迟删除
- 脚本自身权限设为 750,属主 root,属组 nginx 或 logadm,禁止 world-writable











