Nginx 日志轮转实战指南:按天、周、月、年自动切割与归档(附完整案例)
Nginx 日志轮转实战指南:按天、周、月、年自动切割与归档(附完整案例)
作者:运维小站 | 发布时间:2025年4月5日
关键词: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 日志和证书的?欢迎分享你的经验!
Nginx 日志轮转实战指南:按天、周、月、年自动切割与归档(附完整案例)的更多相关文章
- 利用ELK分析Nginx日志生产实战(高清多图)
本文以api.mingongge.com.cn域名为测试对象进行统计,日志为crm.mingongge.com.cn和risk.mingongge.com.cn请求之和(此二者域名不具生产换环境统计意 ...
- 03 . Nginx日志配置及日志切割
Nginx日志 日志对于统计排错来说是非常有利的,Nginx日志主要分为两种: access_log(访问日志)和error_log(错误日志),通过访问日志可以得到用户的IP地址.浏览器的信息,请求 ...
- Linux下nginx生成日志自动切割
1.编辑切割日志的 shell 程序,目录自定 #vi /data/nginx/cut_nginx_log.sh 输入代码: #!/bin/bash # This script run at 00:0 ...
- 【shell脚本】nginx每天自动切割日志脚本
nginx每天日志量比较大的时候,最好每天自动切割,存储,这样可以方面以后的查询和分析 #!/bin/sh ################### #filename: nginx_log_rotat ...
- elk实战分析nginx日志文档
elk实战分析nginx日志文档 架构: kibana <--- es-cluster <--- logstash <--- filebeat 环境准备:192.168.3.1 no ...
- 093实战 Nginx日志切割,以及脚本上传nginx的切割日志
一:日志切割步骤 命令都在root下进行 1.创建目录 mkdir -p /etc/opt/modules/bin ## 创建文件夹 2.上传cut 3.观察目录 4.修改的cut文件 5.检测 需要 ...
- logrotate日志轮转
1)基本介绍 适合应用服务日志,系统日志按天切割 如果没有日志轮转,日志文件会越来越大 将丢弃系统中最旧的日志文件,以节省空间 logrotate本身不是系统守护进程,它是通过计划任务crond每天执 ...
- 2020 最新 Kubernetes实战指南
1.Kubernetes带来的变革 对于开发人员 由于公司业务多,开发环境.测试环境.预生产环境和生产环境都是隔离的,而且除了生产环境,为了节省成本,其他环境可能是没有日志收集的,在没有用k8s的 ...
- 烂泥:切割nginx日志
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 这几天自己看了下博客的nginx日志,发现日志文件发现越来越大. 因为nginx自己不会 ...
- 大数据存储:MongoDB实战指南——常见问题解答
锁粒度与并发性能怎么样? 数据库的读写并发性能与锁的粒度息息相关,不管是读操作还是写操作开始运行时,都会请求相应的锁资源,如果请求不到,操作就会被阻塞.读操作请求的是读锁,能够与其它读操作共享,但是当 ...
随机推荐
- 数据库事务隔离与Alembic数据恢复的实战艺术
title: 数据库事务隔离与Alembic数据恢复的实战艺术 date: 2025/05/15 00:05:13 updated: 2025/05/15 00:05:13 author: cmdra ...
- Alexander ——2024年报
Alexander --2024年报 小总结 知己知彼,百战不殆.2024下半年找到了自己学习的方向,也认识很多的师傅,深入领域学习,无时不刻不在CTF的路上,逐渐建立一个完整的知识库体系. 今年的成 ...
- golang unsafe遇上字符串拼接优化导致的bug
最近料理老项目的时候被unsafe坑惨了,这里挑一个最不易察觉的错误记录一下. 这个问题几乎影响近几年来所有的go版本,为了方便讨论我就用最新版的1.24.3做例子了. 线上BUG 我们有一个收集集群 ...
- FastAPI与MongoDB分片集群:异步数据路由与聚合优化
title: FastAPI与MongoDB分片集群:异步数据路由与聚合优化 date: 2025/05/26 16:04:31 updated: 2025/05/26 16:04:31 author ...
- 鸿蒙版《智慧农业APP》通过华为云IoT平台实现软件硬件互联
一.原理图 本篇不涉及硬件相关的功能开发,硬件设备使用MQTT客户端模拟,如果有硬件相关经验的可以直接使用真实硬件代替MQTT客户端. 1.华为云物联网服务器 华为云物联网平台是硬件设备端跟移动APP ...
- 探秘Transformer系列之(36)--- 大模型量化方案
探秘Transformer系列之(36)--- 大模型量化方案 目录 探秘Transformer系列之(36)--- 大模型量化方案 0x00 概述 0x01 8位量化 1.1 LLM.int8() ...
- linux下wget静默模式下载
说明 在一些场景下,文件较大时,通过wget下载会展示时候进度,输出太多,这里我们如果想屏蔽输出可以采取静默模式 wget --quiet http://fileserver.test.com/cud ...
- 直播预约丨《袋鼠云大数据实操指南》No.4:数据服务API实战解读,助力企业数字化跃迁
近年来,新质生产力.数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕. 面对这些引领经济转型的新兴概念,为了 ...
- 第一次通过 SSH key 免密连接 GitHub 的完整过程
原文:https://ichochy.com/posts/blog/20221107.html 通过密码连接GitHub总是要输入密码,麻烦,现在使用 SSH key 可以轻松实现免密验证. 创建 S ...
- ArcObjects SDK 009 Map-Layer的结构
1.Map-Layer主干结构 一个mxd文件可以包含多个地图,但我们常用的大部分都是包含一个地图.一个地图可以包含多个图层组和图层,而图层指向的则是实际数据.图层可以控制数据是否显示.显示样式.最大 ...