nginx 自带的日志分割
Nginx 本身并没有直接提供日志自动分割的功能,但可以通过系统自带的工具或者结合其他软件来实现这一需求。一个常见的解决方案是利用 Linux 系统的 logrotate
工具来进行 Nginx 日志的分割与管理。
使用 logrotate 进行日志分割
方案
Logrotate 是 Linux 系统中用于管理和轮转日志文件的工具,可以定期将日志文件归档、压缩,并删除过期的日志文件。对于 Nginx 来说,我们只需要配置好相应的规则即可让其日志文件得到良好的管理。
配置步骤
-
创建或编辑 logrotate 配置文件
在/etc/logrotate.d/
目录下创建名为nginx
的配置文件(如果不存在的话),或者直接编辑现有的配置文件。 -
编写配置内容
下面是一个简单的配置示例:
bash
/var/log/nginx/*.log {
daily # 每天轮转一次
rotate 30 # 保留最近 30 天的日志文件
compress # 压缩旧日志文件
delaycompress # 推迟一天再压缩上一天的日志文件
missingok # 如果日志文件丢失,则忽略错误并继续处理其他日志文件
notifempty # 如果日志文件为空,则不进行轮转
create 0640 www-data adm # 创建新日志文件时使用的权限和所有者
sharedscripts # 所有的 postrotate 脚本只会执行一次
postrotate # 在每次轮转后执行以下命令
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
注意:这里的
kill -USR1
命令是用来通知 Nginx 重新打开日志文件,确保新的日志能够写入到新生成的日志文件中。
通过 cron 和 shell 脚本手动实现
如果你不想使用 logrotate
,也可以通过编写简单的 Shell 脚本来实现类似功能。这种方式更加灵活,可以根据自己的需求定制。
示例脚本
bash</p>
<h1>!/bin/bash</h1>
<p>LOG<em>PATH="/var/log/nginx"
DATE=$(date +%Y-%m-%d)
NEW</em>LOG="${LOG<em>PATH}/access</em>${DATE}.log"</p>
<p>mv ${LOG<em>PATH}/access.log ${NEW</em>LOG}
kill -USR1 $(cat /var/run/nginx.pid)</p>
<p>gzip ${NEW_LOG}
然后你可以将这个脚本添加到 cron 中定时执行,例如每天凌晨两点执行:
bash
0 2 * * * /path/to/your/script.sh
第三方模块辅助
除了上述方法外,还可以考虑安装一些第三方模块如 ngx_http_log_rotate_module
,它可以在不重启 Nginx 的情况下完成日志轮转操作。不过需要注意的是,这类模块可能会增加系统的复杂度,并且需要确保所使用的 Nginx 版本支持该模块。
虽然 Nginx 并没有自带的日志分割功能,但是通过以上介绍的方法,我们可以轻松地实现对 Nginx 日志的有效管理。