Nginxのログローテーション

Nginxのインストール手順をまとめましたが、このままだとどんどんログが溜まって肥大化してしまうのでログローテーションの設定をしましょう。

ログを1日ごとに分割する

FreeBSDではnewsyslogを使って毎晩0時にログローテートします。newsyslogは様々なログの再編と保存をするプログラムで、cronで毎日実行されています。

設定ファイルは/etc/newsyslog.confですが、追加設定は/etc/newsyslog.conf.d/*や/usr/local/etc/newsyslog.conf.d/*にあるものを読み込みます。

/etc/newsyslog.conf.d/nginx.confを作ってNginx用の設定をしましょう。

# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num] [/pid_file] [sig_num]
/var/log/nginx/access.log		644  180   *	@T00  ZC
/var/log/nginx/error.log		644  180   *	@T00  ZC    /var/run/nginx.pid  30

これで前日までのログが圧縮されて日々新しいaccess.logとerror.logが作られるようになりました。

ログファイルを開きなおす必要がある

ところでnginx.confの設定行の最後にある“/var/run/nginx.pid 30″ですが、これがNginxのログローテーションの肝になる指定です。

当初はこれを指定していなかったため、新しくログファイルは作られるもののログ自体は朝8時頃を回ると何かの拍子に記録が始まるという。。。

Nginxの公式サイトにログローテートのやり方によると、今まで書き込んでいたファイル名がリネームされて新しくログファイルが作られてしまうためNginxが新しいログファイルを見つけられないというのが原因らしい。

公式サイトではこれを回避するためにkillコマンドを使ってログファイルを開きなおしていますが、newsyslogではプロセスIDファイルとシグナル番号をオプション指定することでログファイルを開きなおします。

kill -USR1で発行されるシグナル番号は30なので、上記のようにNginxのプロセスID(/var/run/nginx.pid)にシグナル30を指定することになります。

CentOSではlogrotateコマンドを使う

さて、CentOSではもっと簡単にログローテーションができます。その方法とはlogrotateコマンドをインストールするだけ。

yum install logrotate

Nginxのログローテーション設定は、Nginxをインストールした際に自動的におこなわれています。設定ファイルは/etc/logrotate.d/nginx。その中身は次のとおりです。

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

この内容は/etc/cron.d/dailyjobsの指示に従って実行されます。とはいえそこには指定の時刻に/etc/cron.dailyを実行せよと書いてあるだけ。/etc/cron.dailyの中を覗くと、その他毎日実行すべきコマンドと一緒にlogrotateコマンドが入っています。

というわけでCentOSの場合は全てお任せでOKです。

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments