【CentOS Stream 9】logrotateの設定【Nginx】

日々蓄積されていく各種のログファイル
そのまま放置しておくとストレージ容量を圧迫しますし、肥大化したログファイルはトラブルシューティングの際に開くのにも時間がかかるようになります。

この問題を解決するのが「logrotate」です。
一定のタイミングで既存のログを保存もしくは圧縮して新たなログファイルを生成してくれます。

CentOS Stream 9(以下、Stream 9)の環境で、Nginxのログファイルをlogrotateで整理しようとしたのですがうまく動きませんでした。
CentOS Stream 8(以下、Stream 8)とは設定方法が若干違っていたのが理由なのですが、そのあたりのことを記事にしたいと思います。

目次

起動制御

logrotateは定期的に実行されます。
Stream 8ではanacronによって1日1回起動するようになっていますが、Stream 9ではanacronではなくsystemdのタイマーが使われているようです。

以下のコマンドにて現状のタイマー設定状況が確認できます。

systemctl list-timers

UNITがlogrotate.timerになっているものがない場合はおそらくlogrotateは動いていないと思われます。

設定ファイルの確認

当方の環境においては設定ファイルが既に存在していました。
/usr/lib/systemd/systemディレクトリの中にあったのでおそらく自動的にインストールされたものだと思います。
(ユーザーが作成したものは/etc/systemd/systemディレクトリに置くのが通例)

もし存在しない場合は以下の内容でファイルを作成します。

logrotate.service

[Unit]
Description=Rotate log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
RequiresMountsFor=/var/log
ConditionACPower=true

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf

# performance options
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7

# hardening options
# details: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
# no ProtectHome for userdir logs
# no PrivateNetwork for mail deliviery
# no NoNewPrivileges for third party rotate scripts
# no RestrictSUIDSGID for creating setgid directories
LockPersonality=true
MemoryDenyWriteExecute=true
PrivateDevices=true
PrivateTmp=true
ProtectClock=true
ProtectControlGroups=true
ProtectHostname=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectSystem=full
RestrictNamespaces=true
RestrictRealtime=true

logrotate.timer

[Unit]
Description=Daily rotation of log files
Documentation=man:logrotate(8) man:logrotate.conf(5)

[Timer]
OnCalendar=daily
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target

ファイルの作成後は以下のコマンドを実行して設定を反映させます。

sudo systemctl daemon-reload

Nginx用logrotate設定ファイルの作成

Nginx用のlogrotate設定ファイルを作成します。
/etc/logrotate.dディレクトリの下にnginxとして作成します。

nginx

/var/log/nginx/*.log {
    daily
    rotate 52
    missingok
    notifempty
    compress
    delaycompress
    create 644 nginx root
    sharedscripts
    postrotate
        if [ -f /run/nginx.pid ]; then
            kill -USR1 `cat /run/nginx.pid`
        fi
    endscript
}

各パラメータの意味については割愛しますが、これで52世代までログファイルが保存されます。
また、古いファイルについてはgzipで圧縮されます。

タイマー起動

設定ファイル類が揃ったら以下のコマンドでタイマーを起動します。

sudo systemctl start logrotate.timer

また当該タイマーをシステム起動時にスタートさせたい場合は以下のコマンドで有効化します。

sudo systemctl enable logrotate.timer

logrotateの動作確認

これで時間がくればローテーションされるはずですが、以下のコマンドで動作確認ができます。

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

-dオプションはいわゆるDry-Runなので実際にはローテーションされません。
強制的にローテーションさせたい場合は-dオプションを-fオプションに変更します。

注意点

Nginxのログが出力されるディレクトリのパーミッションによってはローテーション後に新しいログファイルに出力されず、既存のログファイルに出力され続ける現象が起こります。
ログディレクトリのパーミッションは755にする必要があるようです。


まとめ

以上でsystemdのタイマーを使ったlogrotateの設定方法の説明を終了します。
私は試していませんが、Stream 8と同じようなanacronを使った設定も可能だと思います。
やりやすい方で設定していただければと思います。

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次