Recientemente instalé Apache 2.4 en mi máquina local, junto con PHP 5.4.8 usando PHP-FPM.
Todo salió bastante bien (después de un tiempo ...) pero todavía hay un extraño error:
Configuré Apache para PHP-FPM de esta manera:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1
</VirtualHost>
Funciona, por ejemplo, si llamo http://localhost/info.php
obtengo el correcto phpinfo()
(es solo un archivo de prueba).
Sin embargo, si llamo a un directorio, obtengo un 404 con cuerpo File not found.
y en el registro de errores:
[Tue Nov 20 21:27:25.191625 2012] [proxy_fcgi:error] [pid 28997] [client ::1:57204] AH01071: Got error 'Primary script unknown\n'
Actualizar
Ahora intenté hacer el proxy con 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>
Pero el problema es: siempre está redirigiendo, porque se solicita http://localhost/
automáticamente http://localhost/index.php
, debido a
DirectoryIndex index.php index.html
Actualización 2
Ok, entonces pienso "tal vez verifique si hay un archivo para darle al proxy primero:
<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>
Ahora la reescritura completa ya no funciona ...
Actualización 3
Ahora tengo esta solución:
<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>
Primero verifique que haya un archivo para pasar a PHP-FPM (con la ruta completa y absoluta ) y luego realice la reescritura.
Esto no funciona cuando se usa la reescritura de URL dentro de un subdirectorio, también falla para URL como http://localhost/index.php/test/
So back to square one.
¿Algunas ideas?
fuente
config.php
archivos sin formato si estuvieran dentro de directorios con alias y, por lo tanto, no existieran en% {DOCUMENT_ROOT} /% {REQUEST_URI}.Ayer también me encontré con este problema: Apache 2.4 se mudó de Debian / experimental a Debian / inestable, lo que me obligó a lidiar con estas cosas nuevas; no en nuestros servidores de producción, por supuesto;).
Después de leer lo que parecen millones de sitios, documentos de Apache, informes de errores y resultados de depuración en el registro de errores, finalmente lo puse a trabajar. No, todavía no hay soporte para FPM con sockets . La configuración predeterminada de Debian ha estado usando sockets durante algún tiempo, por lo que los usuarios de Debian tendrán que cambiar eso también.
Esto es lo que funciona para un sitio CakePHP y PHPMyAdmin (este último necesita algo de configuración si está utilizando los paquetes de Debian), por lo que puedo confirmar que
mod_rewrite
todavía funciona como se espera para una reescritura de URL elegante.Tenga en cuenta
DirectoryIndex index.php
, que podría ser la razón por la que ninguna de sus configuraciones funcionó para "carpetas" (al menos eso es lo que no funcionó aquí).Todavía obtengo
File not found.
directorios, pero solo si no hay un archivo de índice se puede analizar. Me encantaría deshacerme de eso también, pero no es tan crítico como por ahora.El vhost anterior funciona perfectamente bien con un .htaccess en la raíz como este:
Sin
URL rewriting inside a subdirectory
embargo , no entiendo a qué te refieres (solo estoy reescribiendo en el index.php de la raíz).(Ah, y tendrá que asegurarse de que Xdebug no entre en conflicto con FPM en su sistema, listos para usar, quieren usar los mismos puertos).
fuente
DirectoryIndex index.html
en el vhost en cuestión lo solucionó. Si lo he hechoDirectoryIndex index.php
, parece que otros archivos PHP terminan dando el error 'Archivo no encontrado' y 'Script primario desconocido'. En mi caso, tengo unindex.html
archivo pero un phptest.php
.Todo lo que necesitas hacer es configurar:
Y no olvide configurar la página del cliente:
fuente
Esto es lo que tengo. Parece funcionar bien. Puse Drupal en un subdirectorio y su reescritura funciona, los índices de directorio funcionan y PATH_INFO funciona.
Intenté hacer algo como esto sin reescribir ("If" y tal), pero no pude hacer que nada funcionara.
EDITAR: tenga en cuenta que si implementara esto como un proveedor de alojamiento compartido, esto podría ser un problema de seguridad. Permitiría a los usuarios pasar scripts PHP a un proxy fcgi arbitrario. Si tuviera un grupo separado para cada usuario, eso permitiría la elevación de los ataques de privilegios.
fuente
Otra solución más (requiere Apache> = 2.4.10) - Dentro del vhost:
Entonces, aquí, el controlador fcgi para PHP se establecerá solo si el archivo existe y si su nombre coincide con la extensión del archivo PHP.
Por cierto: para aquellos que tendrían la idea de establecer ProxyErrorOverride en On , tenga en cuenta que esta es realmente una mala idea. El uso de esta directiva no es sin causar ningún problema. Por ejemplo, cualquier aplicación PHP que envíe código HTTP como 503 conduciría a un resultado inesperado. El controlador de errores predeterminado estaría involucrado en cualquier caso y para las aplicaciones PHP que proporcionan API, eso es realmente un mal comportamiento.
fuente
La mejor manera de resolver esto es activar los registros de depuración para mod_proxy y mod_rewrite y php-fpm. En apache 2.4 ahora puede activar los registros de depuración solo para módulos específicos. http://httpd.apache.org/docs/current/mod/core.html#loglevel La configuración por módulo y por directorio está disponible en Apache HTTP Server 2.3.6 y versiones posteriores
¿Quizás estás obteniendo una doble barra en los directorios?
Esto es lo que uso y funciona bien:
fuente
Una cosa que encontré al tratar este problema es que si usa la combinación de:
En la configuración de su grupo fpm, no pase la ruta completa a la
ProxyPass
directiva.Pero -SÓLO- si el grupo en ese puerto está cortado.
fuente
No estoy seguro de si el problema está relacionado, pero he encontrado una solución que funciona parcialmente aquí:
https://stackoverflow.com/questions/44054617/mod-rewrite-in-2-4-25-triggering-fcgi-primary-script-unknown-error-in-php-fpm
El truco parece ser agregar un? char en .htaccess RewriteRule, por ejemplo, usando:
en lugar de:
La fuente del problema parece ser un cambio en mod_rewrite de Apache 2.4.25. He usado el nivel de registro Apache trace1 para observar un "ciclo" que pasa $ 1 a php-fpm después de que se haya pasado index.php / $ 1. Los $ 1 generan el error "AH01071: Error obtenido 'Secuencia de comandos primaria desconocida \ n'".
Espero que este pequeño dato ayude a alguien a resolver sus problemas.
fuente
Linode tiene un gran tutorial sobre este tema.
Básicamente, configura un controlador para todo el servidor que capturará cualquier script php y lo pasará a fast-cgi.
fuente
Tengo el error también después de cambiar a php-fpm + apache 2.4.6 para instancias de drupal
pero estoy usando mod de eventos mpm
solo inserta
DirectoryIndex index.php
funciona para mientonces mi configuración de Vhost se ve a continuación
Gracias
no es necesario revisar el archivo .htaccess predeterminado de drupal
fuente
Me enfrento a los mismos problemas en mi servidor (centos 7.3.16 docker). Después de rastrear el registro php-fpm, encontré 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"
luego, vuelvo a instalar el nspr, funciona. Si no puede encontrar las soluciones después de probar algún método, puede intentarlo.yum -y install/reinstall nspr
fuente
Esto funciona con Wordpress 5.1.1 y más reciente junto con PHP 7.3, FastCGI, proxy, también MariaDB / MySQL. Comprobado dos veces en mis servidores. Funciona de maravilla.
Primero en CentOS / Fedora / Red Hat
Edite este archivo:
Pega esto:
Debería dar srw-rw-rw-.
O cómo configurar en Debian / Ubuntu
Tutorial:
fuente: https://emi.is/?page=articles&article=php-7-installation-and-configuration-for-apache-2.4-using-php-fpm-(debian,-repository)
El problema es que php 7.3 del repositorio de Ondrej solo funciona con el modo mpm_prefork. Tiene git repo, por lo que puede encontrarlo en la red y preguntarle si creará php 7.3 para mpm_worker y mpm_event. El resto de la configuración para las distribuciones de la familia Debian está a continuación:
pegar
pegar
pegar
copia esto al archivo txt:
eliminarlo y luego pegar esto en lugar de arriba:
Agregar directiva
Luego habilite el sitio:
A continuación, edite el sitio SSL (en este caso, certbot de Let's Encrypt se instaló y configuró previamente al comienzo de la configuración del certificado SSL).
Recuerde agregar un puerto 9000 a un firewall en Debian / Ubuntu
En CentoOS / Fedora / Red Hat
fuente