web-dev-qa-db-ja.com

Apache2.4イベントMPM + php-fpm + php-opcacheで「接続がピアによってリセットされました」エラーが発生する

イベントMPMとphp-fpmバージョン5.6.10(REMIリポジトリから)を備えたApache2.4.6を実行しているCentOS7サーバーがあります。これは、vhost内のphp-fpmにリクエストを送信するための関連するApache構成です(このサーバー上の唯一のサイトです)。

<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>

関連するphp-fpmプール設定は次のとおりです。

listen = /var/run/php-fpm/www.sock
listen.owner = Apache
listen.group = Apache
pm = static
pm.max_children = 50
pm.max_requests = 0

Php-opcache構成(デフォルトのインストール構成)は次のとおりです。

zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.blacklist_filename=/etc/php.d/opcache*.blacklist

私の問題:php-opcacheをインストールして有効にすると、エラーログに次のエラーが表示され始めます。

[Thu Jun 18 08:10:58.499871 2015] [mpm_event:debug] [pid 16546:tid 139798115227392] event.c(986): (104)Connection reset by peer: [client 157.55.39.233:15962] AH00470: network write failure in core output filter
[Thu Jun 18 08:10:58.527424 2015] [mpm_event:debug] [pid 16546:tid 139797922195200] event.c(986): (103)Software caused connection abort: [client 157.55.39.233:15990] AH00470: network write failure in core output filter

Php-opcacheを削除すると、エラーは停止します。これが発生するたびに、ユーザーはフロントエンドで502 ServiceUnavailableエラーを報告しています。

私は文字通り少なくとも6時間Googleを試し、解決策を見つけようとしました。 opcacheのfastshutdownオプションが問題であると誰かが言ったが、それはデフォルトの設定では無効になっている。 php-fpmプロセス管理メソッドをリサイクルなしの静的(max_requests = 0)に変更しましたが、それでも何も変更されませんでした。また、(ソケットの代わりに)ApacheでTCPプロキシメソッドを使用してみましたが、それも影響はありませんでした。

これが関連するかどうかはわかりませんが、php-opcacheがインストールされているかどうかに関係なく、エラーログに次のエラーが報告されます(ただし、頻度ははるかに低く、すべてのトラフィックの0.5%未満である可能性があります。別の問題になります):

[Thu Jun 18 08:32:37.223430 2015] [proxy_fcgi:error] [pid 19187:tid 140598765840128] [client 37.46.115.238:55624] AH01068: Got bogus version 10, referer: ...
[Thu Jun 18 08:32:37.223462 2015] [proxy_fcgi:error] [pid 19187:tid 140598765840128] (22)Invalid argument: [client 37.46.115.238:55624] AH01075: Error dispatching request to :, referer: ...

この問題は これ と非常によく似ていますが、その人はProxyPassMatchをTCPメソッドで使用していますが、私はそうではありません(.htaccessをバイパスしているため)。

まだ触れていないアイデアはありますか?

1
ldennison

私たちの環境で同様の問題を見たとき、それはOpCache(デフォルト)が共有ホスティング環境のすべてのユーザー間で単一のキャッシュを共有する方法が原因であるように見えます。 バグが送信されました (そして、これがあなたのユースケースにとってどれほど重要であるかをメンテナに知らせるために投票することができますし、そうすべきです)が、修正を提供することについてのコミットメントはありません。

TL; DR:デフォルトでOpCacheが有効になっている場合、コンパイルされたバイトコードを格納するために使用されるキャッシュはすべてのユーザー間で共有されます。ホスティングが複数のサイト/ユーザー間で共有されている環境では、 これにより、サイトが別のサイトからphpスクリプトのキャッシュされた出力を取得するか、特定のセキュリティ設定が有効になっている場合はエラーが発生する可能性があります

PHP 5.5+が組み込まれたopcacheでPHP-FPMを使用する予定の場合は、実際に使用する前に、以下のブログ投稿をお読みください。オペコードキャッシュは、サーバー上のすべてのユーザーが読み取ることができることがわかりました。つまり、たとえば、独自のvhostとディレクトリを持つ10人の個別のユーザーがいて、ユーザーごとに1つのPHP-FPMプールを構成した場合でも、各ユーザーはキャッシュされているスクリプトとその場所を確認できます。キャッシュへの読み取りアクセス権があるため、このすべてのデータを表示できる可能性があります。

これは明らかにセキュリティ上の大きな懸念事項であり、誰もこれを悪用しなくても、ページを生成するときに間違ったユーザーがスクリプトを読み取る可能性があるため、複数のインデックスがある場合、Webサイトが間違ったデータ/情報を表示する可能性がありますキャッシュ内の.phpスクリプト。

正式にリリースされた修正はありませんが、cPanelを使用している場合、 このウィキには、ユーザーごとに作成および保護されるphp-fpmプールを構成する文書化された方法があります 以下の手順と、この回答の下部にある重要な注意事項は、次のことができるはずです。エラーなしであなたが望む機能を手に入れよう

その投稿には、サイトごと/ユーザーごとに手動でこれを構成する方法も記載されています(ただし、多くのサイトをホストしている場合は面倒になる可能性があります)。 cPanelを使用していない場合は、スクリプトを変更して、cPanelの構成エンジンで使用されている変数ではなく、個々のパスとユーザー名を指定する必要がある場合があります。


重要な注意事項

テストと追加の調査中に私は遭遇しました いくつかの説明を提供するこの記事 あなたの特定の状況に関連するかもしれません:

  1. アプリケーションのOpCacheの構成では、opcache.use_cwdパラメーターがtrueに設定されていることを確認する必要があります。デフォルトではfalseに設定されており、デフォルトに設定したままにすると、衝突が発生する可能性があります。システムで複数のPHPアプリケーションをホストしている場合:

まず、おそらく各典型的なプロジェクトで、opcache.use_cwdオプションがtrueに設定されていることを確認する必要があります。この設定を有効にすると、OpCacheエンジンは完全なファイルパスを調べて、同じ名前のファイルを区別します。 falseに設定すると、同じベース名のファイル間で衝突が発生します。

  1. Zend Frameworkまたはアノテーションを使用する別の同様のフレームワークを搭載したアプリケーションを実行している場合は、opcache.load_commentsおよびopcache.save_commentsディレクティブがtrueに設定されていることも確認する必要があります。ほとんどのシステムでOpCacheを適切に使用できるようにするための具体的な手順でドキュメントが更新されているため、アプリケーション/フレームワークのドキュメントでこの提案を再確認する必要があります。

注釈を利用するツールやフレームワークで重要な設定もあります。 Doctrine、Zend Framework 2、またはPHP Unitを使用する場合は、opcache.load_commentsおよびopcache.save_commentsの設定をtrueに設定することを忘れないでください。その結果、ファイルからのドキュメントのコメントは、OpCacheによって生成されたプリコンパイル済みコードにも含まれます。この設定により、中断することなく注釈を操作できます。

プロジェクトが特定のフレームワークまたはWebアプリケーションに基づいている場合は、OpCache構成に関するガイドラインについてドキュメントを確認することをお勧めします。

重要な注意事項


これがお役に立てば幸いです。cPanelを使用している場合は、コメントをドロップして、構成のその部分にどのように取り組んだかをお知らせください。 この質問と関連するコメントも参照してください