SSHセッションを終了すると突然Apacheが強制終了する

SSHセッションを終了すると突然Apacheが強制終了する

これは大変です。私は Ubuntu 16.04 サーバー インスタンスで Apache 2.4 を実行しています。私は、本番環境とテスト環境の両方でほぼ同一の環境を使用しています。また、開発用に Vagrant を使用して管理しているほぼ同一の VirtualBox インスタンスも使用しています。長い間、私は Apache が実行されるのと同じユーザーとしてこれらのサーバー インスタンスに SSH で接続し、アプリケーション コードの変更をいくつかデプロイしてから、 を実行してexitSSH セッションを終了することができ、その後 Apache は問題なく実行されていました。しかし、今では、 を実行するexitと Apache サービスが致命的なエラーに遭遇します。

[mpm_prefork:emerg] [pid 23466] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[core:alert] [pid 17750] AH00050: Child 23466 returned a Fatal error... Apache is exiting!

ノート:

  • Apache ユーザーは ですapp
  • として SSH 接続しapp、 に切り替えてrootrestartサービスを として実行しroot、 に戻ってappセッションを終了すると、Apache が強制終了されます。
  • サービスとして SSH 接続しroot、セッションを終了すると、Apache は正常になります。restart
  • として SSH 接続しrootrestartサービスに切り替えてapp、 に戻りroot、セッションを終了すると、Apache は正常になります。
  • サービスとして SSH 接続しroot、セッションを終了し、再度 として SSH 接続し、再度セッションを終了すると、Apache が強制終了されます。restartapp
  • app今週までは、一貫して として SSH を実行し、 に切り替えrootrestartとしてサービスを実行しroot、Apache を強制終了せずにセッションを終了することができました。
  • /lib/systemd/system/apache2.service.d/apache2-systemd.confRemainAfterExit=noを に変更しRemainAfterExit=yes、 を実行しsystemctl daemon-reload、最後に を実行してみましたがservice apache2 restart、効果はありませんでした。

突然の動作の変化について何か説明はありますか? 以前の動作を復元するための妥当な修正方法はありますか? そうでない場合、アプリケーション コードへの変更を展開し、 として SSHappセッションにログインしなくても Apache (ユーザー) がそれを読み取る権限を与えるためrootのベスト プラクティスは何でしょうか? としてログインする理由は、そもそもappとしてログインする必要性を制限するためでした。root

私は完全に途方に暮れており、どうしてすべてが突然壊れてしまうのか理解できません。

答え1

この根本的な原因は、systemd (219 から) がログインしたユーザーによって作成された IPC オブジェクトを処理する方法が変更されたことです。デフォルトでは、ユーザーがログアウトした後に残っている IPC オブジェクトはすべて削除されます。これは、すべての非システム ユーザー (uid >= 1000) に適用されます。システム ユーザー (uid < 1000) は影響を受けません。

Apache を非システム ユーザーで実行するように変更したため、そのユーザー アカウントからログアウトするたびに、systemd は Apache の IPC オブジェクトをすべて削除し、Apache はミューテックスを失ったことを報告して終了します。

この動作は、 (Ubuntu でのデフォルトは)を設定RemoveIPC=noし、 を再起動することで変更できます。/etc/systemd/logind.confyessystemd-logind.service

www-dataApache をシステム ユーザーとして実行したままにして ( Ubuntu など)、アクセス許可と ACL を使用して、www-data読み取り/書き込みが必要なファイルへのアクセスを許可する方が適切です。

関連情報