
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 ProxyPassMatch
declaració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/.../wwwroot
y 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_ROOT
y SCRIPT_FILENAME
conProxyFCGISetEnvIf
:
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 -D
argumento 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 FilesMatch
secció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.