nginx mostrando páginas PHP en blanco


164

He configurado un servidor nginx con php5-fpm. Cuando intento cargar el sitio, aparece una página en blanco sin errores. Las páginas HTML se sirven bien pero no php. Intenté encender display_errors en php.ini pero no tuve suerte. php5-fpm.log no produce ningún error y tampoco lo es nginx.

nginx.conf

server {
    listen 80;
    root /home/mike/www/606club;
    index index.php index.html;
    server_name mikeglaz.com www.mikeglaz.com;
    error_log /var/log/nginx/error.log;
    location ~ \.php$ {
            #fastcgi_pass 127.0.0.1:9000;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }
}

EDITAR

Aquí está mi registro de errores nginx:

2013/03/15 03:52:55 [error] 1020#0: *55 open() "/home/mike/www/606club/robots.txt" failed (2: No such file or directory), client: 199.30.20.40, server: mikeglaz.com, request: "GET /robots.txt HTTP/1.1", host: "mikeglaz.com"

1
Aparentemente, nginx no llamó a php-fpm, ¿ha verificado el registro de errores de nginx?
adamsmith

Mira mi actualización arriba.
Mike Glaz

El error nginx connect() failed ... fastcgi://127.0.0.1:9000contradice su nginx conf, ¿reload nginx conf?
adamsmith

Creo que esto es correcto
Mike Glaz

2
Estoy realmente sorprendido de que esto solo parezca afectar a unas mil personas en el planeta, ya que incluso la configuración predeterminada de nginx + php causa esto.
Sliq

Respuestas:


250

Como referencia, adjunto mi locationbloque para capturar archivos con la .phpextensión:

location ~ \.php$ {
    include /path/to/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
}

Vuelva a verificar /path/to/fastcgi-paramsy asegúrese de que esté presente y que el usuario nginx pueda leerlo.


3
Su solución fue parte de ella. La otra parte está aquí wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Mike Glaz

154
la última línea con 'SCRIPT_FILENAME' hizo el truco para mí :) gracias
Stijn Leenknegt

3
gracias, esa última línea funcionó (no es necesaria cuando se usa la versión 1.0 de nginx que se envía con Centos). Me encantaría ver la documentación sobre todo esto mejorar.
Jorre

1
De nada, me alegra saber que todavía ayuda a las personas después de todos estos años. Sin embargo, tenga en cuenta la respuesta actualizada de @ spacepile a continuación, que probablemente sea mejor.
Julian H. Lam

2
Me encontré con el mismo problema y la solución para mí fue agregar SCRIPT_FILENAME como se describe aquí (sin la barra inclinada /). Pero lo que me volvió loco es por qué realmente necesito hacer esto. Tuvimos otra instalación de nginx (anterior a 1.9) y allí esta línea no era necesaria. Encontré este nginx.com/resources/wiki/start/topics/examples/phpfcgi , y si lo compara con sus fastcgi_params, verá que lo más probable es que no sea lo mismo que la versión en línea enumerada y verá que SCRIPT_FILENAME no está ahí ¿Porque eso? Vaya figura ...
Daniel Dimitrov

342

reemplazar

include fastcgi_params;

con

include fastcgi.conf;

y elimine fastcgi_param SCRIPT_FILENAME ... en nginx.conf


17
Esto me lo arregló. El .conftiene una configuración adicional del parámetro que falta _params.
Malvineous

77
Esto (y, por supuesto /etc/init.d/nginx restart) también me lo arregló en Debian Testing después de una nginxactualización el 10 de septiembre de 2014.
severin

66
Esto también me lo arregló después de actualizar nginx a 1.6.2 (actualización de septiembre de 2014). Tengo que amar las actualizaciones que rompen las cosas al azar.
Mahn

30
Aquí está la historia de fondo de fastcgi_paramsvs fastcgi.conf: blog.martinfjordvald.com/2013/04/…
Levite

44
Este código no funciona, no sé por qué; Este código funciona, no sé por qué. Me salvaste varias horas.
Alex

54

