web-dev-qa-db-ja.com

Apache変数をSetHandlerディレクティブに渡す

私は動的に決定されたUnixソケット異なる分離されたPHP "apps"(異なるソケットは異なるApache(2.4.18)サーバー上のPHP-FPMプール)mod_proxy_fcgi):

<DirectoryMatch "/home/apps/app_(?<appname>[a-zA-Z]+)">

    <FilesMatch \.php$>
        SetHandler "proxy:unix://var/run/app_%{env:MATCH_APPNAME}.sock|fcgi://localhost:42001"
    </FilesMatch>

</DirectoryMatch>

残念ながらApacheは変数を認識/評価していないようですSetHandlerディレクティブと一緒に使用すると、<DirectoryMatch>ディレクティブの正規表現の一致によって定義されます。

error.logはこれを言います:

[proxy:error] (2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/app_%{MATCH_APPNAME}e.sock (*) failed

変数をSetHandlerディレクティブに渡すにはどうすればよいですか? "を使用すると、PHP-FPMが正しく機能します。 UDSへの「リジッド」パス(例:"proxy:unix://var/run/app_someappname.sock|fcgi://localhost:42001"ですが、変数を使用すると問題が発生するようです。


また、いくつかの変数を結合してパスを作成してみました。

<FilesMatch \.php$>
    Define one "proxy:unix://var/run/app_"
    Define two ".sock|fcgi://localhost:42001"
    Define final ${one}%{MATCH_APPNAME}e${two}
    Header set HANDLER_PATH ${final}
</FilesMatch>

この場合、PHPソースはではなくPHPによって処理されますが、URL http://127.0.0.1/apps/someappname/index.phpのHTTP応答ヘッダー(正しく) )に含まれるもの:HANDLER_PATH: proxy:unix://var/run/app_someappname.sock|fcgi://localhost:42001

しかし、${final}変数をSetHandlerに渡すと、サーバーは503 Service Unavailableを返し、error.logは次のように言います。

*: using default reverse proxy worker for unix://var/run/app_%{MATCH_APPNAME}e.sock|fcgi://localhost:42001/home/apps/app_someappname/www/index.php (no keepalive)
*: rewrite of url due to UDS(/run/app_%{MATCH_APPNAME}e.sock): fcgi://localhost:42001/home/apps/app_someappname/www/index.php (proxy:fcgi://localhost:42001/home/apps/app_someappname/www/index.php)
AH01143: Running scheme unix handler (attempt 0)
AH01076: url: fcgi://localhost:42001/home/apps/app_someappname/www/index.php proxyname: (null) proxyport: 0
AH01078: serving URL fcgi://localhost:42001/home/apps/app_someappname/www/index.php
AH00942: FCGI: has acquired connection for (*)
AH00944: connecting fcgi://localhost:42001/home/apps/app_someappname/www/index.php to localhost:42001
AH02545: fcgi: has determined UDS as /run/app_%{MATCH_APPNAME}e.sock
AH00947: connected /home/apps/app_someappname/www/index.php to httpd-UDS:0
(2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/app_%{MATCH_APPNAME}e.sock (*) failed
AH01079: failed to make connection to backend: httpd-UDS
proxy_util.c(2175): AH00943: FCGI: has released connection for (*)

私が驚いたのは、靴下のパスがHTTPヘッダーに入れられているとき、それはproxy:unix://var/run/app_someappname.sockとして正しく解決されますが、変数がSetHandlerに渡されると、突然unix://var/run/app_%{MATCH_APPNAME}e.sockになり、リテラル%{MATCH_APPNAME}eが次のようになります。変数はSetHandler自体によって(そして誤って)解決されました...

これをどのように行うのですか?これも可能ですか?そうだと思います。

4
Smuuf

SetHandlerの代わりに[H=を使用してRewriteRuleを試しましたか?

RewriteRuleには、起動時ではなく実行時に引数を評価するという利点があります(通常のディレクティブは、実際に実行されるときに要求ごとの変数を補間しません)

3
covener