次の動作または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_errors
がOff
であることがわかります。そして、example.com
にdisplay_errors
がOn
であることがわかります。
ただし、もう一度example.net
にアクセスするとandこのリクエストは同じワーカーによって処理され、display_errors
はOn
として取得されます。
すべてのFPMワーカーは同じプールで作業しています。
質問:example.net
を常にデフォルト設定で機能させる方法は?
考えられる解決策:
PHP_VALUE
configでも必要な設定でexample.net
を定義します。しかし、サーバーには多くのWebサイトがあり、どちらのソリューションもセットアップに多くの日常的な作業を必要とします。もっと簡単な方法があるのだろうかと思っていました。
更新:
私の例のdisplay_errors
設定は、問題を示すためだけに選択されました。 php.ini
設定でも同じ状況が発生します。コメントによると、単一のサーバー上に本番サイトと開発サイトを混在させることはお勧めできません。
これが発生する理由は、説明されているように、「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スクリプトを実行させるだけでよいからです。