También tuve este problema y finalmente encontré la solución aquí . En resumen, debe agregar la siguiente línea a su archivo de configuración nginx fastcgi (/ etc / nginx / fastcgi_params en Ubuntu 12.04)

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
Muchas gracias, esto lo arregló en Ubuntu 12.04 LTS.
Valentin Klinghammer

2
También se arregló para mí después de actualizar nginx 1.5.4 -> 1.7.4. Muchas gracias!
trisweb

44
Trabajó en Ubuntu 14.04.
timetofly

1
Se corrigió al actualizar de Debian Wheezy (7.8) a Jessie (8) y de Nginx 1.2.1-2.2 a 1.6.2-5. Enormes gracias.
William Turrell

1
Según tengo entendido, le dice a fastcgi dónde están los archivos que necesita servir. PATH_TRANSLATED toma el URI de solicitud y luego lo "traduce" a donde está el archivo real en el servidor. P.ej. PATH_TRANSLATED para test.com/index.php puede ser /var/www/index.php
Constante Meiring

44

Muchos usuarios caen en este hilo esperando encontrar una solución para las páginas en blanco que se muestran mientras usan nginx + php-fpm , siendo yo uno de ellos. Este es un resumen de lo que terminé haciendo después de leer muchas de las respuestas aquí más mis propias investigaciones (actualizado a php7.2):

1) Abrir /etc/php/7.2/fpm/pool.d/www.confy verificar el valor del parámetro listen.

listen = /var/run/php/php7.2-fpm.sock

2) El parámetro listendebe coincidir con el fastcgi_passparámetro en el archivo de configuración de su sitio (i, e:) /etc/nginx/sites-enabled/default.

fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

3) Verifique que el archivo realmente exista:

$ file /var/run/php/php7.2-fpm.sock 
/var/run/php/php7.2-fpm.sock: socket

4) Si no existe, significa que php7.2-fpm no se está ejecutando, por lo que debe reiniciarlo:

$ sudo /etc/init.d/php7.2-fpm restart
[ ok ] Restarting php7.2-fpm (via systemctl): php7.2-fpm.service.


Con respecto a la locationsección en /etc/nginx/sites-enabled/default:

   # pass PHP scripts to FastCGI server
   #
   location ~ \.php$ {
      include snippets/fastcgi-php.conf;

      # With php-fpm (or other unix sockets):
      fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
   }

Compruebe que el archivo snippets/fastcgi-php.confexiste en la ubicación /etc/nginx/:

$ file /etc/nginx/snippets/fastcgi-php.conf
/etc/nginx/snippets/fastcgi-php.conf: ASCII text

Este archivo contiene una lista de definiciones de variables requeridas por php7.2-fpm. Las variables se definen directamente o mediante la inclusión de un archivo separado.

 include fastcgi.conf;

Este archivo se encuentra en /etc/nginx/fastcgi.confy se ve así:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
...
fastcgi_param  REDIRECT_STATUS    200;

nginx incluye dos posibles archivos de parámetros: fastcgi_params y fastcgi.conf . La diferencia entre ambos es la definición de variable SCRIPT_FILENAME:

$ diff fastcgi_params fastcgi.conf 
1a2
> fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

Para resumir , fastcgi.conf siempre debería funcionar. Si por alguna razón que está configurado está usando fastcgi_params , debe definir SCRIPT_FILENAME:

location ~ \.php$ {
  include snippets/fastcgi-php.conf;

  # With php-fpm (or other unix sockets):
  fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

  fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
}

Ahora vuelva a cargar la configuración de nginx:

$ sudo nginx -s reload

Y verifique que un archivo php se muestre correctamente. Por ejemplo:

/var/www/html/test.php

<pre><?php var_export($_SERVER)?></pre>

¿Dónde /var/www/htmlestá la ruta a la raíz del documento?

Si a pesar de todo, todavía se está viendo un archivo en blanco, asegúrese de que php.iniha short_open_tagactivado (si se está probando una página PHP con las etiquetas cortas).


1
Gracias diego fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;Hizo el truco finalmente.
peligro89

El include fastcgi.conf ayudó a arreglarlo todo
Rytis Lukoševičius

