Estou tentando ter o soquete Unix determinado dinamicamente usado para diferentes "aplicativos" separados do PHP (diferentes soquetes levam a diferentes PHP-FPM pools) no meu servidor Apache (2.4.18) (usando 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>
Infelizmente, o Apache não parece reconhecer / avaliar a variável definida pela correspondência de expressão regular na diretiva <DirectoryMatch>
quando usada com o SetHandler directiva.
O error.log
diz isso:
[proxy:error] (2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/app_%{MATCH_APPNAME}e.sock (*) failed
Como alguém iria passar uma variável para a diretiva SetHandler ? Meu PHP-FPM está funcionando corretamente quando eu uso um caminho "rígido" para o UDS (por exemplo . "proxy:unix://var/run/app_someappname.sock|fcgi://localhost:42001"
, mas parece haver um problema ao usar uma variável nela.
Eu também tentei construir o caminho usando diversas variáveis reunidas:
<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>
Neste caso, a fonte do PHP não é processada pelo PHP, mas o cabeçalho da resposta HTTP da URL http://127.0.0.1/apps/someappname/index.php
(corretamente) contém: HANDLER_PATH: proxy:unix://var/run/app_someappname.sock|fcgi://localhost:42001
Mas quando passo a variável ${final}
para SetHandler , o servidor retorna 503 Service Unavailable
e error.log
diz:
*: 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 (*)
O que me impressiona é que quando o caminho da meia está sendo colocado no cabeçalho HTTP, ele é resolvido corretamente como
proxy:unix://var/run/app_someappname.sock
, mas quando a variável é passada para SetHandler , de repente ela se torna unix://var/run/app_%{MATCH_APPNAME}e.sock
com um literal %{MATCH_APPNAME}e
, como se a variável fosse resolvida pelo próprio SetHandler (e incorretamente) ...
Como alguém faria isso? Isso é possível? Eu acho que deve ser.