Apacheが毎日勝手にReloadされる?certbotかと思ったら意外な真犯人が…!

目次

はじめに

自宅サーバで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)の内容を上書き・追加するための設定ファイルであり、このファイルがコメントアウトだからといって、サービスが動いていないことになりません。

このようなサービスを変更するためのファイルを、override.confと読んだりもします

対策

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。今日からは安心して任せるよ。

  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次