web-dev-qa-db-ja.com

PHP-FPMを使用してさまざまなサイトでPHP_VALUEを再利用するのをやめる

次の動作またはPHP-FPMに気づきました。

これらの2つのNginx構成を見てください:

server {
    listen         80;
    server_name    example.com;
    location / {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /srv/www/i.php;
        fastcgi_param PHP_VALUE "display_errors=1";
        include fastcgi_params;
    }
}
server { 
    listen         80;
    server_name    example.net;
    location / {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /srv/www/i.php;
        include fastcgi_params;
    }
}

および/srv/www/i.phpファイル:

<?php phpinfo();

ご覧のとおり、唯一の違いはfastcgi_param PHP_VALUE "display_errors=1";です。

ここで、すべてのFPMワーカーを強制終了し、最初にexample.netを開くと、期待どおりdisplay_errorsOffであることがわかります。そして、example.comdisplay_errorsOnであることがわかります。

ただし、もう一度example.netにアクセスするとandこのリクエストは同じワーカーによって処理され、display_errorsOnとして取得されます。

すべてのFPMワーカーは同じプールで作業しています。

質問:example.netを常にデフォルト設定で機能させる方法は?

考えられる解決策:

  • PHP_VALUEconfigでも必要な設定でexample.netを定義します。
  • 「正しい」ソリューションのようです。サイトごとに個別のワーカープールを作成します。

しかし、サーバーには多くのWebサイトがあり、どちらのソリューションもセットアップに多くの日常的な作業を必要とします。もっと簡単な方法があるのだろうかと思っていました。

更新:

私の例のdisplay_errors設定は、問題を示すためだけに選択されました。 php.ini設定でも同じ状況が発生します。コメントによると、単一のサーバー上に本番サイトと開発サイトを混在させることはお勧めできません。

3
Oleg

これが発生する理由は、説明されているように、「php_valueまたはphp_flagで渡されたPHP設定が以前の値を上書きする」可能性が最も高いです PHP-FPMドキュメント

PHP構成では_display_errors_が無効になっていると思います。次に.netページにアクセスすると、phpinfo()で無効になっていることが確認されます。

次に、.comページにアクセスすると、Nginxは同じプール内のPHP-FPMワーカーに_display_errors=1_を渡します。これにより、以前の_0_の値が新しい値_1_で上書きされます。 phpinfo()で確認できます。

これで、PHP-FPMプール設定が_display_errors=1_に設定されました。

.netページに再度アクセスすると、phpinfo()は実際に_display_errors=1_を確認します。これは、Nginxが_1_の値を同じプールに渡したときに上書きされたためです。ウェブサイト。

解決策は、コメントで示唆されているように、開発を別のサーバーに移動することです。または、サイト専用のPHP-FPMプールを作成します。これは、最小限の作業です。

ボーナス:

また、Nginx構成ではこれを行わないでください:_fastcgi_param PHP_VALUE "display_errors=1";_

これは、php構成ファイル、できればサイト自体のfpmプール構成に含める必要があります。

しかし、サーバーには多くのWebサイトがあり、どちらのソリューションもセットアップに多くの日常的な作業を必要とします。もっと簡単な方法があるのだろうかと思っていました。

プールごとのプレフィックスを使用して、すばやく修正できます。いずれにせよ、単一のワーカープールに複数のサイトを配置することは悪い考えです。なぜなら、同じワーカーを使用する他のすべてのサイトを何の努力もせずに侵害するために、サイトの1つに悪意のあるphpスクリプトを実行させるだけでよいからです。

7
Daniel