Nginx zeigt leere PHP-Seiten

164

Ich habe einen Nginx-Server mit PHP5-Fpm eingerichtet. Wenn ich versuche, die Site zu laden, wird eine leere Seite ohne Fehler angezeigt. HTML-Seiten werden gut serviert, aber nicht PHP. Ich habe versucht, display_errors in der php.ini einzuschalten, aber kein Glück. php5-fpm.log erzeugt keine Fehler und nginx auch nicht.

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

BEARBEITEN

Hier ist mein Nginx-Fehlerprotokoll:

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"
Mike Glaz
quelle
1
Anscheinend wurde php-fpm nicht von nginx aufgerufen. Haben Sie das Fehlerprotokoll von nginx überprüft?
Adamsmith
Überprüfen Sie mein Update oben.
Mike Glaz
Der Nginx-Fehler connect() failed ... fastcgi://127.0.0.1:9000widerspricht Ihrer Nginx-Konf. Nginx-Konf neu laden?
Adamsmith
Ich denke das ist richtig.
Mike Glaz
2
Ich bin wirklich überrascht, dass dies nur einige tausend Menschen auf dem Planeten betrifft, da selbst die Standardkonfiguration von nginx + php dieses Problem verursacht.
Sliq

Antworten:

249

Als Referenz füge ich meinen locationBlock zum Abfangen von Dateien mit der .phpErweiterung hinzu:

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

Überprüfen Sie das /path/to/fastcgi-paramsund stellen Sie sicher, dass es für den Nginx-Benutzer vorhanden und lesbar ist.

Julian H. Lam
quelle
3
Ihre Lösung war ein Teil davon. Der andere Teil ist hier wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Mike Glaz
153
Die letzte Zeile mit 'SCRIPT_FILENAME' hat den Trick für mich gemacht :) Danke
Stijn Leenknegt
3
Vielen Dank, diese letzte Zeile hat den Trick gemacht (sie wird nicht benötigt, wenn die 1.0-Version von Nginx verwendet wird, die mit Centos geliefert wird). Ich würde gerne sehen, wie sich die Dokumentation zu all dem verbessert.
Jorre
1
Gern geschehen, froh zu wissen, dass es den Menschen nach all den Jahren immer noch hilft. Bitte beachten Sie jedoch die aktualisierte Antwort von @ spacepile unten, die wahrscheinlich besser ist.
Julian H. Lam
2
Ich bin auf dasselbe Problem gestoßen und die Lösung für mich bestand darin, den SCRIPT_FILENAME wie hier beschrieben hinzuzufügen (ohne den Schrägstrich /). Aber was mich verrückt gemacht hat ist, warum ich das eigentlich tun muss? Wir hatten eine andere Nginx-Installation (älter als 1.9) und dort war diese Zeile nicht notwendig. Ich habe dieses nginx.com/resources/wiki/start/topics/examples/phpfcgi gefunden , und wenn Sie es mit Ihren fastcgi_params vergleichen, werden Sie feststellen, dass es höchstwahrscheinlich nicht mit der aufgelisteten Online-Version identisch ist und dass SCRIPT_FILENAME angezeigt wird ist nicht da drin. Warum ist das? Go figure ...
Daniel Dimitrov
342

ersetzen

include fastcgi_params;

mit

include fastcgi.conf;

und entferne fastcgi_param SCRIPT_FILENAME ... in nginx.conf

Raumpille
quelle
17
Das hat es für mich behoben. Dem .conffehlt ein zusätzlicher Konfigurationsparameter _params.
Malvineous
7
Dies (und natürlich /etc/init.d/nginx restart) hat es auch für mich bei Debian Testing nach einem nginxUpgrade am 10. September 2014 behoben .
Severin
6
Dies wurde auch für mich behoben, nachdem nginx auf 1.6.2 aktualisiert wurde (Update vom September 2014). Ich muss Updates lieben, die Dinge zufällig kaputt machen.
Mahn
30
Hier ist die Hintergrundgeschichte von fastcgi_paramsvs fastcgi.conf: blog.martinfjordvald.com/2013/04/…
Levite
4
Dieser Code funktioniert nicht - ich weiß nicht warum; Dieser Code funktioniert, ich weiß nicht warum. Du hast mich mehrere Stunden gerettet.
Alex
54

