Minha configuração

Minha configuração

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 ProxyPassMatchdeclaraçã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_ROOTe SCRIPT_FILENAMEcomProxyFCGISetEnvIf:

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 -Dargumento 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 FilesMatchseçã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.

informação relacionada