はじめに
自宅サーバでApacheを使っていて、ふとApacheのステータスを確認したら、 なぜか毎日勝手にApacheがReloadされていることに気づきました。
systemctl status apache2.service
このコマンドで確認すると、以下のように出力がありました。
May 04 00:00:01 Reloading The Apache HTTP Server…
May 04 00:00:02 AH00558: apache2: Could not reliably determine the server’s fully qualified domain name…
May 04 00:00:02 Reloaded The Apache HTTP Server.
May 05 00:00:01 Reloading The Apache HTTP Server…
May 05 00:00:02 AH00558: apache2: Could not reliably determine the server’s fully qualified domain name…
May 05 00:00:02 Reloaded The Apache HTTP Server.
このログからは毎日0時頃にReloadedしていることが分かります。明らかに何かが自動で動いているということです。
Apacheで定期的に何かスケジュールさせているとすれば、毎月1日のcertbotくらいしか思い浮かばない・・・
何が起きているのか・・・
原因を探ってみる
とりあえずで疑ってみたのは、systemdタイマーでした。
systemctl list-timers | grep certbot
すると、
Wed 2025-05-07 01:10:03 JST 1h 25min left
Tue 2025-05-06 18:51:43 JST 4h 53min ago certbot.timer certbot.service
このように返ってきました。
これはつまり、certbot.timer(systemdの自動更新タイマー)が動いていた! これが毎日 certbot renew
を実行し、Apacheをreloadしていたというわけです。
certbotは、証明書が更新されたときに自動でApacheやNginxなどのWebサーバを検出し、 必要に応じて自動でreloadする仕組みを持っています。
実際にサービスファイルを確認
timerの正体は certbot.timer
でしたが、じゃあその timer が 実行している certbot.service
の中身はどうなっているのか?
実際に確認してみました。
sudo systemctl cat certbot.service
すると、次のように、コメントアウトされていました。

あれ?コメントアウトされている、どうしてサービスが動くのか。。
そうでした。サービスはこのファイルを見て動いているわけではなく、既に登録されているサービス(.service)を動かしてるのです。このファイルは、その既に登録されたサービス(.service)の内容を上書き・追加するための設定ファイルであり、このファイルがコメントアウトだからといって、サービスが動いていないことになりません。
対策
certbot.service
が定期的にrenew
していることが分かっており、override.confはコメント化されていることが分かりました。対策として考えられるのは、以下の2つです。
- 動いているサービスを止める
- certbot.serviceファイルを変更し、既に動作しているサービスの内容を更新する
動いているサービスを止めるのは簡単なので、こちらで対策してみます。
これにより、certbotに対するスケジューリングは、cron
だけになるはずです。
動いているサービス(certbot.timer)を止める
以下のコマンドでsystemdのタイマーを停止し、cronの設定だけが有効になります。
sudo systemctl disable --now certbot.timer
サービスが動いていないことを以下のコマンドで確認します。
systemctl list-timers | grep certbot
certbot.timer
が表示されなければ、無事に停止できています。
certbot.timer
を無効にしても、Apacheのreloadは止まらず
cerbot.timerではなく、別の原因があるようです。さらに深堀りしてみました。
cronを確認してみます。
cat /etc/crontab

次に、cron.daily
の詳細を見てみます。
ls -l /etc/cron.daily/

なるほど、/etc/cron.daily/
に存在するapache2
スクリプトを調べてみます。
原因はlogrotateだった
cat /etc/logrotate.d/apache2

分かりました。この設定で、Apacheのログは毎日ローテートされており、その後自動的にreloadされることが分かりました。
なぜ reload が必要なのか?
Apacheは、ログファイルをオープンしたまま書き込みを続ける設計のため、
logrotateでファイルを切り替えても、reloadしないと新しいログに書き込まれません。
そのため reload
は不可欠な処理であり、これは意図された・正しい動作です。
まとめ:Apacheの毎日reloadはlogrotateによるものだった
Apacheのステータスから、Reloadedを毎日していることから、何かの不具合なのではないかと疑いましたが、logrotate
による正常動作だったようです。今までも同じようにメッセージが出ていて、気付いてなかっただけのようです。
- certbot.timer を無効化しても reload は止まらなかった
/etc/logrotate.d/apache2
により、毎日ログを切り替える処理が存在していた- その中で
invoke-rc.d apache2 reload
が実行され、これが原因だった - つまり、Apacheが毎日reloadするのは、logrotateによる正常な挙動だった
というわけで、Apacheが毎日勝手にreloadされるのは「バグ」ではなく「仕様」でした。
疑ってごめんよ、logrotate。今日からは安心して任せるよ。
コメント