これは大変です。私は Ubuntu 16.04 サーバー インスタンスで Apache 2.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
。 - として SSH 接続し
app
、 に切り替えてroot
、restart
サービスを として実行しroot
、 に戻ってapp
セッションを終了すると、Apache が強制終了されます。 - サービスとして SSH 接続し
root
、セッションを終了すると、Apache は正常になります。restart
- として SSH 接続し
root
、restart
サービスに切り替えてapp
、 に戻りroot
、セッションを終了すると、Apache は正常になります。 - サービスとして SSH 接続し
root
、セッションを終了し、再度 として SSH 接続し、再度セッションを終了すると、Apache が強制終了されます。restart
app
app
今週までは、一貫して として SSH を実行し、 に切り替えroot
、restart
としてサービスを実行しroot
、Apache を強制終了せずにセッションを終了することができました。/lib/systemd/system/apache2.service.d/apache2-systemd.conf
行RemainAfterExit=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.conf
yes
systemd-logind.service
www-data
Apache をシステム ユーザーとして実行したままにして ( Ubuntu など)、アクセス許可と ACL を使用して、www-data
読み取り/書き込みが必要なファイルへのアクセスを許可する方が適切です。