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

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

关键词:Nginx日志轮转、logrotate、按天切割、按月归档、日志管理

在高并发 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/ # 第三方服务配置目录(推荐)

🛠️ 三、Nginx 日志轮转通用配置模板 ✅ 基础配置(推荐放入 /etc/logrotate.d/nginx) # /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 模式,查看执行流程。 2. 强制执行一次轮转 logrotate -f /etc/logrotate.d/nginx -f 表示强制轮转,可用于测试。 3. 查看历史记录 cat /var/lib/logrotate/status 或 logrotate -v /etc/logrotate.conf

📁 六、高级技巧:自定义日志路径与归档

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

postrotate

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

LOG_DIR="/data/logs/nginx" DATE=(date -d "yesterday" +%Y-%m) mkdir -p "LOG_DIR/DATE" mv /usr/local/nginx/logs/\*.log-\* "LOG_DIR/$DATE/" 2>/dev/null || true 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

📊 八、最佳实践建议

中小站点:使用 daily + rotate 30 + compress

大流量站点:结合 size 100M 防止单文件过大

合规需求:按月/年归档,保留5~10年

集中管理:将日志同步到 ELK/Splunk 等系统

监控告警:监控日志目录大小,防止磁盘爆满

✅ 结语 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 运维更简单、更安全!

📬 欢迎留言交流:你在生产环境中是如何管理 Nginx 日志和证书的?欢迎分享你的经验!