web-dev-qa-db-ja.com

2つの別々のPHP-FPMサイトが同じコードを使用しているようですか?

2つのコードベースを持つ2つのWebサイトがありますが、1つのコードベースを変更すると、両方に変更が見られます。

同じウェブサイトに2つのチェックアウトがあります。これらは、FastCGIを備えたApache2を介してPHP-FPMを使用するように設定されています。チェックアウトは次の場所にあります。

/var/www/site1
/var/www/site2

Apacheの設定は次のようになります。

<VirtualHost *:80>
    ServerName site1.myserver.com
    DocumentRoot /var/www/site1
    <IfModule mod_fastcgi.c>
        AddHandler php5-fcgi-handler .php
        Action php5-fcgi-handler /php5-fcgi-uri
        Alias /php5-fcgi-uri fcgi-application
        FastCgiExternalServer fcgi-application -socket /var/run/site1-fpm.sock -pass-header Authorization -idle-timeout 30000 -flush
    </IfModule>
</VirtualHost>

<VirtualHost *:80>
    ServerName site2.myserver.com
    DocumentRoot /var/www/site2
    <IfModule mod_fastcgi.c>
        AddHandler php5-fcgi-handler .php
        Action php5-fcgi-handler /php5-fcgi-uri
        Alias /php5-fcgi-uri fcgi-application
        FastCgiExternalServer fcgi-application -socket /var/run/site2-fpm.sock -pass-header Authorization -idle-timeout 30000 -flush
    </IfModule>
</VirtualHost>

FPMプール構成は次のようになります。

[site1]
user = site1-user
group = site1-group
listen = /var/run/site1-fpm.sock
listen.owner = www-data
listen.group = www-data
chdir = /
pm = ondemand
pm.max_children = 5
pm.max_requests = 500 ;default to unlimited

[site2]
user = site2-user
group = site2-group
listen = /var/run/site2-fpm.sock
listen.owner = www-data
listen.group = www-data
chdir = /
pm = ondemand
pm.max_children = 5
pm.max_requests = 500 ;default to unlimited

私はFPMのchroot機能を使用していません(私が知る限り)。

Site1のコードを変更してPHP-FPMを再起動し、site1とsite2にアクセスすると、両方のサイトで変更が表示されます。

PHP-FPMを再起動し、最初にsite2(変更されていないサイト)、次にsite1にアクセスすると、どちらのサイトにも変更が表示されません。

私の設定の何が問題になっていますか?メインのFPMマスターの下で、site1とsite2に対して個別のPHP-FPMプロセスが実行されています。

4
Sander Marechal

私たちの環境で同様の問題を見たとき、それは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を使用している場合は、コメントを投稿して、構成のその部分への取り組み方をお知らせください。