nginx mostra pagine PHP vuote


164

Ho installato un server nginx con php5-fpm. Quando provo a caricare il sito ottengo una pagina vuota senza errori. Le pagine HTML sono servite bene ma non php. Ho provato ad attivare display_errors in php.ini ma senza fortuna. php5-fpm.log non sta producendo errori e nginx non lo è nemmeno.

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;
    }
}

MODIFICARE

ecco il mio registro errori 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
Apparentemente php-fpm non è stato chiamato da nginx, hai controllato il registro degli errori di nginx?
Adamsmith,

Controlla il mio aggiornamento sopra.
Mike Glaz,

L'errore nginx connect() failed ... fastcgi://127.0.0.1:9000contraddice la tua configurazione nginx, ricaricare la configurazione nginx?
Adamsmith,

Penso che sia giusto
Mike Glaz,

2
Sono davvero sorpreso dal fatto che questo sembra influenzare solo alcune migliaia di persone sul pianeta, poiché anche la configurazione predefinita nginx + php causa questa cosa.
Sliq,

Risposte:


250

Per riferimento, allego il mio locationblocco per la cattura di file con l' .phpestensione:

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;
}

Ricontrolla il /path/to/fastcgi-params, e assicurati che sia presente e leggibile dall'utente nginx.


3
la tua soluzione ne faceva parte. L'altra parte è qui wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Mike Glaz

154
l'ultima riga con "SCRIPT_FILENAME" ha funzionato per me :) grazie
Stijn Leenknegt

3
grazie, l'ultima riga ha funzionato (non è necessario quando si utilizza la versione 1.0 di nginx fornita con Centos). Mi piacerebbe vedere la documentazione su tutto ciò migliorare.
Jorre,

1
Prego, felice di sapere che aiuta ancora le persone dopo tutti questi anni. Tuttavia, tieni presente la risposta aggiornata di @ spacepile di seguito, che probabilmente è migliore.
Julian H. Lam,

2
Ho riscontrato lo stesso problema e la soluzione per me era aggiungere SCRIPT_FILENAME come descritto qui (senza la barra /). Ma ciò che mi ha fatto impazzire è perché ho davvero bisogno di farlo? Avevamo un'altra installazione di nginx (precedente alla 1.9) e lì questa linea non era necessaria. Ho trovato questo nginx.com/resources/wiki/start/topics/examples/phpfcgi e se lo confronti con i tuoi fastcgi_params vedrai che molto probabilmente non è lo stesso della versione online elencata e vedrai che SCRIPT_FILENAME non c'è. Perché? Vai a capire ...
Daniel Dimitrov,

342

sostituire

include fastcgi_params;

con

include fastcgi.conf;

e rimuovi fastcgi_param SCRIPT_FILENAME ... in nginx.conf


17
Questo mi ha risolto. L' .confha una configurazione aggiuntiva parametro mancante da _params.
Malvineous,

7
Questo (e, ovviamente, /etc/init.d/nginx restart) anche risolto per me su Debian Testing dopo un nginxaggiornamento del 10 settembre 2014.
severin,

6
Questo è stato risolto anche per me dopo aver aggiornato nginx alla 1.6.2 (aggiornamento di settembre 2014). Devo amare gli aggiornamenti che rompono le cose in modo casuale.
Mahn,

30
Ecco il retroscena del fastcgi_paramsvs fastcgi.conf: blog.martinfjordvald.com/2013/04/…
Levite,

4
Questo codice non funziona - non so perché; Questo codice funziona, non so perché. mi hai salvato diverse ore.
Alex,

54

Ha avuto anche questo problema e finalmente ho trovato la soluzione qui . In breve, è necessario aggiungere la seguente riga al file di configurazione nginx fastcgi (/ etc / nginx / fastcgi_params in Ubuntu 12.04)

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
Grazie mille, questo è stato risolto su Ubuntu 12.04 LTS.
Valentin Klinghammer,

2
Risolto anche per me dopo aver aggiornato nginx 1.5.4 -> 1.7.4. Grazie mille!
trisweb,

4
Ha funzionato su Ubuntu 14.04.
agenda del

1
Risolto durante l'aggiornamento da Debian Wheezy (7.8) a Jessie (8) e da Nginx 1.2.1-2.2 a 1.6.2-5. Grazie enormi.
William Turrell,

