Eu instalei recentemente o Apache 2.4 na minha máquina local, junto com o PHP 5.4.8 usando o PHP-FPM.
Tudo correu bem (depois de um tempo ...), mas ainda existe um erro estranho:
Eu configurei o Apache para PHP-FPM assim:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1
</VirtualHost>
Funciona, por exemplo, se eu ligar http://localhost/info.php
, recebo o correto phpinfo()
(é apenas um arquivo de teste).
Se eu chamar um diretório, no entanto, recebo um 404 com corpo File not found.
e no log de erros:
[Tue Nov 20 21:27:25.191625 2012] [proxy_fcgi:error] [pid 28997] [client ::1:57204] AH01071: Got error 'Primary script unknown\n'
Atualizar
Agora eu tentei fazer o proxy com mod_rewrite:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>
Mas o problema é: ele está sempre redirecionando, porque é solicitado http://localhost/
automaticamente http://localhost/index.php
, por causa de
DirectoryIndex index.php index.html
Atualização 2
Ok, então acho que "talvez verifique se há um arquivo para fornecer ao proxy primeiro:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>
Agora a reescrita completa não funciona mais ...
Atualização 3
Agora eu tenho esta solução:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
RewriteEngine on
RewriteCond /Users/apfelbox/WebServer/%{REQUEST_FILENAME} -f
RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>
Primeiro verifique se há um arquivo para passar ao PHP-FPM (com o caminho completo e absoluto ) e depois faça a reescrita.
Isso não funciona ao usar a reescrita de URL dentro de um subdiretório, mas também falha em URLs como http://localhost/index.php/test/
So, de volta à estaca zero.
Alguma ideia?
fonte
config.php
arquivos sem formatação se eles estiverem dentro de diretórios com alias e, portanto, não existem em% {DOCUMENT_ROOT} /% {REQUEST_URI}.Também encontrei esse problema ontem - o Apache 2.4 saiu do Debian / experimental para o Debian / instável, forçando-me a lidar com esse novo material; não em nossos servidores de produção, é claro;).
Depois de ler o que parece ser milhões de sites, documentos do Apache, relatórios de erros e saída de depuração no log de erros, finalmente consegui que funcionasse. Não, ainda não há suporte para o FPM com soquetes . A configuração padrão do Debian já usa soquetes há algum tempo, então os usuários do Debian também terão que mudar isso.
Aqui está o que funciona para um site CakePHP e para o PHPMyAdmin (o último precisa de alguma configuração se você estiver usando os pacotes Debian), para que eu possa confirmar que
mod_rewrite
ainda funciona como esperado para reescrever URLs sofisticadas.Observe
DirectoryIndex index.php
que pode ser o motivo pelo qual nenhuma de suas configurações funcionou para "pastas" (pelo menos foi o que não funcionou aqui).Ainda obtenho
File not found.
diretórios, mas somente se não houver um arquivo de índice ele poderá analisar. Adoraria se livrar disso também, mas não é tão crítico quanto agora.O vhost acima funciona perfeitamente bem com um .htaccess na raiz assim:
Mas não entendi bem o que você quer dizer
URL rewriting inside a subdirectory
(estou reescrevendo apenas o index.php da raiz).(Ah, e você terá que garantir que o Xdebug não entre em conflito com o FPM no seu sistema, pronto para usar as mesmas portas.)
fonte
DirectoryIndex index.html
no vhost em questão corrigido. Se eu tiverDirectoryIndex index.php
, parece que outros arquivos PHP acabam dando o erro 'Arquivo não encontrado' e 'Script primário desconhecido'. No meu caso, eu tenhoindex.html
apenas um arquivo phptest.php
.Tudo que você precisa fazer é definir:
E não se esqueça de definir a página do cliente:
fonte
É isso que eu tenho. Parece funcionar bem. Coloquei o Drupal em um subdiretório e ele reescreve o trabalho, os índices de diretório funcionam e o PATH_INFO funciona.
Eu tentei fazer algo assim sem reescrever ("If" e tal), mas não consegui fazer nada funcionar.
EDIT: Observe que, se você implementasse isso como um provedor de hospedagem compartilhada, isso poderia ser um problema de segurança. Isso permitiria que os usuários passassem scripts PHP para um proxy fcgi arbitrário. Se você tivesse um pool separado para cada usuário, isso permitiria ataques de elevação de privilégios.
fonte
Outra solução (requer Apache> = 2.4.10) - Dentro do vhost:
Portanto, aqui, o manipulador fcgi para PHP será definido apenas se o arquivo existir e se seu nome corresponder à extensão do arquivo PHP.
BTW: Para aqueles que teriam idéia de definir o ProxyErrorOverride como Ativado , saiba que essa é realmente uma péssima idéia. O uso desta diretiva não ocorre sem causar nenhum problema. Por exemplo, qualquer aplicativo PHP que envie código HTTP como 503 levaria a resultados inesperados. O manipulador de erros padrão estaria envolvido em todos os casos e, para aplicativos PHP que fornecem API, esse é realmente um mau comportamento.
fonte
A melhor maneira de resolver isso é ativar os logs de depuração para mod_proxy e mod_rewrite e php-fpm. No apache 2.4, agora você pode ativar os logs de depuração apenas para módulos específicos. http://httpd.apache.org/docs/current/mod/core.html#loglevel A configuração por módulo e por diretório está disponível no Apache HTTP Server 2.3.6 e posterior
Talvez você esteja recebendo uma barra dupla nos diretórios?
Aqui está o que eu uso e funciona bem:
fonte
Uma coisa que me deparei ao lidar com esse problema é que, se você usar a combinação de:
Na configuração do seu pool de fpm, não passe o caminho completo para a
ProxyPass
diretiva.Mas -SOMENTE- se o pool nessa porta estiver com chroot.
fonte
Não tenho certeza se o problema está relacionado, mas encontrei uma solução que funciona parcialmente aqui:
https://stackoverflow.com/questions/44054617/mod-rewrite-in-2-4-25-triggering-fcgi-primary-script-unknown-error-in-php-fpm
O truque parece estar adicionando um? char no .htaccess RewriteRule, por exemplo, usando:
ao invés de:
A fonte do problema parece ser uma alteração no mod_rewrite do Apache 2.4.25. Eu usei o nível de log Apache trace1 para observar um "loop" que passa $ 1 para php-fpm após a indexação de index.php / $ 1. O $ 1 gera o erro "AH01071: Erro obtido 'script primário desconhecido \ n'".
Espero que este pequeno detalhe ajude alguém a resolver seus problemas.
fonte
Linode tem um ótimo tutorial sobre esse assunto
Basicamente, você configura um manipulador para todo o servidor que captura todos os scripts php e os passa para o fast-cgi.
fonte
Eu tenho o erro também depois de mudar para php-fpm + apache 2.4.6 para instâncias drupal
mas estou usando o mod de evento mpm
basta inserir
DirectoryIndex index.php
funciona para mimentão minhas configurações de Vhost se parecem abaixo
obrigado
não é necessário revisar o arquivo .htaccess padrão do drupal
fonte
Eu enfrento os mesmos problemas no meu servidor (docker centos 7.3.16). Depois de rastrear o log php-fpm, encontrei miss a sys lib.
WARNING: [pool www] child 15081 said into stderr: "php-fpm: pool www: symbol lookup error: /lib64/libnsssysinit.so: undefined symbol: PR_GetEnvSecure"
Se você não encontrar as soluções depois de tentar qualquer método, poderá tentar isso.yum -y install/reinstall nspr
fonte
Isso funciona com o Wordpress 5.1.1 e mais recente, juntamente com o PHP 7.3, FastCGI, proxy, também MariaDB / MySQL. Verificado duas vezes nos meus servidores. Funciona como um encanto.
Primeiro no CentOS / Fedora / Red Hat
Edite este arquivo:
Cole isto:
Deve dar srw-rw-rw-.
Ou como configurar no Debian / Ubuntu
Tutorial:
source: https://emi.is/?page=articles&article=php-7-installation-and-configuration-for-apache-2.4-using-php-fpm-(debian,-repository)
O problema é que o php 7.3 do Ondrej repo funciona apenas com o modo mpm_prefork. Ele tem git repo, então você pode encontrá-lo na net e perguntar se ele fará o php 7.3 para mpm_worker e mpm_event. O restante da configuração para as distribuições da família Debian está abaixo:
colar
colar
colar
copie isso para o arquivo txt:
remova-o e cole-o em vez de acima:
Adicionar diretiva
Em seguida, ative o site:
Próxima edição do site SSL (neste caso, o certbot de Let's Encrypt foi instalado e configurado anteriormente no início da configuração do certificado SSL).
Lembre-se de adicionar uma porta 9000 a um firewall no Debian / Ubuntu
No CentoOS / Fedora / Red Hat
fonte