首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Nginx 日志轮转实战指南:按天、周、月、年自动切割与归档(附完整案例)

Nginx 日志轮转实战指南:按天、周、月、年自动切割与归档(附完整案例)

作者头像
用户9832121
发布2025-08-01 14:11:24
发布2025-08-01 14:11:24
5780
举报

一、需求场景

在高并发 Web 服务中,Nginx 作为反向代理或静态服务器,每天会产生大量访问日志(access.log)和错误日志(error.log)。如果不进行日志轮转(Log Rotation),日志文件会越来越大,不仅占用磁盘空间,还会导致:

  • 查看日志困难
  • 备份效率低
  • 故障排查耗时
  • 甚至可能撑爆磁盘,导致服务中断

本文将带你深入掌握 Nginx 日志轮转的最佳实践,涵盖 按天、按周、按月、按年 等多种实用场景,并提供完整配置案例,助你实现自动化、可维护的日志管理体系。

二、什么是日志轮转?

日志轮转(Log Rotation) 是指定期将当前日志文件重命名归档,并创建一个新的空日志文件继续写入的过程。常见操作包括:

  • 切割日志(如每天生成一个新文件)
  • 压缩旧日志(节省空间)
  • 删除过期日志(如保留30天)
  • 通知服务重新打开日志文件(reopen)

在 Linux 系统中,我们通常使用 logrotate 工具来实现这一功能。

三、logrotate 简介

logrotate 是 Linux 自带的日志管理工具,支持:

  • 定时轮转(通过 cron)
  • 按大小或时间切割
  • 压缩、删除、邮件通知
  • 执行自定义脚本(如 kill -USR1 通知 Nginx)

配置文件路径:

/etc/logrotate.conf 主配置

/etc/logrotate.d/ 第三方服务配置目录(推荐)

四、日志轮转通用配置

基础配置(推荐放入 /etc/logrotate.d/nginx)