1
A quanto ho capito, dice a FastCGI dove sono i file che devono servire. PATH_TRANSLATED accetta l'URI della richiesta, quindi "lo traduce" nel punto in cui si trova il file effettivo sul server. Per esempio. PATH_TRANSLATED per test.com/index.php potrebbe essere /var/www/index.php
Constant Meiring il

44

Molti utenti rientrano in questa discussione aspettandosi di trovare una soluzione per la visualizzazione di pagine vuote durante l'utilizzo di nginx + php-fpm , di cui sono uno di loro. Questo è un riassunto di quello che ho finito dopo aver letto molte delle risposte qui oltre alle mie indagini (aggiornato a php7.2):

1) Aprire /etc/php/7.2/fpm/pool.d/www.confe verificare il valore del parametro listen.

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

2) Il parametro listendeve corrispondere al fastcgi_passparametro nel file di configurazione del sito (i, e:) /etc/nginx/sites-enabled/default.

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

3) Verifica che il file esista effettivamente:

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

4) Se non esiste, significa che php7.2-fpm non è in esecuzione, quindi è necessario riavviarlo:

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


Per quanto riguarda la locationsezione in /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;
   }

Verifica che il file snippets/fastcgi-php.confesista nella posizione /etc/nginx/:

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

Questo file contiene un elenco di definizioni variabili richieste da php7.2-fpm. Le variabili sono definite direttamente o tramite l'inclusione di un file separato.

 include fastcgi.conf;

Questo file si trova in /etc/nginx/fastcgi.confe sembra:

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

nginx include due possibili file di parametri: fastcgi_params e fastcgi.conf . La differenza tra entrambi è la definizione di variabile SCRIPT_FILENAME:

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

Per farla breve, fastcgi.conf dovrebbe sempre funzionare. Se per qualche motivo che stai configurando utilizza fastcgi_params , dovresti definire 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;
}

Ora ricarica la configurazione di nginx:

$ sudo nginx -s reload

E controlla che un file php sia visualizzato correttamente. Per esempio:

/var/www/html/test.php

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

Dov'è /var/www/htmlil percorso della radice del documento.

Se, nonostante tutto questo, si sta ancora vedendo un file vuoto, assicurarsi che il proprio php.iniè short_open_tagattivato (se si sta testando una pagina PHP con brevi tag).


1
Grazie Diego! fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;Finalmente il trucco.
danger89,

Il file include fastcgi.conf ha contribuito a risolvere tutto
Rytis Lukoševičius,

1
ripartizione fantastica! Mi mancava la configurazione SCRIPT_FILENAME, questo ha fatto sì che funzionasse
herval

1
quando ho aggiunto SCRIPT_FILENAME a quella configurazione, di nuovo tutto è fallito con "file not found"
holms

Che dire della lunga storia, perché ci sono due inclusioni e una non funziona immediatamente?
Il padrino,

24

Assicurati di avere questo in / etc / nginx / fastcgi_params

fastcgi_param SCRIPT_FILENAME $ request_filename;

Chissà perché questo non c'è già? Il tempo che deve perdere collettivamente!


1
+1 Un vantaggio apparente di "fastcgi_param SCRIPT_FILENAME $ request_filename;" è diverso da "$ document_root / $ fastcgi_script_name", "$ request_filename" adatta il percorso alla direttiva "alias" di Nginx. Vedi: nginx.org/en/docs/http/ngx_http_core_module.html#variables , nginx.org/en/docs/http/ngx_http_core_module.html#alias e il blog di Martin Fjordvald citato da Levit sopra ( blog.martinfjordvald.com/2013 / 04 /… ). Nel mio blocco di posizione, ha risolto il problema della pagina vuota con php71-fpm e Nginx installato con Homebrew su El Capitan.
Slack Undertow

15

Ho scritto un breve programma C che restituisce le variabili d'ambiente passate da nginx all'applicazione 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;
}

Salvalo in un file, ad es fcgi_debug.c

Per compilarlo, prima installa gcce libfcgi-devpoi esegui:

gcc -o fcgi_debug fcgi_debug.c -lfcgi

Per eseguirlo, installa spawn-fcgi, quindi esegui:

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

Quindi, modifica la configurazione di nginx fcgi per puntare al programma di debug:

fastcgi_pass  127.0.0.1:3000;

Riavvia nginx, aggiorna la pagina e dovresti vedere tutti i parametri visualizzati nel tuo browser per il debug! :-)


