Nginx + php5-fpm = "Datei nicht gefunden"

14

Ich bin gegen eine Wand gestoßen, als ich eine Site mit Nginx / Fpm eingerichtet habe. Die Seite zeigt "Datei nicht gefunden" an und dies wird in der Datei "nginx error.log" angezeigt:

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

Ich bin neu in Nginx und Fpm, und diese Fehlermeldung bedeutet nichts für mich (auch die Google-Maschine hat nicht geholfen!). Kann jemand Aufschluss darüber geben, was passieren könnte?

Mathew
quelle
Könnten Sie den Teil Ihrer Nginx-Konfiguration hinzufügen, in dem Sie das PHP-Handling definieren?
Christopher Perrin
Für mich hat der folgende Artikel geholfen: nginxlibrary.com/resolving-no-input-file-specified-error . Im Allgemeinen tritt dieser Fehler auf, wenn ein Problem mit dem vorliegt SCRIPT_FILENAME.
white_gecko

Antworten:

18

Sie sollten einen locationAbschnitt haben, um PHP-Anfragen zu behandeln, der ähnlich wie folgt konfiguriert ist:

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

(Das Extra try_filesbehebt eine Sicherheitslücke, durch die beliebige Dateien als PHP ausgeführt werden können.)

Außerdem sollte Ihr rootim serverAbschnitt der Konfigurationsdatei definiert werden, nicht im locationAbschnitt. Dies ist eine der häufigsten Fehlkonfigurationen von Nginx .

Michael Hampton
quelle
+1 für diesen Fehlkonfigurationsartikel - wirklich eine Lektüre wert, besonders wenn Sie Nginx lernen. Gut geschrieben, Einsteiger, mit einigen tollen Tipps!
Ben
2

Dies ist ein Hinweis für Passagierinstallationen.

Ich habe gerade Nginx von der Quelle über Passenger installiert, was ein Problem mit PHP5-FPM verursacht hat. Die Standarddatei nginx.conf nutzt das von Michael Hampton beschriebene Problem. Die Lösung besteht darin, den Block um die Root- und Index-Direktiven zu entfernen.

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

wird:

root html
index index.html index.htm

Außerdem ist der PHP-Block falsch eingerichtet. Siehe Michael Hamptons Antwort für den richtigen Weg.

Ein zusätzlicher Hinweis könnte sein, dass, wenn php5-fpm für die Verwendung von Sockets eingerichtet ist, der Parameter fastcgi_pass im PHP-Block in nginx.conf auf das Socket-Setup in /etc/php5/fpm/pool.d/www.conf verweist.

Kenneth
quelle
2

Ich hatte gerade dieses Problem in einer neuen Version von Nginx. (Konfiguration aus einer älteren Version)

Was ich tun musste, war, das include fastcgi_params;oben Gesagte SCRIPT_FILENAMEwie folgt zu platzieren:

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

Da SCRIPT_FILENAMEwurde das überschrieben.

kompliziert
quelle
1

Wenn Sie in Ihren Standortblöcken Aliase verwenden, kann dieses Verhalten auch bei einem nicht behandelten 404-Fehler auftreten. Sie können dies sehen, wenn die im Browser angezeigte Seite der einfache Text "Datei nicht gefunden" ist, im Gegensatz zu der hübscheren formatierten (zentrierten) nginx 404-Seite. Im Grunde bedeutet dies, dass die 404-Seite nicht gefunden werden kann.

Fügen Sie zum Lösen eine zusätzliche try_files $uri =404Zeile in Ihren Standortblock ein und laden Sie die nginx-Konfiguration neu. Zusätzlich zu den Aussagen von Michael Hampton zur Behebung einer bestimmten Sicherheitslücke kann der FastCGI-Handler die Aliasdefinition überschreiben und das 404-Skript am Standardspeicherort finden.

Radiumsuppe
quelle
1
sudo vim /etc/php-fpm.conf

über zeile 149, php benutzer && benutzergruppe ändern

Ich teste es jetzt erfolgreich.

Homeway
quelle
Das ist der richtige Weg! Hey Mann, du kannst es versuchen!
Liebe
Wenn Sie den Benutzer und die Gruppe ändern, vergessen Sie nicht, php-fpm neu zu starten. Wenn Sie centos6 verwenden, können Sie diesen Befehl verwenden: sudo service php-fpm restart
Love
0

Ich habe gesehen :

FastCGI gesendet in stderr: "Primäres Skript unbekannt" beim Lesen des Antwort-Headers vom Upstream

In einem Server, den ich beim Stresstest unter hohe Last gestellt habe. Mein noch zu bestätigender Verdacht ist, dass die verfügbaren Dateihandles des Betriebssystems erschöpft sind. In diesem Fall kann php-fpm keinen Verweis auf die Datei erhalten.

Mir ist klar, dass dies spekulativ ist, aber es passt mit Sicherheit zu meinem Szenario und könnte auch jemand anderem helfen.

Ian Lewis
quelle
0

Danke @homeway, deine Antwort inspiriert mich. Vielen Dank!

Ich treffe die gleiche Frage, aber eine andere Methode hat mir nicht geholfen, die Frage zu lösen!

Ich löse es, ich finde den Schlüssel ist, dass: Linux User Right zu der Frage führen: FastCGI in stderr gesendet: "Primärskript unbekannt"

Weil die PHP-FPM-Standardgruppe user: group apache: apache lautet. Ihr Code-Verzeichnis lautet jedoch someBody: someBody. Also solltest du das Userrecht ändern!

Ich schreibe ein Blog, um diese Frage zu lösen. Sie können dieses Blog sehen:

[Nginx FastCGI gesendet in stderr: "Primäres Skript unbekannt"] [1] `[1]: http://geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html

Liebe
quelle