如何运用CentOS Nginx日志切割技巧,有效提高网站运维效率?
- 内容介绍
- 文章标签
- 相关推荐
至于运维痛点,Nginx日志不切割会带来哪些麻烦
网站上线后访问量继续增长。Nginx access.log 以 G/天 的速度膨胀。没有切割的日志会带来一系列真实痛点:硬盘空间被迅速占满导致站点 502/503;单文件动辄数十 GB,grep、awk 查询耗时数分钟甚至卡死;备份时占用大量带宽和时间;手动 mv 日志再 reload 时操作失误容易丢日志或出现日志写入失败。在凌晨业务低峰期忘记处理,第二天磁盘告警直接影响业务。老实说,
为什么要在 CentOS 上做 Nginx 日志切割
Nginx 本身没有内置 rotate 功能。如果不处理,日志文件将变得越来越大。合理切割可有效减少单个日志大小。提高查询效率,便于归档备份和清理,降低运维成本。
1. 推荐方法:程序级 logrotate
使用程序自带的 logrotate 管理 Nginx 日志,稳定、可审计、与程序定时任务集成。是 CentOS 下的常用方法。
配置放入 /etc/logrotate.d/nginx针对常用方法 /var/log/nginx/*.log 的标准配置如下:
/var/log/nginx/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 nginx nginx
sharedscripts
postrotate
&& kill -USR1 $
endscript
}
参数说明:
- daily: 每天轮转,可换成 weekly/monthly/hourly。
- rotate 30: 保留 30 个归档。中小站点 daily + rotate 7~30 + compress 足够,大流量可叠加 size 策略。
- compress / delaycompress: 压缩旧日志,当天不压缩避免影响写入。
- missingok / notifempty: 文件不存在或为空时不报错。不过,
- create 0640 nginx nginx: 切分后新建文件权限与属主。避免权限错误导致写入失败。
- sharedscripts: 只为整个日志组运行一次脚本,避免多次发送信号。
- postrotate 中 kill -USR1: 给 Nginx 主进程发送 USR1 信号。让其重新打开日志文件,保证新请求写入新文件而不会丢数据。
2. 配置步骤与验证方法
A. 创建配置文件并适配实际方法:
yum 安装方式的 Nginx 日志通常在 /var/log/nginx/,部署程序多为 /usr/local/nginx/logs/,请根据实际情况修改方法及 pid 方法。如 /usr/local/nginx/logs/nginx.pid
B. 测试执行:
# 调试模式查看执行逻辑 logrotate -d /etc/logrotate.d/nginx # 强制执行一次验证效果 logrotate -vf /etc/logrotate.d/nginx
如果不出意外可在目标目录下发现类似 access.log-20250803 的归档文件,且当前 access.log 被重新创建并可写。若未生成,请检查 crontab 执行时间及权限问题。
3. 高级策略与实用参数组合参考
/usr/local/nginx/logs/*.log {
daily
rotate 20
size 100k # 可叠加按大小触发轮转。防止突发流量单日过大
dateext # 使用日期作为后缀,更易识别
dateformat -%Y%m%d-%s
missingok
notifempty
create 644 root root
sharedscripts
postrotate
if;n
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
fi
endscript
}
再看常见选项,daily/weekly/monthly/hourly 切分频率
size N 到达 N 即切分
compress/delaycompress 压缩旧日志
copytruncate 直接截断原文件,慎用。易有短暂丢失风险
dateext 日期后缀命名更直观
missingok/notifempty 防错容错
sharedscripts 多个匹配文件只执行一次脚本
prerotate/postrotate 在转储前后执行的命令,必须单独成行
end script 脚本结束标记
kill -USR1 : USR1信号将停止接受新连接等待当前连接结束并重开日志,不会中断服务。说起来,注意点的观点是,logrotate 基于 crontab 运行。具体时间可查 /etc/crontab 或 /etc/anacrontab 下的 /etc/cron.daily/logrotate。若采用脚本手动切分,建议流程:mv 原日志 -> 按日期命名 -> kill -USR1 重启日志。示例脚本思路这方面,#,按理说,/bin/bash
logs_path=/usr/local/nginx/logs/
pid_path=/usr/local/nginx/logs/nginx.pid
rq=`date +%Y-%m-%d`
mv ${logs_path}access.log ${logs_path}access_${rq}.log
kill -USR1 `cat ${pid_path}`
但相比之下 logrotate 更稳定且无需自行维护定时任务。SELinux 环境需注意上下文。例如 chcon -R -t httpd_log_t /var/log/nginx,否则可能无法正常写入。Windows 编辑配置文件导致 ^M 回车符,需用 dos2unix 或 vi :set ff=unix 清理。容器环境无 logrotate 时使用宿主机统一管理或按日期命名方案。中小站点 daily + rotate 7~30 + compress 足够;大流量建议叠加 size 策略并定期清理超过保留期的归档。通过以上 CentOS+Nginx 日志切割技巧。可减少磁盘告警、提高检索效率,自动运行运维,降低人为操作风险,提高网站整体运维效率。至于运维痛点,Nginx日志不切割会带来哪些麻烦
网站上线后访问量继续增长。Nginx access.log 以 G/天 的速度膨胀。没有切割的日志会带来一系列真实痛点:硬盘空间被迅速占满导致站点 502/503;单文件动辄数十 GB,grep、awk 查询耗时数分钟甚至卡死;备份时占用大量带宽和时间;手动 mv 日志再 reload 时操作失误容易丢日志或出现日志写入失败。在凌晨业务低峰期忘记处理,第二天磁盘告警直接影响业务。老实说,
为什么要在 CentOS 上做 Nginx 日志切割
Nginx 本身没有内置 rotate 功能。如果不处理,日志文件将变得越来越大。合理切割可有效减少单个日志大小。提高查询效率,便于归档备份和清理,降低运维成本。
1. 推荐方法:程序级 logrotate
使用程序自带的 logrotate 管理 Nginx 日志,稳定、可审计、与程序定时任务集成。是 CentOS 下的常用方法。
配置放入 /etc/logrotate.d/nginx针对常用方法 /var/log/nginx/*.log 的标准配置如下:
/var/log/nginx/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 nginx nginx
sharedscripts
postrotate
&& kill -USR1 $
endscript
}
参数说明:
- daily: 每天轮转,可换成 weekly/monthly/hourly。
- rotate 30: 保留 30 个归档。中小站点 daily + rotate 7~30 + compress 足够,大流量可叠加 size 策略。
- compress / delaycompress: 压缩旧日志,当天不压缩避免影响写入。
- missingok / notifempty: 文件不存在或为空时不报错。不过,
- create 0640 nginx nginx: 切分后新建文件权限与属主。避免权限错误导致写入失败。
- sharedscripts: 只为整个日志组运行一次脚本,避免多次发送信号。
- postrotate 中 kill -USR1: 给 Nginx 主进程发送 USR1 信号。让其重新打开日志文件,保证新请求写入新文件而不会丢数据。
2. 配置步骤与验证方法
A. 创建配置文件并适配实际方法:
yum 安装方式的 Nginx 日志通常在 /var/log/nginx/,部署程序多为 /usr/local/nginx/logs/,请根据实际情况修改方法及 pid 方法。如 /usr/local/nginx/logs/nginx.pid
B. 测试执行:
# 调试模式查看执行逻辑 logrotate -d /etc/logrotate.d/nginx # 强制执行一次验证效果 logrotate -vf /etc/logrotate.d/nginx
如果不出意外可在目标目录下发现类似 access.log-20250803 的归档文件,且当前 access.log 被重新创建并可写。若未生成,请检查 crontab 执行时间及权限问题。
3. 高级策略与实用参数组合参考
/usr/local/nginx/logs/*.log {
daily
rotate 20
size 100k # 可叠加按大小触发轮转。防止突发流量单日过大
dateext # 使用日期作为后缀,更易识别
dateformat -%Y%m%d-%s
missingok
notifempty
create 644 root root
sharedscripts
postrotate
if;n
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
fi
endscript
}
再看常见选项,daily/weekly/monthly/hourly 切分频率
size N 到达 N 即切分
compress/delaycompress 压缩旧日志
copytruncate 直接截断原文件,慎用。易有短暂丢失风险
dateext 日期后缀命名更直观
missingok/notifempty 防错容错
sharedscripts 多个匹配文件只执行一次脚本
prerotate/postrotate 在转储前后执行的命令,必须单独成行
end script 脚本结束标记
kill -USR1 : USR1信号将停止接受新连接等待当前连接结束并重开日志,不会中断服务。说起来,注意点的观点是,logrotate 基于 crontab 运行。具体时间可查 /etc/crontab 或 /etc/anacrontab 下的 /etc/cron.daily/logrotate。若采用脚本手动切分,建议流程:mv 原日志 -> 按日期命名 -> kill -USR1 重启日志。示例脚本思路这方面,#,按理说,/bin/bash
logs_path=/usr/local/nginx/logs/
pid_path=/usr/local/nginx/logs/nginx.pid
rq=`date +%Y-%m-%d`
mv ${logs_path}access.log ${logs_path}access_${rq}.log
kill -USR1 `cat ${pid_path}`
但相比之下 logrotate 更稳定且无需自行维护定时任务。SELinux 环境需注意上下文。例如 chcon -R -t httpd_log_t /var/log/nginx,否则可能无法正常写入。Windows 编辑配置文件导致 ^M 回车符,需用 dos2unix 或 vi :set ff=unix 清理。容器环境无 logrotate 时使用宿主机统一管理或按日期命名方案。中小站点 daily + rotate 7~30 + compress 足够;大流量建议叠加 size 策略并定期清理超过保留期的归档。通过以上 CentOS+Nginx 日志切割技巧。可减少磁盘告警、提高检索效率,自动运行运维,降低人为操作风险,提高网站整体运维效率。