1
desglose impresionante! Me faltaba la configuración SCRIPT_FILENAME, esto lo hizo funcionar
herval

1
cuando agregué SCRIPT_FILENAME a esa configuración, nuevamente todo falló con "archivo no encontrado"
holms

¿Qué pasa con la larga historia, por qué hay dos incluye y uno no funciona fuera de la caja?
El padrino

24

Asegúrese de tener esto en / etc / nginx / fastcgi_params

fastcgi_param SCRIPT_FILENAME $ request_filename;

¿Quién sabe por qué esto ya no está allí? ¡La cantidad de tiempo que esto debe desperdiciar colectivamente!


1
+1 Una ventaja aparente de "fastcgi_param SCRIPT_FILENAME $ request_filename;" es diferente a "$ document_root / $ fastcgi_script_name", "$ request_filename" adapta la ruta a la directiva "alias" de Nginx. Ver: nginx.org/en/docs/http/ngx_http_core_module.html#variables , nginx.org/en/docs/http/ngx_http_core_module.html#alias , y el blog de Martin Fjordvald citado por Levit arriba ( blog.martinfjordvald.com/2013 / 04 / ... ). En mi bloque de ubicación, resolvió el problema de la página en blanco con php71-fpm y Nginx instalado con Homebrew en El Capitan.
Slack Undertow

15

Escribí un breve programa en C que devuelve las variables de entorno pasadas de nginx a la aplicación fastCGI.

#include <stdlib.h>
#include <fcgi_stdio.h>
extern char **environ;

int main(int argc, char **argv) {
    char *envvar;
    int i;

    int count = 0;
    while(FCGI_Accept() >= 0) {
        printf("Content-type: text/html\n\n"
               "<html><head><title>FastCGI Call Debug Tool</title></head>\n"
               "<body><h1>FastCGI Call Debugging Tool</h1>\n"
               "<p>Request number %d running on host <i>%s</i></p>\n"
               "<h2>Environment Variables</h2><p>\n",
              ++count, getenv("SERVER_NAME"));
        i = 0;
        envvar = environ[i];
        while (envvar != NULL) {
                printf("%s<br/>",envvar);
                envvar = environ[++i];
        }
        printf("</p></body></html>\n");
    }
    return 0;
}

Guarde esto en un archivo, por ejemplo fcgi_debug.c

Para compilarlo, primero instale gccy libfcgi-devluego ejecute:

gcc -o fcgi_debug fcgi_debug.c -lfcgi

Para ejecutarlo, instale spawn-fcgi, luego ejecute:

spawn-fcgi -p 3000 -f /path/to/fcgi_debug

Luego, cambie su configuración de nginx fcgi para que apunte al programa de depuración:

fastcgi_pass  127.0.0.1:3000;

Reinicie nginx, actualice la página y debería ver todos los parámetros aparecer en su navegador para que pueda depurar. :-)


1
Tenga en cuenta que necesita encabezados y spawn-fcgi. En Debian / Ubuntu puedes obtenerlo apt-get install spawn-fcgi libfcgi-dev.
Pevik

8

Estas sugerencias me ayudaron con mi instalación de Ubuntu 14.04 LTS,

Además necesitaba para encender la short_open_tagde/etc/php5/fpm/php.ini

$ sudo kate /etc/php5/fpm/php.ini

short_open_tag = On

$ sudo service php5-fpm restart
$ sudo service nginx reload

Esto se solucionó mediante la instalación de Ubuntu droplet DO. Gracias
Andrew

Esto se arregló para mí después de instalar nginx 1.9.4
Ajeeb.KP

6

Agregue esto en /etc/nginx/conf.d/default.conf:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
¿Le importaría proporcionar un poco más de detalles sobre cuál es exactamente el problema de OP y cómo su respuesta resuelve el problema de OP?
wookie919

1
Esto resolvió el mismo problema para mí en Ubuntu 15.04 con nginx 1.8.0 y php-fpm 5.6.4-4ubuntu6. Me encantaría saber qué está haciendo realmente y por qué no se incluye con el archivo de configuración nginx predeterminado, pero al menos estoy contento de haberlo codificado en un Dockerfile.
James Williams

