カテゴリー
OS 社内SE

FreeBSD 13 Apacheの再起動が失敗する

apachectl restartはOKだが、apachectl reloadやapachectl gracefulなどは停止したまま起動しなくなる。mod_phpでopcacheを使用している場合に発生するバグらしい。

翌日気が付くとApacheが”なぜか”停止している。調べてもわからず、落ちたら起動するプログラムを組んで、落ちた時間を調べてみると”newsyslog”でログがローテートされたタイミングでおち、”letsencrypt”のcertbotのチェックのタイミングで落ちていた。

“newsyslog”では、httpd.pidにシグナル(30 SIGUSR1)を送る形で再起動しており、apachectlも内部的には同じようにシグナルを送って操作しているらしいので、いろいろググっていると以下のバグレポートを発見。

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=268318

仕方ないので、”newsyslog”の設定のお尻からシグナルを送る部分である”/var/run/httpd.pid 30″を削除し、syslogを実行した後の時間あたりでcronを使って以下のコマンドをたたくように変更した。

/usr/local/etc/rc.d/apache24 gracefulstop && /usr/local/etc/rc.d/apache24 start

ログのローテートまでシェルで書けば良いのだが、virtual hostの設定毎にログを分けているため、テストするのも面倒&そのうちバグフィックスされるまでのつなぎと思い、上の仮対応で良しとした。

certbotもpost-hookのとこを上記に変更した。

FreeBSDのApacheはWEBサイト表示では最速だと思っているが、サポート期間が短く、ギリギリまで放置すると3ヵ月毎にOSのアップグレードが発生する。数回再起動しなければならないうえ、こういうバグ対応まで考えると保守性は低い。ubuntuみたいに無償5年、有償10年みたいにすれば良いのに。