Passando a variável Apache para a diretiva SetHandler

4

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.

    
por Smuuf 17.01.2016 / 15:41

1 resposta

3

Já tentou RewriteRule com [H= em vez de SetHandler ?

O RewriteRule teria a vantagem de avaliar os argumentos quando ele é executado na inicialização (as diretivas comuns não interpõem as variáveis por requisição quando elas são realmente executadas)

    
por 18.01.2016 / 00:11