Search Posts

nginx access.log每日压缩定期删除

内容纲要

需求原因

正常rpm 或者yum apt安装的都会自动压缩,但是一些老旧服务器编译安装的NGINX可能没有

解决

要实现 nginx 的 access.log 自动每天按日期压缩,你可以结合使用 Linux 的 crontab 定时任务和 logrotate 工具。

以下是步骤:

  1. 配置 logrotate

    编辑 logrotate 的配置文件,通常位于 /etc/logrotate.conf/etc/logrotate.d/nginx。如果你使用的是默认的 logrotate 配置文件,你可以在 /etc/logrotate.d/nginx 中创建一个新的文件来配置 nginx 的日志轮转。

    在配置文件中,添加类似如下的配置:

    /usr/local/nginx/logs/*log {
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || :
    endscript
    }

    这段配置是用于 NGINX 日志轮转和管理的 logrotate 配置。让我逐行解释一下每个选项的含义:

1 /usr/local/nginx/logs/*log:这是一个通配符,用于匹配 NGINX 日志目录中所有以 .log 结尾的日志文件。

2 daily:这个选项指定了日志文件何时应该轮转。daily 表示每天轮转一次。也就是说,每天系统将检查一次这些日志文件是否需要轮转。

3 rotate 10:这个选项指定要保留的历史日志文件的数量。在这个配置中,rotate 10 表示保留最近的 10 个轮转后的日志文件。

4 missingok:如果日志文件不存在,不会报错。这个选项表示即使日志文件不存在,logrotate 也不会产生错误。

5 notifempty:如果日志文件为空,不会轮转。这个选项表示只有当日志文件非空时才进行轮转。

6 compress:轮转后的日志文件进行压缩。当这个选项启用时,logrotate 会使用 gzip 压缩轮转后的日志文件。

7 sharedscripts:所有的 postrotate 脚本都在一次轮转之后执行一次。这个选项指定了在执行 postrotate 脚本时是否将所有的日志文件一起处理。

8 postrotate ... endscript:这是在轮转后执行的脚本。在这个配置中,postrotate ... endscript 块中的命令会在轮转后执行。/bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null || : 这个命令会发送 USR1 信号给 nginx 的主进程,以通知它重新打开日志文件。这是因为在 nginx 中,使用 logrotate 轮转日志文件后,nginx 不会自动刷新日志文件句柄,需要发送 USR1 信号给 nginx 主进程来触发刷新。

这样的配置可以确保 NGINX 日志文件在轮转时被正确处理,旧的日志文件被压缩和备份,同时 NGINX 的主进程会重新打开新的日志文件以继续记录日志。

  1. 测试 logrotate

    在配置完 logrotate 后,你可以手动运行 logrotate 来测试配置是否正常。你可以执行以下命令来手动触发 logrotate:

    sudo logrotate -vf /etc/logrotate.d/nginx

    如果没有出现错误,并且日志文件被轮转并压缩了,说明配置是有效的。

  2. 设置定时任务

    最后,你需要设置一个定时任务,每天自动执行 logrotate。你可以使用 Linux 的 crontab 来实现这个定时任务。编辑 crontab 文件,添加如下一行:

    0 0 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx

    这个配置会在每天午夜 12:00 执行 logrotate,轮转 nginx 的日志文件。

通过这些步骤,你就可以实现 nginx access.log 每天自动按日期压缩了。确保你的系统中安装了 logrotate,并且配置正确。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注