📣读完这篇文章里你能收获到
- 📈 学习如何通过 Logrotate 自动化 Nginx 日志轮转,节省存储空间并提高效率
- 🔒 掌握 Logrotate 的高级配置技巧,确保日志数据的安全性和完整性
- 💡 探索 Nginx 日志的最佳实践,优化网站性能和用户体验
- 📆 了解如何通过 Logrotate 定期清理旧日志,避免潜在的安全隐患
文章目录
一、引言
随着网站流量的增长,Nginx 服务器产生的日志文件不断累积,不仅占用大量磁盘空间,而且对日志的查阅、分析和管理带来挑战。本文将详细介绍如何利用 Linux 中强大的日志管理工具——Logrotate,对 Nginx 的访问日志和错误日志进行自动化归档、压缩、清理,实现高效日志管理。一起来探索吧!
1.1 日志文件的重要性
- 监控:实时监控服务器状态与用户行为,及时发现异常流量或潜在安全威胁。
- 故障排查:深入分析日志记录,快速定位并解决问题。
- 审计:满足合规要求,留存历史数据以备审查。
1.2 Nginx 日志概览
- 访问日志:记录客户端请求信息,如IP、请求时间、请求方法、URL、响应状态码等。
- 错误日志:记录服务器内部错误、警告及调试信息。
1.3 面临的问题
- 日志文件增长:持续写入导致单个日志文件体积庞大,影响读取效率。
- 管理挑战:手动清理、备份繁琐,易遗漏重要信息或误删文件。
二、Logrotate 简介
2.1 Logrotate 工具概述
Logrotate 是 CentOS 操作系统内置日志管理工具,该工具可对系统中生成的大量日志文件进行归档管理,其允许对日志文件实行压缩、删除或邮寄等操作。Logrotate 可以按照每天、周、月或达到某一大小的日志文件进行归档操作,Logrotate 基于 anacrontab 实现计划任务,只需在 /etc/logrotate.d 目录下编写相关日志管理配置文件,就可以无须人工干预使用自动化方式完成日志归档操作。
它可以自动执行以下操作:
- 日志轮换:定期或按文件大小自动切割日志,创建归档文件。
- 压缩:对归档日志进行压缩,节省存储空间。
- 删除:按策略删除过期日志。
- 邮件通知:可配置发送归档日志摘要或异常信息至指定邮箱。
2.2 安装与验证
一般 Linux 都已经自带 logrotate,下列命令可以查看是否已安装。
rpm -ql logrotate
没有安装的话执行以下命令安装
yum -y install logrotate
2.3 配置文件结构
- 全局配置: /etc/logrotate.conf 中的通用设置。
- 独立规则: /etc/logrotate.d/ 下针对特定服务(如 Nginx)的配置文件
/etc/logrotate.conf # logrotate主配置文件
/usr/sbin/logrotate # logrotate二进制文件
/etc/logrotate.d/ # 自定义logrotate配置文件
/var/lib/logrotate/logrotate.status # logrotate管理日志执行记录的状态文件
2.4 命令参数
-?, --help #在线帮助
-d, --debug # 测试归档配置文件
-f, --force # 立即执行归档操作
-m, --mail=command # 指定发送邮件的命令(默认为'/bin/mail')
-s, --state=statefile # 设置logrotate.status文件路径,可用于区分在同
# 一系统下以不同用户身份运行的logrotate任务
-v, --verbose # 显示配置详细信息
-l, --log=STRING # 将Logrotate执行的详情输出到指定的文件
-usage #显示指令基本用法。
logrotate -v /etc/logrotate.conf # 显示配置文件详细信息
logrotate -d /etc/logrotate.d/syslog -l /var/log/logrotate.log # 配置文件,执行测试
logrotate -f /etc/logrotate.d/syslog # 立即执行当前配置文件
三、Nginx 日志配置基础
3.1 查找 Nginx 日志路径
- 默认位置
cd /var/log/nginx
- 自定义设置:可以修改error_log及access_log路径修改日志位置
3.2 Nginx 配置文件解析
- 默认位置
cat /etc/nginx/nginx.conf
- access_log:配置访问日志路径
- error_log:配置错误日志路径
3.3 日志格式定制
- log_format:定义自定义日志格式,包括所需字段及格式化字符串。
- 各项解释如下:
- $remote_addr: 记录客户端的IP地址。
- $remote_user: 记录客户端用户(如果有)。
- “$request”: 记录包含HTTP请求方法、URI和协议的字符串。
- $status: 记录服务器响应的状态码。
- $body_bytes_sent: 记录发送给客户端的响应体字节数。
- “$http_referer”: 记录引用页面的URL。
- “$http_user_agent”: 记录客户端浏览器或用户代理的信息。
- “$http_x_forwarded_for”: 记录通过代理服务器转发请求时的客户端真实IP地址。
四、Logrotate结合Nginx实战
4.1 创建 Nginx 日志归档规则
sudo vi cd /etc/logrotate.d/nginx
/var/log/nginx/*.log {
create 0640 nginx root
daily
rotate 30
missingok
notifempty
olddir /data/nginx-log
delaycompress
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
配置说明:
/var/log/nginx/*.log
: 这是匹配要进行日志轮转的日志文件的路径模式。在这个例子中,它匹配 /var/log/nginx/ 目录下所有以 .log 结尾的文件。create 0640 nginx root
: 这个选项指定在轮转期间如果需要创建新的日志文件时使用的权限和属主。在这里,它指定创建的日志文件权限为 0640,属主为 nginx 用户,属组为 root。daily
: 这个选项表示日志文件将每天进行一次轮转。rotate 30
: 这个选项指定保留的轮转后的日志文件副本数量。在这个例子中,将保留最新的30个日志文件。missingok
: 如果日志文件不存在,这个选项告诉 logrotate 不要报错,继续进行后续操作。notifempty
: 如果日志文件为空,这个选项告诉 logrotate 不要轮转它。olddir /data/nginx-log
:将归档的日志存放到该目录下delaycompress
: 这个选项告诉 logrotate 在下一次轮转时压缩之前保留上一个日志文件,以便其他程序仍然可以访问。sharedscripts
: 这个选项告诉 logrotate 在执行后处理脚本时只运行一次,而不是对每个轮转的日志文件都执行一次。postrotate
和endscript
: 这两个选项之间的内容是在日志文件轮转后执行的命令。在这个例子中,它使用 /bin/kill 命令发送 USR1 信号给 Nginx 进程以重新打开日志文件,这样可以让 Nginx 在不停止服务的情况下切换到新的日志文件。
4.2 检查配置
- 执行以下命令检查配置是否有问题
sudo logrotate -d /etc/logrotate.d/nginx
- 手动执行以下命令,直接执行日志分割,看是否有问题
sudo logrotate -f /etc/logrotate.d/nginx
4.3 配置定时任务
- 为什么要配置定时任务?
- 因为logrotate.d下配置的日志轮转方案,是在logrotate.conf执行的时候才会执行
- logrotate.conf默认执行是
按周
执行一次 - 即使在Nginx的轮转规则中设置了每天一次的轮转频率,但仍然需要等待logrotate.conf的执行周期才会触发轮转操作
crontab -e
# 每天凌晨执行
0 0 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/nginx
- 查看定时任务
crontab -l
五、附录
5.1 Logrotate 常用配置
功能模块 | 具体指令 | 指令说明 |
---|---|---|
归档执行周期 | hourly | 日志归档周期为 1 小时,默认 Logrotate 的最小周期为 1 天,需额外调整该参数才可生效 |
daily | 日志归档周期为 1 天 | |
weekly | 日志归档周期为 1 周 | |
monthly | 日志归档周期为 1 月,通常为每月的第一天 | |
归档执行条件 | include | 读取外部参数文件 |
missingok | 如果日志文件不存在,则不显示错误信息 | |
nomissingok | 如果日志文件不存在,则显示错误信息。默认配置 | |
size | 日志文件可被归档的最小值 | |
minsize | 日志文件可被归档的最小值,没到归档周期执行时间,不会执行归档操作 | |
maxsize | 日志文件超过设定值时,即使没到归档周期执行时间,也会执行归档操作 | |
ifempty | 即使日志文件为空,也执行归档操作 | |
notifempty | 如果日志文件为空,则不进行归档。默认设置 | |
tabooext | 不对设置扩展名的日志文件执行归档操作 | |
归档文件命名 | start | 使用日志文件归档次数作为归档文件扩展名,count 默认值为 1,默认配置 |
dateext | 为归档文件名添加日期,默认追加到扩展名后 | |
dateformat | 设置归档文件名中的日期格式,使用“%Y%m%d%H”作为说明符,默认为-%Y%m%d | |
dateyesterday | 使用前一天的日期而非创建归档文件时的日期作为归档文件的文件名中的日期 | |
extension | 指定日志的扩展名,并将其设置为归档文件的扩展名,启用压缩时,压缩的扩展名在最后 | |
compressext | 启用压缩时,自定义归档文件扩展名,如将“.gz”改为“.ddd” | |
归档文件保存方式 | compress | 对归档文件启用压缩,默认为 gzip 压缩 |
nocompress | 不压缩归档文件。默认设置 | |
compresscmd | 指定压缩归档文件的命令,默认为 gzip 压缩 | |
uncompresscmd | 指定解压归档文件的命令,默认为 gunzip 解压 | |
compressoptions | 启用压缩时,设置压缩工具的命令选项 | |
delaycompress | 在下一个归档周期再对当前归档文件进行压缩 | |
nodelaycompress | 不延迟压缩。默认设置 | |
copy | 为日志文件复制一个副本后再进行归档 | |
nocopy | 不复制源日志文件。默认配置 | |
copytruncate | 复制日志文件后清空日志文件的内容 | |
nocopytruncate | 复制源日志文件后,不清空源文件。默认设置 | |
create | 重命名日志文件,创建与日志文件同名的文件,默认 mode=0644 uid=0 gid=0,与 copy 指令不能同时使用 | |
nocreate | 不创建与日志文件同名的文件。默认设置 | |
olddir | 设置归档文件保存目录 | |
noolddir | 归档文件与源文件在同一目录。默认设置 | |
createolddir | 如果 olddir 参数指定的目录不存在,则创建目录并指定属组,默认 mode = 0777 uid = 0 gid = 0 | |
nocreateolddir | 当 olddir 参数设定目录不存在时,不创建目录。默认设置 | |
prerotate | 归档执行之前执行脚本,日志文件名为传入的第一个参数 | |
postrotate | 归档执行之后执行脚本,日志文件名为传入的第一个参数 | |
firstaction | 脚本之前,仅当第一个日志文件被开始执行归档操作时才执行脚本,日志文件名为传入的第一个参数 | |
lastaction | 脚本之后,仅当最后一个日志文件执行归档操作结束时才执行脚本,日志文件名为传入的第一个参数 | |
preremove | 删除日志文件之前执行脚本,日志文件名为传入的第一个参数 | |
sharedscripts | 当匹配的日志文件为多个时,prerotate 和 postrotate 脚本会在每个日志文件执行归档操作时都执行一次,启用共享模式会让 prerotate 和 postrotate 脚本在全局只运行一次 | |
nosharedscripts | 当匹配的日志文件为多个时,prerotate 和 postrotate 脚本会在每个日志文件执行归档操作时都执行一次。默认设置 | |
su | 指定操作源文件执行归档操作的用户及属组 | |
归档文件清理 | 设置接收归档文件的邮件地址 | |
nomail | 不将归档文件发送到任何邮件地址 | |
mailfirst | 将刚生成的归档文件发送到设置的邮箱 | |
maillast | 将要超过 maxage 设置时间的归档文件发送到设置的邮箱 | |
maxage | 设置过期归档文件的天数 | |
rotate | 保留归档文件数,默认为 0 | |
shred | 彻底删除 | |
shredcycles | 彻底删除时,覆盖文件的次数,默认为 3 | |
noshred | 不彻底删除 |