mi configuración

mi configuración

Busqué mucho en Google y ciertamente hay muchos resultados (incluso en serverfault.com) sobre este problema. Sin embargo, no he podido resolver mis problemas con él.

mi configuración

He estado configurando Ubuntu 20 en WSL2 y estoy intentando aprovisionarlo con Ansible. Estoy intentando configurar Apache con PHP-FPM-7.4.

apache

Apache parece estar funcionando bien. Tengo una raíz de documento con un test.html. Cuando llamo a la URL directa de ese archivo HTML, veo el contenido como debería.

host virtual

Nota: para facilitar la lectura omití todos los comentarios.

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>

PHPFPM

Ahora el problema es cuando llamo a un archivo PHP: luego veo "Archivo no encontrado". en el navegador web.

pool.d/www.conf

Nota: para facilitar la lectura omití todos los comentarios.

[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 errores

El registro de errores de PHP-FPM dice que está funcionando bien:

[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

El registro de errores de Apache muestra un error:

[Thu Dec 24 12:44:38.779511 2020] [proxy_fcgi:error] [pid 26424:tid 140510559713024] [client ::1:57178] AH01071: Got error 'Primary script unknown'

¿Cómo arreglar/investigar?

Para empezar, me aparece el mensaje de error "Archivo no encontrado". muy poco claro. ¿Quién no encontró qué archivo? Nos ayudaría a mí y a otras personas que tengan este error en el futuro explicar quién genera este error y qué significa exactamente.

Mi conclusión hasta este punto sería que Apache arroja el mensaje de error y significa que no puede encontrar el proceso PHP-FPM. ¿Es eso correcto?

¿Cómo debo investigar más a fondo y solucionar este problema?

Editar:Agregando mi configuración de Apache y PHP-FPM.

Editar/nota importante

Mientras mejoraba esta publicación e investigaba el problema, descubrí que la configuración básica de Apache y PHP-FPM funciona bien.

El problema aparentemente se debe a la siguiente declaración:

ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/hosts/%-4.0.%-3.0/%-5+"

Esta declaración funcionó bien en una configuración anterior (con Centos), pero no funciona ahora. Cuando reemplazo esta declaración por una ruta estática a la raíz del documento, funciona bien.

Investigaré más a fondo, pero si alguien sabe cómo solucionar este problema, hágamelo saber.

Respuesta1

Después de investigar más, descubrí que mi ProxyPassMatchdeclaración causó el error. Y luego encontré una publicación en StackOverflow que decía que no se debería usar toda la declaración ProxyPassMatch.

Simplemente SetHandler proxy:fcgi://127.0.0.1:9000(que ya estaba en mi vhost) hace que PHP funcione.

Respuesta2

Dado que este es el primer resultado que me dio Google al buscar "archivo Apache php-fpm no encontrado", me gustaría agregar mi respuesta aquí.

Si la raíz del documento orientada a Apache esdiferentedesde la raíz del documento orientado a PHP-FPM

En mi caso, la raíz del documento orientada a Apache era /data/.../wwwrooty la raíz del documento orientada a PHP-FPM (que se ejecuta en un contenedor) era /var/www/html.

La solución fue ajustar el DOCUMENT_ROOTy SCRIPT_FILENAMEconProxyFCGISetEnvIf:

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

(Una nota sobre las diferentes sintaxis de acceso a variables: cada sintaxis es para variables de diferentes fuentes. ${}es para cosas definidas conDefine, o con el -Dargumento de la línea de comando; %{}Si porvariables definidas por Apache; y %{reqenv:}es unLlamada de funciónpara acceder a una variable de entorno interna).

Puede depurar estas variables agregando las siguientes líneas al final de la FilesMatchsección:

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}"

Luego deberías verlos en los encabezados de respuesta.

información relacionada