logrotateのタイミングで、処理中のリクエストが切断されて困る場合の対処

スポンサーリンク

Linux上でhttpd(Apache)をRPMで入れた場合、logrotate設定(/etc/logrotate.d/httpd)におけるhttpdの再起動は、たいてい下記のようになってます。

kill -HUP `cat /var/run/httpd.pid`

これだと、logrotateタイミングで接続中のリクエストがあっても、見事に切断されてしまいます。
(通常のWEBサイトならそれほど問題とならないのかもしれません)

ちょっと困るので、apachectlのgracefulを使うように変更します。(apachectlのパスは適宜変えてください)

/usr/sbin/apachectl graceful

こうすることにより、処理中のリクエストが終了後、再起動されるようになります。

gracefulの場合、旧ログに書き終わる(処理中のリクエストが終わる)タイミングがわからないので、アーカイブにする場合は注意が必要です。
アーカイブにするタイミングが早いと、処理中だったリクエストのログがどこにも書かれないといった現象になります。
したがってアーカイブにしたい場合、適宜sleepなどでタイミングを取る必要があります。