Hatte auch dieses Problem und fand hier endlich die Lösung . Kurz gesagt, Sie müssen die folgende Zeile zu Ihrer nginx fastcgi-Konfigurationsdatei hinzufügen (/ etc / nginx / fastcgi_params in Ubuntu 12.04).

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
Ständiges Meiring
quelle
2
Vielen Dank, dies hat es auf Ubuntu 12.04 LTS behoben.
Valentin Klinghammer
2
Auch für mich nach dem Upgrade von nginx 1.5.4 -> 1.7.4 behoben. Ich danke dir sehr!
Trisweb
4
Arbeitete unter Ubuntu 14.04.
Zeitplan
1
Behoben beim Upgrade von Debian Wheezy (7.8) auf Jessie (8) und von Nginx 1.2.1-2.2 auf 1.6.2-5. Enormer Dank.
William Turrell
1
Soweit ich weiß, teilt es fastcgi mit, wo sich die Dateien befinden, die bereitgestellt werden sollen. PATH_TRANSLATED nimmt den Anforderungs-URI und "übersetzt" ihn dann in die Stelle, an der sich die eigentliche Datei auf dem Server befindet. Z.B. PATH_TRANSLATED für test.com/index.php könnte /var/www/index.php sein
Constant Meiring
44

Viele Benutzer fallen in diesen Thread und erwarten, eine Lösung für leere Seiten zu finden, die bei Verwendung von nginx + php-fpm angezeigt werden. Ich bin einer von ihnen. Dies ist eine Zusammenfassung dessen, was ich getan habe, nachdem ich viele der Antworten hier und meine eigenen Untersuchungen gelesen hatte (aktualisiert auf php7.2):

1) Öffnen /etc/php/7.2/fpm/pool.d/www.confund überprüfen Sie den Wert des Parameters listen.

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

2) Der Parameter listensollte mit dem fastcgi_passParameter in Ihrer Site-Konfigurationsdatei übereinstimmen (i, e :) /etc/nginx/sites-enabled/default.

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

3) Überprüfen Sie, ob die Datei tatsächlich vorhanden ist:

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

4) Wenn es nicht existiert, bedeutet dies , dass php7.2-fpm nicht ausgeführt wird. Sie müssen es daher neu starten:

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


In Bezug auf den locationAbschnitt 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;
   }

Überprüfen Sie, ob die Datei snippets/fastcgi-php.confam Speicherort vorhanden ist /etc/nginx/:

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

Diese Datei enthält eine Liste der Variablendefinitionen, die für php7.2-fpm erforderlich sind. Die Variablen werden direkt oder durch Einschließen einer getrennten Datei definiert.

 include fastcgi.conf;

Diese Datei befindet sich unter /etc/nginx/fastcgi.confund sieht aus wie folgt :

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

nginx enthält zwei mögliche Parameterdateien: fastcgi_params und fastcgi.conf . Der Unterschied zwischen beiden ist die Definition der Variablen SCRIPT_FILENAME:

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

Um es kurz zu machen, fastcgi.conf sollte immer funktionieren. Wenn Sie aus irgendeinem Grund fastcgi_params verwenden , sollten Sie Folgendes definieren 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;
}

Laden Sie nun die Nginx-Konfiguration neu:

$ sudo nginx -s reload

Und überprüfen Sie, ob eine PHP-Datei korrekt angezeigt wird. Zum Beispiel:

/var/www/html/test.php

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

Wo /var/www/htmlist der Pfad zum Dokumentstamm?

Wenn trotz alledem immer noch eine leere Datei angezeigt wird, stellen Sie sicher, dass php.inidiese short_open_tagaktiviert ist (wenn Sie eine PHP-Seite mit kurzen Tags testen).

