SSHセッションを終了すると、Apacheが突然終了します

Aug 18 2020

さて、これはやっかいです。Ubuntu16.04サーバーインスタンスでApache2.4を実行しています。私は、本番インスタンスとテストインスタンスの両方にほぼ同一の環境を使用し、開発にVagrantを使用して管理するほぼ同一のVirtualBoxインスタンスを使用しています。長い間、Apacheを実行しているのと同じユーザーとして、これらのサーバーインスタンスのいずれかにSSHで接続し、アプリケーションコードの変更をデプロイしてから、実行exitしてSSHセッションを終了することができました。その後、Apacheは正常に実行されます。 。ただし、exitApacheサービスで致命的なエラーが発生しないと実行できません。

[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です。
  • I SSH場合はapp、スイッチにrootrestartなどのサービスrootへのスイッチバックappし、セッションを終了し、それはApacheが殺します。
  • サービスとしてSSHを使用してrootからrestartセッションを終了すると、Apacheで問題ありません。
  • SSHとしてrootrestartサービス、に切り替えapp、に切り替えてからrootセッションを終了すると、Apacheは問題ありません。
  • サービスとしてSSHを使用しrootrestartセッションを終了し、としてSSHを再度実行してappから、セッションを再度終了すると、Apacheが強制終了されます。
  • 今週以前は、Apacheを強制終了せずにapp、一貫してSSHとして、に切り替え、サービスをとして、セッションを終了することができました。rootrestartroot
  • /lib/systemd/system/apache2.service.d/apache2-systemd.confRemainAfterExit=noを変更して、に変更してみましたがRemainAfterExit=yes、を実行しsystemctl daemon-reload、最後にservice apache2 restart効果がありませんでした。

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

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

回答

25 MichaelHampton Aug 18 2020 at 09:43

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

システム以外のユーザーで実行するようにApacheを変更したため、そのユーザーアカウントからログアウトするたびに、systemdはApacheのすべてのIPCオブジェクトを無効にし、Apacheはミューテックスの喪失について文句を言って終了します。

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

Apacheをシステムユーザー(www-dataUbuntuなど)として実行したままにし、www-dataアクセス許可とACLを使用して、読み取り/書き込みに必要なファイルへのアクセスを許可することをお勧めします。