SSHセッションを終了すると、Apacheが突然終了します
さて、これはやっかいです。Ubuntu16.04サーバーインスタンスでApache2.4を実行しています。私は、本番インスタンスとテストインスタンスの両方にほぼ同一の環境を使用し、開発にVagrantを使用して管理するほぼ同一のVirtualBoxインスタンスを使用しています。長い間、Apacheを実行しているのと同じユーザーとして、これらのサーバーインスタンスのいずれかにSSHで接続し、アプリケーションコードの変更をデプロイしてから、実行exit
してSSHセッションを終了することができました。その後、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
です。 - I SSH場合は
app
、スイッチにroot
、restart
などのサービスroot
へのスイッチバックapp
し、セッションを終了し、それはApacheが殺します。 - サービスとしてSSHを使用して
root
からrestart
セッションを終了すると、Apacheで問題ありません。 - SSHとして
root
、restart
サービス、に切り替えapp
、に切り替えてからroot
セッションを終了すると、Apacheは問題ありません。 - サービスとしてSSHを使用し
root
、restart
セッションを終了し、としてSSHを再度実行してapp
から、セッションを再度終了すると、Apacheが強制終了されます。 - 今週以前は、Apacheを強制終了せずに
app
、一貫してSSHとして、に切り替え、サービスをとして、セッションを終了することができました。root
restart
root
/lib/systemd/system/apache2.service.d/apache2-systemd.conf
行RemainAfterExit=no
を変更して、に変更してみましたがRemainAfterExit=yes
、を実行しsystemctl daemon-reload
、最後にservice apache2 restart
効果がありませんでした。
行動の突然の変化についての説明はありますか?以前の動作を復元するための合理的な修正はありますか?そうでない場合は、アプリケーションコードに変更をデプロイapp
し、SSHセッションにログインせずにApache(ユーザー)がそれを読み取るためのアクセス許可を与えるためのベストプラクティスは何でしょうroot
か。としてログインする理由は、そもそもログインapp
の必要性を制限するためでしたroot
。
私はここで完全に途方に暮れていて、どのようにしてすべてが突然壊れるか理解していません。
回答
これの根本的な原因は、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-data
Ubuntuなど)として実行したままにし、www-data
アクセス許可とACLを使用して、読み取り/書き込みに必要なファイルへのアクセスを許可することをお勧めします。