CentOS Nginx日志清理的最佳实践
导读:CentOS 上 Nginx 日志清理与轮转最佳实践 一 核心原则与准备 采用按天轮转 + 压缩 + 保留策略,避免单文件无限增长;对访问量大的场景建议保留7–30 天,合规或审计要求更长的可设置90–365 天。 优先使用系统自带的 l...
CentOS 上 Nginx 日志清理与轮转最佳实践
一 核心原则与准备
- 采用按天轮转 + 压缩 + 保留策略,避免单文件无限增长;对访问量大的场景建议保留7–30 天,合规或审计要求更长的可设置90–365 天。
- 优先使用系统自带的 logrotate 做自动化管理;在 Docker 或极简容器中若缺少 logrotate,可用 Shell 脚本 + cron 替代。
- 轮转或清理前,务必让 Nginx 重新打开日志文件,确保写入不中断:使用 kill -USR1 或 nginx -s reopen。
- 统一日志路径与权限:常见路径为 /var/log/nginx/;按实际环境设置属主属组(如 nginx:nginx 或 root:adm),避免因权限导致轮转失败。
- 操作前建议备份关键日志,并在低峰时段执行;清理策略以“压缩旧日志、删除超期日志”为主,避免直接删除正在写入的当前日志文件。
二 推荐方案 Logrotate 标准配置
- 宿主机或容器内有 logrotate 时,创建配置文件 /etc/logrotate.d/nginx(路径与用户组按实际调整):
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
# 兼容 pid 文件或进程查找
if [ -f /run/nginx.pid ];
then
kill -USR1 $(cat /run/nginx.pid 2>
/dev/null)
else
kill -USR1 $(ps axu | awk '/nginx: master process/ &
&
!/grep/ {
print $2;
exit}
')
fi
endscript
}
- 调试与强制执行(建议先在测试环境验证):
- 语法检查与试运行:
logrotate -d /etc/logrotate.d/nginx - 强制执行一次:
logrotate -vf /etc/logrotate.d/nginx
- 语法检查与试运行:
- 定时执行由系统的 crond 负责(通常每日运行),无需额外添加 crontab 行。该方案具备“按天轮转、压缩、保留 52 份、空文件不轮转、轮转后重新打开日志”等能力。
三 Docker 与无 Logrotate 环境的替代方案
- 适用场景:容器镜像未安装 logrotate,或希望用脚本完全掌控轮转与清理。
- 示例脚本(按天切割、压缩、保留 N 天,轮转后重新打开日志):
#!/usr/bin/env bash
set -euo pipefail
LOG_DIR="/var/log/nginx"
DAYS_TO_KEEP=30
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
cd "$LOG_DIR" || {
echo "日志目录不存在: $LOG_DIR";
exit 1;
}
# 1) 轮转
[ -f access.log ] &
&
mv -f access.log "access_${
YESTERDAY}
.log"
[ -f error.log ] &
&
mv -f error.log "error_${
YESTERDAY}
.log"
# 2) 重新打开日志(平滑,不中断服务)
if [ -f /run/nginx.pid ];
then
kill -USR1 "$(cat /run/nginx.pid)"
else
kill -USR1 "$(ps axu | awk '/nginx: master process/ &
&
!/grep/ {
print $2;
exit}
')"
fi
# 3) 压缩昨天的日志
gzip -f "access_${
YESTERDAY}
.log" 2>
/dev/null || true
gzip -f "error_${
YESTERDAY}
.log" 2>
/dev/null || true
# 4) 清理超期日志(按修改时间)
find "$LOG_DIR" -type f \( -name "access_*.log*" -o -name "error_*.log*" \) -mtime +${
DAYS_TO_KEEP}
-delete
echo "$(date '+%F %T') 轮转与清理完成(保留 ${
DAYS_TO_KEEP}
天)" >
>
"$LOG_DIR/rotate_cleanup.log"
- 赋权与定时:
- 赋权:
chmod +x /usr/local/bin/rotate_nginx_logs.sh - 定时:每天 00:00 执行
0 0 * * * /usr/local/bin/rotate_nginx_logs.sh
- 赋权:
- 如容器不支持信号或 -s reopen,可在脚本中使用
docker restart nginx作为兜底(会带来短暂中断)。
四 紧急处置与安全注意
- 磁盘将满时的安全做法(尽量不停机):
- 清空当前日志而不删除文件:
> /var/log/nginx/access.log或truncate -s 0 /var/log/nginx/access.log - 随后尽快完成一次“轮转 + 重新打开日志”,恢复正常写入。
- 清空当前日志而不删除文件:
- 不建议的做法:
- 直接
rm当前正在写入的 access.log/error.log 而不通知 Nginx 重新打开,可能导致写入失败或文件句柄异常。 - 在 Docker 中盲目
docker restart nginx会影响可用性,优先尝试kill -USR1或nginx -s reopen。
- 直接
- 权限与属主:
- 确保日志目录与文件可被 Nginx 工作进程写入(常见为 nginx:nginx 或 root:adm),否则轮转会失败。
五 监控与容量规划
- 建立监控告警:对 /var/log 所在分区设置磁盘使用率阈值(如 80% 预警、90% 严重),并联动执行轮转或清理脚本。
- 容量预估公式:日增量(GB)× 保留天数 × 压缩比(gzip 通常约 70–90% 节省)。例如:日增 5GB、保留 30 天、压缩后约 25%,需约 5 × 30 × 0.25 ≈ 37.5GB 空间。
- 定期审计:核查 logrotate 是否按计划执行(查看 /var/lib/logrotate/status 或系统日志),并抽样检查压缩与清理是否生效。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: CentOS Nginx日志清理的最佳实践
本文地址: https://pptw.com/jishu/779004.html
