Передача переменной Apache в директиву SetHandler

Я пытаюсь использовать динамически определенный сокет Unix, используемый для разных отдельных PHP-приложений (разные сокеты приводят к разным пулам PHP-FPM) на моем сервере Apache (2.4.18) (с помощью 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, похоже, не распознает и не оценивает переменную, определенную совпадением регулярного выражения в <DirectoryMatch> директива при использовании с директивой SetHandler.

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, а заголовком ответа HTTP для URL. http://127.0.0.1/apps/someappname/index.php (правильно) содержит: 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 (и неправильно) ...

Как можно это сделать? Это вообще возможно? Я думаю, что это должно быть.

1 ответ

Решение

Вы пробовали RewriteRule с [H= вместо SetHandler?

RewriteRule будет иметь преимущество в оценке аргументов, когда он выполняется, а не при запуске (типичные директивы не интерполируют переменные по запросу, когда они фактически выполняются)

Другие вопросы по тегам