Diego Pino
quelle
1
Danke Diego! fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;Hab den Trick endlich gemacht.
Gefahr89
Das Include fastcgi.conf hat geholfen, alles zu beheben
Rytis Lukoševičius
1
Super Zusammenbruch! Ich habe die SCRIPT_FILENAME-Konfiguration vermisst, dies hat funktioniert
herval
1
Wenn ich SCRIPT_FILENAME zu dieser Konfiguration hinzugefügt habe, ist wieder alles mit "Datei nicht gefunden"
fehlgeschlagen
Was ist mit der langen Geschichte, warum gibt es zwei Includes und eines funktioniert nicht sofort?
Der Pate
24

Stellen Sie sicher, dass Sie dies in / etc / nginx / fastcgi_params haben

fastcgi_param SCRIPT_FILENAME $ request_filename;

Wer weiß, warum das nicht schon da ist? Die Zeit, die dies gemeinsam verschwenden muss!

Tim
quelle
1
+1 Ein scheinbarer Vorteil von "fastcgi_param SCRIPT_FILENAME $ request_filename;" Im Gegensatz zu "$ document_root / $ fastcgi_script_name" passt "$ request_filename" den Pfad an die Nginx-Direktive "alias" an. Siehe: nginx.org/en/docs/http/ngx_http_core_module.html#variables , nginx.org/en/docs/http/ngx_http_core_module.html#alias und Martin Fjordvalds Blog, der oben von Levit zitiert wurde ( blog.martinfjordvald.com/2013) / 04 /… ). In meinem Standortblock wurde das Problem mit leeren Seiten mit php71-fpm und Nginx behoben, die mit Homebrew auf El Capitan installiert wurden.
Slack Undertow
15

Ich habe ein kurzes C-Programm geschrieben, das die von nginx an die fastCGI-Anwendung übergebenen Umgebungsvariablen zurückgibt.

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

Speichern Sie dies in einer Datei, z fcgi_debug.c

Um es zu kompilieren, installieren Sie zuerst gccund führen Sie libfcgi-devdann Folgendes aus:

gcc -o fcgi_debug fcgi_debug.c -lfcgi

Um es auszuführen, installieren Sie es spawn-fcgiund führen Sie dann Folgendes aus:

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

Ändern Sie dann Ihre nginx fcgi-Konfiguration so, dass sie auf das Debug-Programm verweist:

fastcgi_pass  127.0.0.1:3000;

Starten Sie nginx neu, aktualisieren Sie die Seite und Sie sollten alle Parameter in Ihrem Browser sehen, damit Sie debuggen können! :-)

tu-Reinstate Monica-dor duh
quelle
1
Beachten Sie, dass Sie Header und spawn-fcgi benötigen. Auf Debian / Ubuntu können Sie es bekommen apt-get install spawn-fcgi libfcgi-dev.
Pevik
8

Diese Hinweise halfen mir bei der Installation von Ubuntu 14.04 LTS.

Darüber hinaus musste ich auf dem einzuschalten short_open_tagin/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
CNSKnight
quelle
Dies wurde durch DO Droplet Ubuntu Installation behoben. Vielen Dank
Andrew
Dies wurde für mich nach der Installation von nginx 1.9.4
Ajeeb.KP
6

Fügen Sie dies hinzu in /etc/nginx/conf.d/default.conf:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
nomulex
quelle
2
Würde es Ihnen etwas ausmachen, etwas näher zu erläutern, was genau das Problem von OP ist und wie Ihre Antwort das Problem von OP löst?
Wookie919
1
Dies löste das gleiche Problem für mich unter Ubuntu 15.04 mit nginx 1.8.0 und php-fpm 5.6.4-4ubuntu6. Ich würde gerne wissen, was dies tatsächlich tut und warum es nicht in der Standard-Nginx-Konfigurationsdatei enthalten ist, aber ich bin zumindest froh, dass ich es jetzt in einer Docker-Datei kodifiziert habe.
James Williams
Den Wert in eine /etc/nginx/fastcgi_paramsDatei zu setzen wäre meiner Meinung nach richtiger.
Arda
4

