Nginx + php5-fpm = „Nie znaleziono pliku”

14

Uderzyłem w ścianę podczas konfigurowania strony przy użyciu nginx / fpm. Strona wyświetla komunikat „Nie znaleziono pliku”, który pojawia się w pliku nginx error.log:

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

Jestem nowy zarówno w Nginx, jak i fpm, a ten komunikat o błędzie nic dla mnie nie znaczy (nawet maszyna google nie pomogła!). Czy ktoś może rzucić jakieś światło na to, co może się dziać?

Mathew
źródło
Czy możesz dodać część konfiguracji nginx, w której definiujesz obsługę PHP?
Christopher Perrin
Pomógł mi następujący artykuł: nginxlibrary.com/resolving-no-input-file-specified-error . Ogólnie ten błąd występuje, jeśli występuje problem z SCRIPT_FILENAME.
white_gecko

Odpowiedzi:

18

Powinieneś mieć locationsekcję do obsługi żądań PHP skonfigurowaną podobnie do tego:

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

(Dodatek try_filesusuwa lukę w zabezpieczeniach, która może umożliwić wykonanie dowolnych plików jako PHP.)

Ponadto, twój rootpowinna być zdefiniowana w serversekcji pliku konfiguracyjnego, nielocation przekroju. Jest to jedna z najczęstszych błędów konfiguracji nginx .

Michael Hampton
źródło
+1 za artykuł o błędnych konfiguracjach - naprawdę warto przeczytać, szczególnie jeśli uczysz się Nginx. Dobrze napisany, podstawowy, z kilkoma świetnymi wskazówkami!
Ben
2

To uwaga dla instalacji pasażerskich.

Właśnie zainstalowałem nginx ze źródła przez pasażera, co spowodowało problem z php5-fpm. Domyślny plik nginx.conf korzysta z problemu opisanego przez Michaela Hamptona. Rozwiązaniem jest usunięcie bloku wokół dyrektyw root i index, aby:

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

staje się:

root html
index index.html index.htm

Ponadto blok php jest nieprawidłowo skonfigurowany. Zobacz odpowiedź Michaela Hamptonsa na właściwą drogę.

Dodatkowa uwaga może być taka, że ​​jeśli php5-fpm jest skonfigurowany do używania gniazd, wskaż parametr fastcgi_pass w bloku php w nginx.conf do ustawień gniazd w /etc/php5/fpm/pool.d/www.conf.

Kenneth
źródło
2

Właśnie miałem ten problem w nowej wersji nginx. (konfiguracja pochodzi ze starszej wersji)

To, co musiałem zrobić, to umieścić include fastcgi_params;wyżej mój zwyczaj w SCRIPT_FILENAMEnastępujący sposób:

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

W SCRIPT_FILENAMEtrakcie nadpisywania.

komplementarny
źródło
1

Jeśli używasz aliasów w blokach lokalizacji, nieobsługiwany błąd 404 może również wykazywać to zachowanie. Możesz to zobaczyć, jeśli strona wyświetlana w przeglądarce jest prostym tekstem „Nie znaleziono pliku” w przeciwieństwie do ładniej sformatowanej (wyśrodkowanej) strony nginx 404. Zasadniczo mówi to, że nie można znaleźć strony 404.

Aby rozwiązać, dodaj dodatkową try_files $uri =404linię do bloku lokalizacji i ponownie załaduj konfigurację nginx. Oprócz tego, co powiedział Michael Hampton o rozwiązaniu określonej luki w zabezpieczeniach , pozwala to również programowi obsługi fastcgi na przesłonięcie definicji aliasu i znalezienie skryptu 404 w domyślnej lokalizacji.

zupa radowa
źródło
1
sudo vim /etc/php-fpm.conf

o linii 149, zmień php user && user group

Testuję to teraz pomyślnie.

homeway
źródło
To jest właściwy sposób! Hej, możesz spróbować!
Miłość
Kiedy zmieniasz użytkownika i grupę, nie zapomnij zrestartować php-fpm. Jeśli używasz centos6, możesz użyć tego polecenia: sudo service php-fpm restart
Love
0

Widziałem :

FastCGI wysłał stderr: „Główny skrypt nieznany” podczas odczytywania nagłówka odpowiedzi z góry

na serwerze postawiłem pod dużym obciążeniem podczas testów warunków skrajnych. Podejrzewam, że muszę jeszcze potwierdzić, że wyczerpały się dostępne uchwyty plików z systemu operacyjnego. W takim przypadku php-fpm nie może uzyskać odniesienia do pliku.

Zdaję sobie sprawę, że jest to spekulacyjne, ale z pewnością pasuje do mojego scenariusza i może również pomóc komuś innemu.

Ian Lewis
źródło
0

Dzięki @homeway, Twoja odpowiedź mnie inspiruje. Dziękuję Ci bardzo!

Spełniam to samo pytanie, ale inna metoda nie pomogła mi rozwiązać pytania!

Rozwiązuję to, uważam, że kluczem jest: Linux User Right prowadzi do pytania: FastCGI wysłany w stderr: „Podstawowy skrypt nieznany”

Ponieważ domyślnym użytkownikiem PHP-FPM: grupa jest apache: apache, ale katalogiem kodu jest someBody: someBody. Dlatego powinieneś zmienić prawo użytkownika!

Piszę blog, aby rozwiązać to pytanie. Możesz zobaczyć tego bloga:

[Nginx FastCGI wysłany w stderr: „Podstawowy skrypt nieznany”] [1] „[1]: http://geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html

Miłość
źródło