/usr/local/nginx/logs/*.log {

daily

missingok

rotate 30

compress

delaycompress

notifempty

create 0644 nginx nginx

sharedscripts

postrotate

if [ -f /usr/local/nginx/logs/nginx.pid ]; then

kill -USR1 cat /usr/local/nginx/logs/nginx.pid

fi

endscript

}

配置说明:

  • daily:每天轮转一次
  • missingok:日志文件不存在时不报错
  • rotate 30:最多保留30个归档日志
  • compress:使用 gzip 压缩旧日志
  • delaycompress:延迟压缩,避免当天日志被立即压缩
  • notifempty:日志为空时不轮转
  • create 0644 nginx nginx:创建新日志文件,权限644,属主nginx
  • sharedscripts:所有日志只执行一次 postrotate 脚本
  • postrotate ... endscript:轮转后通知 Nginx 重新打开日志文件

提示:kill -USR1 是 Nginx 的“重新打开日志文件”信号,不会中断服务。

五、不同场景下的策略

场景1:按天轮转(最常用)

适用于大多数中小型网站。

/etc/logrotate.d/nginx-day

/usr/local/nginx/logs/access.log {

daily

rotate 365

compress

missingok

notifempty

create 0644 nginx nginx

sharedscripts

postrotate

/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || true

endscript

}

效果:

  • 每天生成:access.log-20250405.gz
  • 保留最近365天日志
  • 适合日均日志 < 1GB 的场景

场景2:按周轮转(减少文件数量)

适合日志量中等,希望减少碎片化文件的场景。

/etc/logrotate.d/nginx-week

/usr/local/nginx/logs/access.log {

weekly

rotate 52

compress

missingok

notifempty

create 0644 nginx nginx

sharedscripts

postrotate

/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || true

endscript

}

效果:

  • 每周日切割一次
  • 文件名如:access.log-20250406.gz(周日日期)
  • 保留最近52周(约1年)

场景3:按月轮转(适合大站归档)

适合日志量巨大、需长期归档的大型网站。

/etc/logrotate.d/nginx-month

/usr/local/nginx/logs/access.log {

monthly

rotate 24

compress

missingok

notifempty

create 0644 nginx nginx

sharedscripts

postrotate

/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || true

endscript

}

效果:

  • 每月1号切割
  • 文件名:access.log-202504.gz
  • 保留24个月(2年)

场景4:按年轮转(历史归档)

适用于需要长期保留原始日志的合规性需求。

/etc/logrotate.d/nginx-year

/usr/local/nginx/logs/access.log {

yearly

rotate 10

compress

missingok

notifempty

create 0644 nginx nginx

sharedscripts

postrotate

/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || true

endscript

}

效果:

  • 每年1月1日切割
  • 文件名:access.log-2025.gz
  • 保留10年

场景5:按大小轮转(突发流量应对)

适合突发高并发场景,防止单个日志过大。

/etc/logrotate.d/nginx-size

/usr/local/nginx/logs/access.log {

size 100M

rotate 10

compress

missingok

notifempty

create 0644 nginx nginx

sharedscripts

postrotate

/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || true

endscript

}

效果:

  • 日志超过 100MB 立即切割
  • 适合直播、秒杀等场景

六、测试 logrotate 配置

  1. 模拟运行(不实际操作)

logrotate -d /etc/logrotate.d/nginx

-d 表示 debug 模式,查看执行流程。

  1. 强制执行一次轮转

logrotate -f /etc/logrotate.d/nginx

-f 表示强制轮转,可用于测试。

  1. 查看历史记录

cat /var/lib/logrotate/status

logrotate -v /etc/logrotate.conf

七、自定义日志路径与归档

示例:将日志按年月分类归档

postrotate

创建年月目录并移动压缩文件

LOG_DIR="/data/logs/nginx"

DATE=$(date -d "yesterday" +%Y-%m)

mkdir -p "

mv /usr/local/nginx/logs/.log- "

endscript

效果:

/data/logs/nginx/

├── 2025-04/

│ ├── access.log-20250405.gz

│ └── error.log-20250405.gz

├── 2025-03/

└── ...

八、常见问题与解决方案

问题:日志未切割

原因:logrotate 未运行

解决方案:检查 /etc/cron.daily/logrotate 是否存在

问题:切割后 Nginx 不写新日志

原因:未发送 USR1 信号

解决方案:确保 postrotate 正确执行

问题:权限错误

原因:新日志属主不对

解决方案:使用 create 0644 nginx nginx

问题:日志被重复压缩

原因:delaycompress 缺失

解决方案:添加 delaycompress

问题:磁盘满

原因:旧日志未删除

解决方案:设置合理的 rotate N

九、最佳实践建议

  1. 中小站点:使用 daily + rotate 30 + compress
  2. 大流量站点:结合 size 100M 防止单文件过大
  3. 合规需求:按月/年归档,保留5~10年
  4. 集中管理:将日志同步到 ELK/Splunk 等系统
  5. 监控告警:监控日志目录大小,防止磁盘爆满

Nginx 日志轮转不是“可有可无”的功能,而是保障系统稳定、提升运维效率的关键一环。通过 logrotate,你可以轻松实现:

  • 按天、周、月、年自动切割
  • 压缩归档,节省空间
  • 自动清理,防止磁盘爆炸
  • 无缝通知 Nginx,服务不中断

现在就动手配置吧!让你的 Nginx 日志管理更智能、更高效。

附:一键部署脚本(可选)

自动创建 nginx 日志轮转配置(按天)

cat > /etc/logrotate.d/nginx << 'EOF'

/usr/local/nginx/logs/*.log {

daily

rotate 365

compress

delaycompress

missingok

notifempty

create 0644 nginx nginx

sharedscripts

postrotate

if [ -f /usr/local/nginx/logs/nginx.pid ]; then

kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

fi

endscript

}

EOF

测试配置

logrotate -d /etc/logrotate.d/nginx

提示:请根据实际路径调整 nginx.pid 和日志路径。

十、推荐工具:灵燕空间-HTTPS证书图形化控制台

管理 Nginx 时,除了日志轮转,SSL 证书的申请、部署与监控也是运维中的高频痛点。手动更新证书容易遗忘,导致网站 HTTPS 中断。

推荐使用国产神器:灵燕空间 - HTTPS证书图形化控制台

为什么选择灵燕空间?

  • 图形化界面:告别命令行,鼠标点点完成证书申请
  • 自动续期:支持 Let's Encrypt 等,到期自动更新
  • 多站点管理:统一管理上百个域名证书
  • 微信/邮件告警:证书即将过期,第一时间通知你
  • 完全免费:个人与企业均可免费使用

官网地址:https://www.lingyanspace.com

让你的 Nginx 运维更简单、更安全!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数字科技 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档