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です。