Nginxのログローテーション

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

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

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

設定ファイルは/etc/newsyslog.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が作られるようになりました。

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

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

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

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

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

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