Poner el valor en el /etc/nginx/fastcgi_paramsarchivo sería más apropiado, creo.
Arda

4

En caso de que alguien tenga este problema pero ninguna de las respuestas anteriores resuelva sus problemas, estaba teniendo el mismo problema y tuve más dificultades para rastrearlo ya que mis archivos de configuración eran correctos, mis trabajos ngnix y php-fpm funcionaban bien, y no hubo errores en los registros de errores.

Error tonto pero nunca verifiqué la variable de etiqueta abierta corta en mi archivo php.ini que estaba configurado en short_open_tag = Off. Como mis archivos php estaban usando en <?lugar de <?php, las páginas aparecían en blanco. La etiqueta de apertura corta debería haberse configurado Onen mi caso.

Espero que esto ayude a alguien.


2

La razón por la que ocurre este problema es porque las configuraciones fastcgi en nginx no funcionan como se requiere y en su lugar o procesamiento, responden como datos html. Hay dos formas posibles de configurar su nginx para evitar este problema.

  1. Método 1:

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # With php5-fpm:
                fastcgi_pass unix:/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi.conf;
        }
  2. Método 2:

    location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include snippets/fastcgi-php.conf;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
    }

Ambos métodos funcionarían correctamente, puede seguir adelante y tomar cualquiera de ellos. Casi realizan las mismas operaciones con muy pocas diferencias.


1
location ~ [^/]\.php(/|$) {
         fastcgi_pass unix:/PATH_TO_YOUR_PHPFPM_SOCKET_FILE/php7.0-fpm.sock;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}

Buena suerte


0

Ninguna de las respuestas anteriores funcionó para mí: PHP estaba representando todo correctamente, excepto las páginas que dependían de mysqli, para lo cual enviaba una página en blanco con un código de respuesta 200 y no arrojaba ningún error. Como estoy en OS X, la solución fue simplemente

sudo port install php56-mysql

seguido de un reinicio de PHP-FPM y nginx.

Estaba migrando de una configuración anterior de Apache / PHP a nginx, y no noté que la versión no coincidía en el controlador para php-mysqly php-fpm.


0

Tuve un problema similar, nginx estaba procesando una página a la mitad y luego se detenía. Ninguna de las soluciones sugeridas aquí funcionaba para mí. Lo arreglé cambiando el búfer nginx fastcgi:

fastcgi_max_temp_file_size 0;

fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;

Después de los cambios mi locationbloque se veía así:

location ~ \.php$ {
    try_files $uri /index.php =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_max_temp_file_size 0;
    fastcgi_buffer_size 4K;
    fastcgi_buffers 64 4k;
    include fastcgi_params;
}

Para más detalles, consulte https://www.namhuy.net/3120/fix-nginx-upstream-response-buffered-temporary-file-error.html


0

Si obtiene una pantalla en blanco, puede deberse a 2 razones:

  1. Navegador que bloquea la visualización de los marcos. En algunos navegadores, los marcos se consideran inseguros. Para superar esto, puede iniciar la versión sin marco de phpPgAdmin al

    http://-your-domain-name-/intro.php

  2. Ha habilitado una función de seguridad en Nginx para X-Frame-Options, intente deshabilitarla.


0

Esto resolvió mi problema:

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include snippets/fastcgi-php.conf;
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
}

0

Este es mi servidor virtual para UBUNTU 18.04 + apache + php7.2

server {
    listen 80;
    server_name test.test;
    root /var/www/html/{DIR_NAME}/public;
    location / {
        try_files $uri /index.php?$args;
    }
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }
}

La última línea lo hace diferente a las otras respuestas.


2
hay una respuesta aceptada con más de 200 votos - la pregunta es de 5 años de edad .. Yo personalmente no veo esta respuesta añadir mucho a la pregunta ..
treyBake

0

Tuve un error similar, pero en combinación con Nextcloud. Entonces, en caso de que esto no funcionó, intente: echar un vistazo al manual de Nginx .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.