Encaminhando solicitações PHP via ProxyPassMatch como um manipulador, ou somente quando o arquivo existe

5

Estou migrando meu servidor para usar mod_proxy_fcgi e php-fpm em vez de mod_php. O Apache é capaz de encaminhar solicitações .php para o proxy fcgi e o PHP é executado corretamente. Eu tenho isso trabalhando com:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1

Infelizmente, o Apache encaminha todas as solicitações .php para o proxy, mesmo quando o arquivo não existe. Isso causa alguns problemas. Minha regra ErrorDocument não é invocada e DirectoryIndex index.php index.html não retorna a index.html.

Consegui corrigir estes problemas com o mod_rewrite:

RewriteEngine On                                                           
RewriteCond %{REQUEST_FILENAME} ^/((.*\.php)(/.*)?)$                       
RewriteCond /var/www/html/%2 -f                                   
RewriteRule . fcgi://127.0.0.1:9000/var/www/html/%1 [P] 

No entanto, a documentação do Apache não recomenda RewriteRule : "Isso ocorre porque flag aciona o uso do worker padrão, que não manipula o pool de conexões. "

Idealmente, eu gostaria de usar o ProxyPass em um bloco FilesMatch (atualmente não suportado), ou definir um novo manipulador que faça proxy através do fcgi e usá-lo para manipular solicitações .php, similar ao mod_php.

Alguma sugestão para simular uma configuração padrão de mod_php, mas na verdade intermediando por proxy o fcgi?

    
por ide 09.11.2013 / 23:04

5 respostas

4

Uma opção é instalar o mod_proxy_handler: link

Ou você pode esperar pelo Apache 2.4.10, que deve incluir o módulo.

Basicamente, o módulo permite fazer isso:

#tcp
<FilesMatch \.php$>
SetHandler proxy:fcgi://localhost:9000
</FilesMatch>

#uds
<FilesMatch \.php$>
    SetHandler "proxy:unix:/path/to/socket.sock|fcgi://./"
</FilesMatch>
    
por 13.06.2014 / 14:31
0

Idem para o OP.

  • Também não consegui descobrir como obter a configuração do Apache VHOST para rotear solicitações não localizáveis para um 404.
  • Da mesma forma, eu também fui bloqueado ao tentar descobrir como obter URLs sem extensão para mapear ProxyPassMatch .
    • Claro ... eu poderia rotear tudo através do php-fpm proxy, mas isso matou arquivos javascript e css.

Solução Teórica

Meu palpite é que eu teria que escrever um processador 404.php personalizado - e então rotear todos os pedidos através da anexação do (s) arquivo (s) solicitado (s) como uma string de consulta.

Por exemplo:

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-s
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-l
RewriteRule ^.*$   fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/404.php?no_comprende=%{REQUEST_URI} [P]
...
ProxyPassMatch ^/(.*\.php(/.*)?)$    fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1
...

em teoria - e assumindo que a ordem em que eles estão listados ainda se aplica como normal:

Any 404'd file would be caught before the ProxyPassMatch directive was reached

MINHA SOLUÇÃO

  • php5-fpm (5.4.23)
  • Apache 2.4.2
  • Ubuntu 12.04 / 3.8.0-34 x86_64

Para lidar com URLs sem extensão com php-fpm , adaptei o acima para procurar URLs sem extensão na configuração do meu VHOST:

...
# Extensionless URL's
RewriteCond %{REQUEST_FILENAME} ^/((.*)(/.*)?)$
RewriteCond %{DOCUMENT_ROOT}/%2.php -f
RewriteRule !.*\.php$   fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/%1.php   [P]

# files w/ .php extensions
RewriteCond %{REQUEST_FILENAME} ^/((.*\.php)(/.*)?)$
RewriteCond %{DOCUMENT_ROOT}/%2 -f
RewriteRule . fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/%1 [P]
...

Não é bonito, mas faz o trabalho: - (

    
por 18.12.2013 / 01:40
0

Apenas para o registro como um forro:

AddHandler "proxy:unix:/path/to/socket.sock|fcgi://./" .php

Você precisará de um Apache 2.4 recente (o RedHat retornou para o 2.4.6)

Oliver

    
por 20.10.2015 / 19:36
0

Eu tinha exatamente o mesmo problema que ide e passei muito mais tempo tentando resolver isso do que eu esperava. Como esse é o único post ou artigo que consegui encontrar que me ajudou a resolver o problema de maneira adequada, desejei adicionar minha solução ao mix.

Minha configuração:

  • Ubuntu 14.04
  • Apache 2.4.20
  • PHP-FPM 5.5.9-1ubuntu4.17 (fpm-fcgi) (construído em: 19 de maio de 2016 19:08:26)

Encontrei alguns desafios adicionais:

  1. Meu manipulador ErrorDocument é um arquivo PHP.
  2. Eu tenho um monte de diretivas RedirectPermanent no arquivo .htaccess do meu documento root. Eles não estavam sendo honrados porque as solicitações eram intermediadas por proxy para o PHP-FPM antes de as regras de redirecionamento serem avaliadas.
  3. O FilesMatch foi insuficiente para mim porque uso a regravação de URL de maneiras semelhantes ao Wordpress. Por exemplo. /mydir/mypath.html aponta para /mydir/script.php. Eu não consegui fazer isso para combinar as URLs reescritas, embora talvez eu tenha esquecido alguma coisa?
  4. Consegui que a abordagem do misterich funcionasse, mas depois de ler o aviso de desempenho , Eu decidi cavar ainda mais.

Minha solução é basicamente isso:

  1. Intercepte e redirecione solicitações para diretórios e arquivos inexistentes e reescreva-os para o arquivo PHP do manipulador de erros.
  2. Use outra regra de reconfiguração para rotear minha solicitação de erro reescrita para o PHP-FPM.
  3. Encaminhar todas as outras solicitações para o PHP-FPM usando ProxyPassMatch.

Para resolver os redirecionamentos 301 (# 2), aproveitarei o manipulador de erros para emitir redirecionamentos.

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^.*\.php$ /error.php?error=404&requestUri=$1

RewriteCond %{REQUEST_FILENAME} ^/(error.php)$
RewriteCond %{DOCUMENT_ROOT}/%1 -f
RewriteRule . fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/%1   [P]

# PHP-FPM
ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/mysite.com"
    
por 29.05.2016 / 02:33
0

Eu tive o mesmo problema quando o arquivo não existia estava mostrando "Arquivo não encontrado". mensagem, isso corrigiu meu problema e permitiu que eu configurasse uma página 404:

<VirtualHost *:80>

---------- content --------

DocumentRoot /home/user/public_html/domain.tld

#this disables php execution if you wish to show only html files
#ProxyPass /errors !

ProxyErrorOverride On
# /errors folder is located in public_html
ErrorDocument 404 /errors/404.php


</VirtualHost>
    
por 08.07.2017 / 08:18