
Pesquisei muito no Google e certamente há muitos resultados (até mesmo em serverfault.com) sobre esse problema. No entanto, não consegui resolver meus problemas com isso.
Minha configuração
Estou configurando o Ubuntu 20 no WSL2 e estou tentando provisioná-lo com o Ansible. Estou tentando configurar o Apache com PHP-FPM-7.4.
Apache
O Apache parece estar funcionando bem. Eu tenho uma raiz de documento com um test.html nele. Quando chamo o URL direto para esse arquivo HTML, vejo o conteúdo como deveria.
Vhost
Nota: para facilitar a leitura deixei de fora todos os comentários
DirectoryIndex index.php index.html
<VirtualHost *:80>
ServerName paul.test
ServerAlias *.paul.test
<FilesMatch \.php$>
Require all granted
SetHandler proxy:fcgi://127.0.0.1:9000
</FilesMatch>
UseCanonicalName Off
VirtualDocumentRoot /var/www/hosts/%-4.0.%-3.0/%-5+
<Directory "/var/www">
AllowOverride All
Options -Indexes +FollowSymLinks
Require all granted
</Directory>
ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/hosts/%-4.0.%-3.0/%-5+"
</VirtualHost>
<VirtualHost *:443>
ServerName paul.test
ServerAlias *.paul.test
<FilesMatch \.php$>
Require all granted
SetHandler proxy:fcgi://127.0.0.1:9000
</FilesMatch>
UseCanonicalName Off
VirtualDocumentRoot /var/www/hosts/%-4.0.%-3.0/%-5+
SSLEngine on
SSLCipherSuite AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCompression off
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<Directory "/var/www">
AllowOverride All
Options -Indexes +FollowSymLinks
Require all granted
</Directory>
ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/hosts/%-4.0.%-3.0/%-5+"
</VirtualHost>
PHP FPM
Agora o problema é quando eu chamo um arquivo PHP: então vejo "Arquivo não encontrado". no navegador da web.
pool.d/www.conf
Nota: para facilitar a leitura deixei de fora todos os comentários
[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 5
listen.allowed_clients = 127.0.0.1
Registros de erros
O log de erros do PHP-FPM diz que está funcionando bem:
[24-Dec-2020 12:16:06] NOTICE: fpm is running, pid 26532
[24-Dec-2020 12:16:06] NOTICE: ready to handle connections
[24-Dec-2020 12:16:06] NOTICE: systemd monitor interval set to 10000ms
O log de erros do Apache mostra um erro:
[Thu Dec 24 12:44:38.779511 2020] [proxy_fcgi:error] [pid 26424:tid 140510559713024] [client ::1:57178] AH01071: Got error 'Primary script unknown'
Como consertar/investigar?
Para começar, encontro a mensagem de erro “Arquivo não encontrado”. muito pouco claro. Quem não encontrou qual arquivo? Ajudaria a mim e a outras pessoas que terão esse erro no futuro explicar quem gera esse erro e o que ele significa exatamente.
Minha conclusão até este ponto seria que a mensagem de erro está sendo lançada pelo Apache e significa que ele não consegue encontrar o processo PHP-FPM. Isso está correto?
Como devo investigar e corrigir isso?
Editar:Adicionando minha configuração Apache e PHP-FPM.
Editar/nota importante
Ao melhorar este post e investigar o problema, descobri que a configuração básica do Apache e do PHP-FPM está funcionando bem.
O problema aparentemente é causado pela seguinte afirmação:
ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/hosts/%-4.0.%-3.0/%-5+"
Esta declaração funcionou bem em uma configuração anterior (com Centos), mas não funciona agora. Quando substituo esta instrução por um caminho estático para a raiz do documento, ela funciona bem.
Vou investigar mais detalhadamente, mas se alguém souber como consertar isso, por favor me avise.
Responder1
Após mais investigação, descobri que minha ProxyPassMatch
declaração causou o erro. E então encontrei uma postagem no StackOverflow dizendo que toda a instrução ProxyPassMatch não deveria ser usada.
Simplesmente SetHandler proxy:fcgi://127.0.0.1:9000
(que já estava no meu vhost) faz o PHP funcionar.
Responder2
Como este é o primeiro resultado que o Google me deu ao pesquisar "arquivo apache php-fpm não encontrado", gostaria de adicionar minha resposta aqui.
Se a raiz do documento voltado para o Apache fordiferenteda raiz do documento voltado para PHP-FPM
No meu caso, a raiz do documento voltada para o Apache era /data/.../wwwroot
, e a raiz do documento voltada para PHP-FPM (executando em um contêiner) era /var/www/html
.
A solução foi ajustar o DOCUMENT_ROOT
e SCRIPT_FILENAME
comProxyFCGISetEnvIf
:
Define container_root "/var/www/html"
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9000"
ProxyFCGISetEnvIf "true" DOCUMENT_ROOT "${container_root}"
ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "%{HANDLER}${container_root}%{reqenv:SCRIPT_NAME}"
</If>
</FilesMatch>
UnDefine container_root
(Uma observação sobre as diferentes sintaxes de acesso a variáveis: cada sintaxe é para variáveis de fontes diferentes. ${}
É para coisas definidas comDefine
, ou com o -D
argumento da linha de comando; %{}
se porvariáveis definidas pelo Apache; e %{reqenv:}
é umchamada de funçãopara acessar uma variável de ambiente interna.)
Você pode depurar essas variáveis adicionando as seguintes linhas no final da FilesMatch
seção:
Header always set X-HANDLER "expr=%{HANDLER}"
Header always set X-DOCUMENT_ROOT "expr=%{reqenv:DOCUMENT_ROOT}"
Header always set X-SCRIPT_FILENAME "expr=%{reqenv:SCRIPT_FILENAME}"
Header always set X-SCRIPT_NAME "expr=%{reqenv:SCRIPT_NAME}"
Você deverá ver isso nos cabeçalhos de resposta.