Falls jemand dieses Problem hat, aber keine der oben genannten Antworten seine Probleme löst, hatte ich das gleiche Problem und hatte es am schwersten, es aufzuspüren, da meine Konfigurationsdateien korrekt waren, meine Jobs ngnix und php-fpm einwandfrei liefen und Es sind keine Fehler durch Fehlerprotokolle aufgetreten.

Ein dummer Fehler, aber ich habe die Variable Short Open Tag in meiner php.ini-Datei, die auf eingestellt war, nie überprüft short_open_tag = Off. Da meine PHP-Dateien <?anstelle von verwendet wurden <?php, wurden die Seiten leer angezeigt. Short Open Tag sollte Onin meinem Fall eingestellt sein.

Hoffe das hilft jemandem.

McLovin
quelle
2

Der Grund für dieses Problem liegt darin, dass die FastCGI-Konfigurationen in Nginx nicht wie erforderlich funktionieren und an Ort und Stelle oder bei der Verarbeitung als HTML-Daten reagieren. Es gibt zwei Möglichkeiten, wie Sie Ihren Nginx konfigurieren können, um dieses Problem zu vermeiden.

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

Beide Methoden würden richtig funktionieren, Sie können fortfahren und eine von ihnen nehmen. Sie führen fast die gleichen Operationen mit sehr wenigen Unterschieden aus.

Manish M Demblani
quelle
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;
}

Viel Glück

gounane
quelle
0

Keine der oben genannten Antworten funktionierte für mich - PHP hat alles richtig gerendert, außer Seiten, die auf mysqli beruhten, für die es eine leere Seite mit einem 200-Antwortcode sendete und keine Fehler auslöste. Da ich unter OS X bin, war das Update einfach

sudo port install php56-mysql

gefolgt von einem Neustart von PHP-FPM und Nginx.

Ich habe von einem älteren Apache / PHP-Setup auf nginx migriert und die Versionsinkongruenz im Treiber für php-mysqlund nicht bemerkt php-fpm.

jczaplew
quelle
0

Ich hatte ein ähnliches Problem, Nginx verarbeitete eine Seite zur Hälfte und hielt dann an. Keine der hier vorgeschlagenen Lösungen funktionierte für mich. Ich habe es behoben, indem ich die nginx fastcgi-Pufferung geändert habe:

fastcgi_max_temp_file_size 0;

fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;

Nach den Änderungen locationsah mein Block so aus:

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

Weitere Informationen finden Sie unter https://www.namhuy.net/3120/fix-nginx-upstream-response-buffered-temporary-file-error.html

Mugoma J. Okomba
quelle
0

Wenn Sie einen leeren Bildschirm erhalten, kann dies zwei Gründe haben:

  1. Browser blockiert die Anzeige der Frames. In einigen Browsern gelten die Frames als unsicher. Um dies zu überwinden, können Sie die rahmenlose Version von phpPgAdmin von starten

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

  2. Sie haben eine Sicherheitsfunktion in Nginx für X-Frame-Optionen aktiviert und versuchen, sie zu deaktivieren.

Nahid Ali
quelle
0

Dies löste mein Problem:

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;
}
Ruberandinda Geduld
quelle
0

Dies ist mein vhost für 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;
    }
}

Die letzte Zeile unterscheidet sich von den anderen Antworten.

Witek Bezgin
quelle
2
Es gibt eine akzeptierte Antwort mit mehr als 200 Stimmen - die Frage ist 5 Jahre alt. Ich persönlich sehe nicht, dass diese Antwort der Frage viel hinzufügt.
treyBake
0

Ich hatte einen ähnlichen Fehler, aber in Kombination mit Nextcloud. Falls dies nicht funktioniert hat, versuchen Sie Folgendes: Sehen Sie sich das Nginx-Handbuch an .

DeDenker
quelle