nginx que muestra páginas PHP en blanco


Answers

reemplazar

include fastcgi_params;

con

include fastcgi.conf;

y elimine fastcgi_param SCRIPT_FILENAME ... en nginx.conf

Question

Configuré un servidor nginx con php5-fpm. Cuando intento cargar el sitio, aparece una página en blanco sin errores. Las páginas HTML se publican bien, pero no php. Intenté encender display_errors en php.ini pero no tuve suerte. php5-fpm.log no está produciendo ningún error y tampoco 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 error 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"



Ninguna de las respuestas anteriores funcionó para mí: PHP estaba procesando todo, excepto las páginas que dependían de mysqli, para lo cual enviaba una página en blanco con un código de respuesta de 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 me di cuenta de que la versión no coincide en el controlador para php-mysql y php-fpm .




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

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;



Muchos usuarios caen en este hilo esperando encontrar una solución para las páginas en blanco que se muestran al usar nginx + php5-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:

1) Abra /etc/php5/fpm/pool.d/www.conf y verifique el valor de la location del parámetro.

location = /var/run/php5-fpm.sock

2) La location parámetro debe coincidir fastcgi_pass parámetro fastcgi_pass en su archivo nginx.conf .

fastcgi_pass unix:/var/run/php5-fpm.sock;

3) Verifique que el archivo realmente exista:

$ file /var/run/php5-fpm.sock
/var/run/php5-fpm.sock: socket

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

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


Con respecto a la sección de location :

location ~ \.php$ {
    include fastcgi_params;
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
}

Comprueba que el archivo fastcgi_params existe en la ubicación /etc/nginx/ :

$ file /etc/nginx/fastcgi_params 
/etc/nginx/fastcgi_params: ASCII text

En general, este archivo contiene una lista de definiciones de variables requeridas por php5-fpm:

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 la variable SCRIPT_FILENAME :

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

Para abreviar, fastcgi.conf siempre debería funcionar. Si por algún motivo está utilizando fastcgi_params , debe definir SCRIPT_FILENAME :

location ~ \.php$ {
    include fastcgi_params;
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
}

Ahora recarga la configuración de nginx:

$ sudo nginx -s reload

Y compruebe que un archivo php se muestra correctamente. Por ejemplo:

/var/www/html/test.php

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

Donde /var/www/html es la ruta a la raíz del documento.




La razón por la que ocurre este problema es porque las configuraciones de fastcgi en nginx no funcionan como se requiere y están en su lugar o procesando, responden como datos html. Hay dos formas posibles en que puede 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, puedes seguir y tomar uno de ellos. Casi realizan las mismas operaciones con muy poca diferencia.




Escribí un programa corto 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 instala gcc y libfcgi-dev , luego ejecuta:

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 la 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 verá todos los parámetros en su navegador para que pueda depurarlos. :-)




Esto se solucionó 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;
}