1
Nota, hai bisogno di header e spawn-fcgi. Su Debian / Ubuntu puoi farlo apt-get install spawn-fcgi libfcgi-dev.
pevik,

8

Questi suggerimenti mi hanno aiutato con la mia installazione di Ubuntu 14.04 LTS,

Inoltre, avevo bisogno di attivare l' short_open_tagingresso/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

Questo risolto dall'installazione Ubuntu di goccioline DO. Grazie
Andrew

Questo è stato risolto per me dopo aver installato nginx 1.9.4
Ajeeb.KP il

6

Aggiungi questo in /etc/nginx/conf.d/default.conf:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
Ti dispiacerebbe fornire un po 'più di dettaglio su quale sia esattamente il problema di OP e su come la tua risposta risolva il problema di OP?
wookie919,

1
Ciò ha risolto lo stesso problema per me su Ubuntu 15.04 con nginx 1.8.0 e php-fpm 5.6.4-4ubuntu6. Mi piacerebbe sapere cosa sta effettivamente facendo e perché non è incluso nel file di configurazione predefinito nginx, ma sono almeno felice di averlo ora codificato in un file Docker.
James Williams,

Mettere il valore nel /etc/nginx/fastcgi_paramsfile sarebbe più appropriato, credo.
Arda,

4

Nel caso in cui qualcuno stia riscontrando questo problema ma nessuna delle risposte precedenti risolva i propri problemi, stavo avendo lo stesso problema e ho avuto il tempo più difficile rintracciarlo poiché i miei file di configurazione erano corretti, i miei lavori ngnix e php-fpm funzionavano bene, e non si sono verificati errori durante il log degli errori.

Errore stupido ma non ho mai controllato la variabile Short Open Tag nel mio file php.ini che era impostata su short_open_tag = Off. Dato che i miei file php stavano usando <?invece di <?php, le pagine si stavano mostrando vuote. OnNel mio caso avrebbe dovuto essere impostato Short Open Tag .

Spero che questo aiuti qualcuno.


2

Il motivo per cui si verifica questo problema è perché le configurazioni fastcgi in nginx non funzionano come richiesto e sul posto o in elaborazione, rispondono come dati HTML. Esistono due modi per configurare nginx per evitare questo problema.

  1. Metodo 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. Metodo 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;
    }

Entrambi i metodi funzionerebbero correttamente, puoi andare avanti e prenderne uno qualsiasi. Eseguono quasi le stesse operazioni con pochissime differenze.


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;
}

In bocca al lupo


0

Nessuna delle risposte di cui sopra ha funzionato per me - PHP stava eseguendo correttamente il rendering di tutto tranne le pagine che si basavano su mysqli, per le quali stava inviando una pagina vuota con un codice di 200 risposte e non generando errori. Dato che sono su OS X, la correzione è stata semplicemente

sudo port install php56-mysql

seguito da un riavvio di PHP-FPM e nginx.

Stavo migrando da una versione precedente di Apache / PHP a nginx e non ho notato la mancata corrispondenza della versione nel driver per php-mysqle php-fpm.


0

Ho avuto un problema simile, nginx stava elaborando una pagina a metà strada quindi si fermava. Nessuna delle soluzioni suggerite qui funzionava per me. L'ho risolto modificando il buffering nginx fastcgi:

fastcgi_max_temp_file_size 0;

fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;

Dopo le modifiche il mio locationblocco sembrava:

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;
}

Per i dettagli, consultare https://www.namhuy.net/3120/fix-nginx-upstream-response-buffered-temporary-file-error.html


0

Se ricevi uno schermo vuoto, ciò potrebbe essere dovuto a 2 motivi:

  1. Browser che blocca la visualizzazione dei frame. In alcuni browser i frame sono considerati non sicuri. Per ovviare a questo, puoi avviare la versione frameless di phpPgAdmin di

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

  2. Hai abilitato una funzione di sicurezza in Nginx per X-Frame-Options, prova a disabilitarla.


0

Questo ha risolto il mio 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

Questo è il mio vhost per 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;
    }
}

L'ultima riga la rende diversa dalle altre risposte.


2
c'è una risposta accettata con oltre 200 voti - la domanda ha 5 anni .. Personalmente non vedo questa risposta aggiungendo molto alla domanda ..
treyBake

0

Ho avuto un errore simile, ma in combinazione con Nextcloud. Quindi, nel caso in cui non funzionasse, prova: dai un'occhiata al manuale di Nginx .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.