Nginx + php5-fpm = “File tidak ditemukan”

14

Saya telah menabrak dinding saat menyiapkan situs menggunakan nginx / fpm. Halaman ini menampilkan "File tidak ditemukan", dan ini muncul di nginx error.log:

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

Saya baru mengenal nginx dan fpm, dan pesan kesalahan itu tidak ada artinya bagi saya (bahkan mesin google belum membantu!). Adakah yang bisa menjelaskan apa yang mungkin terjadi?

Mathew
sumber
Bisakah Anda menambahkan bagian dari konfigurasi nginx Anda di mana Anda mendefinisikan penanganan PHP?
Christopher Perrin
Bagi saya artikel berikut ini membantu: nginxlibrary.com/resolving-no-input-file-specified-error . Umumnya kesalahan ini muncul jika ada masalah dengan SCRIPT_FILENAME.
white_gecko

Jawaban:

18

Anda harus memiliki locationbagian untuk menangani permintaan PHP yang dikonfigurasi mirip dengan ini:

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

(Ekstra try_filesmenyelesaikan kerentanan keamanan yang dapat memungkinkan file sewenang-wenang dieksekusi sebagai PHP.)

Selain itu, Anda rootharus didefinisikan dalam serverbagian dari file konfigurasi, tidak dengan locationbagian. Ini adalah salah satu kesalahan konfigurasi nginx yang paling umum .

Michael Hampton
sumber
+1 untuk artikel konfigurasi yang salah - sangat layak dibaca, terutama jika Anda sedang belajar Nginx. Ditulis dengan baik, level pemula, dengan beberapa tips hebat!
Ben
2

Ini adalah catatan untuk pemasangan penumpang.

Saya baru saja menginstal nginx dari sumber via penumpang yang menyebabkan masalah dengan php5-fpm. Nginx.conf default menggunakan masalah yang dijelaskan oleh Michael Hampton. Solusinya adalah dengan menghapus blok di sekitar arahan root dan indeks, jadi:

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

menjadi:

root html
index index.html index.htm

Selanjutnya blok php tidak diatur dengan benar. Lihat jawaban Michael Hamptons untuk cara yang benar.

Catatan tambahan bisa berupa bahwa jika php5-fpm diatur untuk menggunakan soket arahkan parameter fastcgi_pass di blok php di nginx.conf ke pengaturan soket di /etc/php5/fpm/pool.d/www.conf.

Kenneth
sumber
2

Saya baru saja mengalami masalah ini di versi baru nginx. (konfigurasi diambil dari versi yang lebih lama)

Yang harus saya lakukan adalah menempatkan include fastcgi_params;kebiasaan saya di atas SCRIPT_FILENAMEseperti ini:

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

Ketika SCRIPT_FILENAMEsedang ditimpa.

complistic
sumber
1

Jika Anda menggunakan alias di blok lokasi Anda, kesalahan 404 yang tidak ditangani juga dapat menunjukkan perilaku ini. Anda dapat melihat ini jika halaman yang ditampilkan di browser adalah teks sederhana "File not found" sebagai kebalikan dari halaman yang diformat lebih cantik (tengah) nginx 404. Pada dasarnya, itu benar-benar mengatakan halaman 404 tidak dapat ditemukan.

Untuk menyelesaikannya, tambahkan try_files $uri =404baris tambahan di blok lokasi Anda dan muat ulang konfigurasi nginx. Selain apa yang dikatakan Michael Hampton tentang penyelesaian kerentanan keamanan tertentu , ini juga memungkinkan pengendali fastcgi untuk mengganti definisi alias dan menemukan skrip 404 di lokasi default.

radiumsoup
sumber
1
sudo vim /etc/php-fpm.conf

tentang baris 149, ubah pengguna php && grup pengguna

Saya mengujinya sukses sekarang.

jalan raya
sumber
Ini jalan yang benar! Hei teman, kamu bisa mencobanya!
Love
Ketika Anda mengubah pengguna dan grup, Anda jangan lupa untuk me-restart php-fpm. Jika Anda menggunakan centos6 Anda dapat menggunakan perintah ini: sudo service php-fpm restart
Love
0

Saya sudah melihat :

FastCGI mengirim dalam stderr: "Script primer tidak diketahui" saat membaca header respons dari hulu

di server saya ditempatkan di bawah beban tinggi saat stress testing. Kecurigaan saya, masih harus dikonfirmasi, adalah bahwa file menangani yang tersedia dari OS habis. Dalam hal ini php-fpm tidak bisa mendapatkan referensi ke file.

Saya menyadari ini spekulatif tetapi tentu saja cocok dengan skenario saya dan mungkin juga membantu orang lain.

Ian Lewis
sumber
0

Terima kasih @ homeway, jawaban Anda menginspirasi saya. Terima kasih banyak!

Saya memenuhi pertanyaan yang sama, Tapi Metode lain tidak membantu saya menyelesaikan pertanyaan!

Saya mengatasinya, saya menemukan kuncinya adalah: Linux User Right mengarah ke pertanyaan: FastCGI mengirim dalam stderr: "Script primer tidak diketahui"

Karena Pengguna default PHP-FPM: grup adalah apache: apache, Tapi kode Anda dir someBody: someBody. Jadi, Anda harus mengubah Pengguna dengan benar!

Saya menulis blog untuk menyelesaikan pertanyaan ini, Anda dapat melihat blog ini:

[Nginx FastCGI mengirim dalam stderr: "Skrip primer tidak diketahui"] [1] `[1]: http://geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html

Cinta
sumber