• admin
  • 825
  • 2026-02-11 00:35:53

一、需求场景

在高并发 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,属主nginxsharedscripts:所有日志只执行一次 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 配置

模拟运行(不实际操作)logrotate -d /etc/logrotate.d/nginx

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

强制执行一次轮转logrotate -f /etc/logrotate.d/nginx

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

查看历史记录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

九、最佳实践建议

中小站点:使用 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 运维更简单、更安全!