Nginx + php5-fpm = "Archivo no encontrado"

14

Choqué contra un muro mientras configuraba un sitio usando nginx / fpm. La página muestra "Archivo no encontrado", y esto aparece en nginx error.log:

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

Soy nuevo en nginx y fpm, y ese mensaje de error no significa nada para mí (¡incluso la máquina de google no me ha ayudado!). ¿Alguien puede arrojar alguna luz sobre lo que podría estar pasando?

Mateo
fuente
¿Podría agregar la parte de su configuración nginx donde define el manejo de PHP?
Christopher Perrin
Para mí, el siguiente artículo me ayudó: nginxlibrary.com/resolving-no-input-file-specified-error . En general, este error se produce si hay un problema con el SCRIPT_FILENAME.
white_gecko

Respuestas:

18

Debería tener una locationsección para manejar solicitudes PHP configuradas de manera similar a esta:

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass    127.0.0.1:9000;
            fastcgi_index   index.php;
            fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include         fastcgi_params;
    }

(El extra try_filesresuelve una vulnerabilidad de seguridad que podría permitir la ejecución de archivos arbitrarios como PHP).

Además, rootdebe definirse en la serversección del archivo de configuración, no en la locationsección. Esta es una de las configuraciones erróneas de nginx más comunes .

Michael Hampton
fuente
+1 para ese artículo de configuración errónea, realmente vale la pena leerlo, especialmente si estás aprendiendo Nginx. Bien escrito, nivel de entrada, con varios consejos geniales!
Ben
2

Esta es una nota para instalaciones de pasajeros.

Acabo de instalar nginx desde la fuente a través del pasajero, lo que causó un problema con php5-fpm. El nginx.conf predeterminado hace uso del problema descrito por Michael Hampton. La solución es eliminar el blok alrededor de las directivas raíz e de índice, de modo que:

location / {
    root html
    index index.html index.htm
}

se convierte en:

root html
index index.html index.htm

Además, el bloque php está configurado incorrectamente. Vea la respuesta de Michael Hamptons para conocer la forma correcta de hacerlo.

Una nota adicional podría ser que si php5-fpm está configurado para usar sockets, apunte el parámetro fastcgi_pass en el bloque php en nginx.conf a la configuración del socket en /etc/php5/fpm/pool.d/www.conf.

Kenneth
fuente
2

Acabo de tener este problema en una nueva versión de nginx. (configuración tomada de una versión anterior)

Lo que tuve que hacer fue colocar lo include fastcgi_params;anterior mi costumbre de SCRIPT_FILENAMEesta manera:

location @web {
        try_files $uri =404;
        include         fastcgi_params;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
}

Como SCRIPT_FILENAMEse estaba sobrescribiendo el.

cómplice
fuente
1

Si está utilizando alias en sus bloques de ubicación, un error 404 no controlado también puede exhibir este comportamiento. Puede ver esto si la página que se muestra en el navegador es el texto simple "Archivo no encontrado" en lugar de la página nginx 404 formateada (centrada) más bonita. Esencialmente, realmente está diciendo que no se puede encontrar la página 404.

Para resolverlo, agregue una try_files $uri =404línea adicional en su bloque de ubicación y vuelva a cargar la configuración de nginx. Además de lo que dijo Michael Hampton sobre la resolución de una vulnerabilidad de seguridad específica , esto también permite que el controlador fastcgi anule la definición de alias y encuentre el script 404 en la ubicación predeterminada.

Sopa de radio
fuente
1
sudo vim /etc/php-fpm.conf

sobre la línea 149, cambiar usuario php && grupo de usuarios

Lo pruebo con éxito ahora.

camino a casa
fuente
¡Esta es la forma correcta! Hola hombre, puedes probarlo!
Amor
Cuando cambie el usuario y el grupo, no olvide reiniciar php-fpm. Si usa centos6 puede usar este comando: sudo service php-fpm restart
Amor
0

He visto :

FastCGI enviado en stderr: "Secuencia de comandos primaria desconocida" mientras se lee el encabezado de respuesta desde el nivel superior

en un servidor que puse bajo alta carga cuando se realiza una prueba de esfuerzo Mi sospecha, aún por confirmar, es que los identificadores de archivos disponibles del sistema operativo estaban agotados. En cuyo caso php-fpm no puede obtener una referencia al archivo.

Me doy cuenta de que esto es especulativo, pero ciertamente se ajusta a mi escenario y también podría ayudar a alguien más.

Ian Lewis
fuente
0

Gracias @homeway, tu respuesta me inspira. ¡Muchas gracias!

¡Encuentro la misma pregunta, pero otro método no me ayudó a resolver la pregunta!

Lo resuelvo, encuentro que la clave es que: El derecho de usuario de Linux conduce a la pregunta: FastCGI enviado en stderr: "Se desconoce el script primario"

Porque el usuario predeterminado de PHP-FPM: group es apache: apache, pero su directorio de código es someBody: someBody. ¡Entonces debe cambiar el derecho de usuario!

Escribo un blog para resolver esta pregunta. Puedes ver este blog:

[Nginx FastCGI enviado en stderr: "Script primario desconocido"] [1] `[1]: http://geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html

Amor
fuente