REQUEST_URIに基づいてさまざまなPHP-FPMプールを設定しますか?

REQUEST_URIに基づいてさまざまなPHP-FPMプールを設定しますか?

/index.php経由ですべてのリクエストを処理するサイトがあります。ほとんどのリクエストをPHP-FPMバックエンドのHAproxyバランスプールに送信したいのですが、特定のURIを単一の専用プールに個別に送信したいと思います。 URI /adminは/index.php/adminなどに送信されます。

/apiと/adminは別々のプールにのみ送信し、他のすべてはバランスの取れたプールに送信しようとします。

以下を試しましたが、REQUEST_URI行は実際の既存のファイルを提供している場合にのみ一致します(たとえば、ファイルシステムの物理ファイルであり、そのURIを要求した場合は/ test.phpと一致する可能性があります)。 index.phpに送信される場所と一致する可能性があります - .htaccessの代わりに仮想ホストに設定された=~正規表現と==文字列一致を試しました。 Else部分は常にIfの代わりに実行されます。

<FilesMatch "\.php$">
  <If "%{REQUEST_URI} == '/admin'">
    SetHandler "proxy:fcgi://localhost:9000/"
  </If>
  <Else>
    SetHandler "proxy:fcgi://localhost:8000/"
  </Else>
</FilesMatch>

PHPに渡されたREQUEST_URIは正しいように見えますが(たとえば、要求されたパスが/ adminの場合は/index.php/adminが呼び出され、PHP _SERVER配列のREQUEST_URIが/ adminであることがわかります)、そうではありません。 FilesMatchのこのポイントですか?

最初はLocation内でSetHandlerを試してみましたが、うまくいかないか、少なくともFilesMatchがそれをオーバーライドします。また、場所内でファイル(一致)を使用することはできません...

編集する:

ProxyPassがLocation(Match)内で動作することがわかったので、次のようにSetHandlerの代わりにProxyPassを使用できました。

<FilesMatch "\.php$">
  SetHandler "proxy:fcgi://localhost:8000/"
</FilesMatch>
<LocationMatch "/admin">
  ProxyPass fcgi://localhost:9000/var/www/index.php/
</LocationMatch>

しかし、もともと試みたのはなぜうまくいかなかったのだろうか。 REQUEST_URI は現在実際には存在しないか、他のものを含んでいます。それとも…?

ベストアンサー1

おすすめ記事