Nginx 1 FastCGI mengirim dalam stderr: “Skrip primer tidak diketahui”

81

Pertama kali saya menggunakan Nginx, tapi saya lebih akrab dengan Apache dan Linux. Saya menggunakan proyek yang sudah ada dan kapan pun saya mencoba melihat index.php saya mendapatkan File 404 tidak ditemukan.

Inilah entri access.log:

2013/06/19 16:23:23 [error] 2216#0: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.ordercloud.lh"

Dan di sini adalah file yang tersedia di situs:

server {
    set $host_path "/home/willem/git/console/www";
    access_log  /www/logs/console-access.log  main;

    server_name  console.ordercloud;
    root   $host_path/htdocs;
    set $yii_bootstrap "index.php";

    charset utf-8;

    location / {
        index  index.html $yii_bootstrap;
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    location ~ ^/(protected|framework|themes/\w+/views) {
        deny  all;
    }

    #avoid processing of calls to unexisting static files by yii
    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
        try_files $uri =404;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php {
        fastcgi_split_path_info  ^(.+\.php)(.*)$;

        #let yii catch the calls to unexising PHP files
        set $fsn /$yii_bootstrap;
        if (-f $document_root$fastcgi_script_name){
            set $fsn $fastcgi_script_name;
        }

        fastcgi_pass   127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;

        #PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
    }

    location ~ /\.ht {
        deny  all;
    }
}

My / home / willem / git / console dimiliki oleh www-data: www-data (pengguna web saya yang menjalankan php dll) dan saya telah memberinya 777 izin karena frustrasi ...

Dugaan terbaik saya adalah ada sesuatu yang salah dengan konfigurasi, tapi saya tidak bisa mengetahuinya ...

PEMBARUAN Jadi saya memindahkannya ke /var/www/dan menggunakan konfigurasi yang jauh lebih mendasar:

server {
    #listen   80; ## listen for ipv4; this line is default and implied
    #listen   [::]:80 default ipv6only=on; ## listen for ipv6

    root /var/www/;
    index index.html index.htm;

    # Make site accessible from http://localhost/
    server_name console.ordercloud;

    location / {
        root           /var/www/console/frontend/www/;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www;
            include        fastcgi_params;
    }

    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
            try_files $uri =404;
        }

    location /doc/ {
        alias /usr/share/doc/;
        autoindex on;
        allow 127.0.0.1;
        deny all;
    }

}

Juga jika saya menelepon localhost/console/frontend/www/index.phpsaya mendapatkan 500 PHP yang artinya melayani di sana. Itu hanya tidak melayani dari console.ordercloud ...

We0
sumber
Penyebab lain yang mungkin: Jika Anda menggunakan php-fpm, pastikan pengguna menyetel di /etc/php-fpm.d/www.conf memiliki izin untuk skrip yang ingin dijalankan. Saya pikir ini default ke apache.
Dave
Kemungkinan lain yang menyebabkan SElinux Anda diaktifkan, periksa konfigurasi SElinux dan nonaktifkan.
CK.Nguyen
Saya baru saja mengganti Konfigurasi Host dari FCGId (jalankan sebagai pemilik server virtual) ke FPM (jalankan sebagai pemilik server virtual). Selain menginstal PhP 7.2-fpm, cli dan banyak lagi ...
PauloBoaventura

Jawaban:

92

Pesan kesalahan "skrip primer tidak diketahui" hampir selalu terkait dengan salah set SCRIPT_FILENAMEdalam fastcgi_paramdirektif nginx (atau izin salah, lihat jawaban lain).

Anda menggunakan ifdalam konfigurasi yang Anda posting pertama kali. Baik itu harus diketahui sekarang bahwa jika itu jahat dan sering menghasilkan masalah.

Mengatur rootarahan di dalam blok lokasi adalah praktik yang buruk, tentu saja itu berhasil.

Anda dapat mencoba sesuatu seperti berikut ini:

server {
    location / {
        location ~* \.php$ {
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass 127.0.0.1:9000;
            try_files $uri @yii =404;
        }
    }
    location @yii {
        fastcgi_param SCRIPT_FILENAME $document_root$yii_bootstrap;
    }
}

Harap dicatat bahwa konfigurasi di atas tidak teruji. Anda harus menjalankannya nginx -tsebelum menerapkannya untuk memeriksa masalah yang dapat segera dideteksi nginx.

Fleshgrinder
sumber
1
Ini menyelesaikannya untukku; Saya tidak tahu bahwa Anda harus awalan $ document_root, saya berasumsi itu melakukannya secara otomatis, berdasarkan root.
B01
3
Di mana orang dapat mempelajari lebih lanjut tentang praktik buruk pengaturan rootlokasi di dalam?
Dan Dascalescu
15
Bagi mereka yang tidak mengerti persis bagaimana variabel mungkin salah: menambah Nginx utama httpbagian berikut: log_format scripts '$document_root$fastcgi_script_name > $request';(atau apa pun yang Anda makan untuk SCRIPT_FILENAME), dan untuk Anda server: access_log /var/log/nginx/scripts.log scripts. Muat ulang dan lihat log skrip baru Anda;)
igorsantos07
3
Apa yii_bootstrap itu?
Love
43

Ini tidak selalu bahwa SCRIPT_FILENAMEsalah.
Mungkin juga PHP berjalan sebagai pengguna / grup yang salah .

Contoh ini khusus untuk Mac OS X , yang dalam pengalaman saya adalah yang paling sulit untuk diatur (Debian lebih mudah dibandingkan) - Saya baru saja memutakhirkan dari PHP 5.6 ke 7.0, menggunakan homebrew dan paket josegonzalez yang sangat baik.

Masalahnya adalah bahwa salinan baru dari file konfigurasi telah dibuat.

File konfigurasi utama adalah /usr/local/etc/php/7.0/php-fpm.conf, tetapi perhatikan bagian Pool Definition di bagian akhir di mana ia menyertakan seluruh subdirektori.

include=/usr/local/etc/php/7.0/php-fpm.d/*.conf

Di php-fpm.dsana ada www.conffile. Secara default ini memiliki:

user = _www
group = _www

Pada OS X, Anda mungkin perlu mengubahnya ke:

user = [your username]
group = staff

(Anda harus menemukan ini cocok dengan ls -lhdocument_root Anda)

Sayangnya tanpa perubahan ini, Anda masih akan melihat ini di log kesalahan Nginx Anda bahkan jika itu mencari file di tempat yang benar .

"Primary script unknown" while reading response header from upstream

Verifikasi apa yang sedang berjalan sebagai:

ps aux | grep 'php-fpm'

atau lebih bersih:

ps aux | grep -v root | grep php-fpm | cut -d\  -f1 | sort | uniq

Cara memverifikasi apakah nama file skrip benar:

(Dicuri dari igorsantos07 di jawaban lain)

Tambahkan ke httpblok utama /usr/local/etc/nginx/nginx.conf:

log_format scripts '$document_root$fastcgi_script_name > $request';

(di mana bit pertama harus berupa apa pun yang sedang Anda gunakan, sehingga Anda dapat melihat apakah itu benar.)

Dan untuk menggunakan log yang baru saja Anda tentukan, di serverblok situs Anda :

access_log /var/log/nginx/scripts.log scripts;

Jika benar, meminta example.com/phpinfo.php akan menghasilkan sesuatu seperti ini:

/path/to/docroot/phpinfo.php > GET /phpinfo.php

Bisakah Anda menyederhanakan konfigurasi yang ada?

Apakah Anda menggunakan location ~ \.php {blok yang Anda salin / tempel dari suatu tempat di internet? Sebagian besar paket memungkinkan Anda melakukannya dengan lebih cepat dan bersih. mis. pada OS X Anda sekarang hanya perlu ini:

location ~ \.php {
    fastcgi_pass 127.0.0.1:9000;
    include snippets/fastcgi-php.conf;

    # any site specific settings, e.g. environment variables
}

Hal-hal seperti fastcgi_split_path_info, try_files dan fastcgi_index (default ke index.php) ada di /usr/local/etc/nginx/snippets/fastcgi-php.conf.

Itu pada gilirannya termasuk /usr/local/etc/nginx/fastcgi.confyang merupakan daftar fastcgi_parampengaturan, termasuk SCRIPT_FILENAME yang penting.

Jangan pernah menggandakan rootdalam blok lokasi PHP.

William Turrell
sumber
2
sangat bagus! Apakah itu untuk saya! Salut kawan!
rollsappletree
Terima kasih. Bagi saya wadah docker fpm / nginx yang saya jalankan memiliki masalah izin mengakses folder ini.
Tek
@ Jawaban Fleshgrinder salah dan milikmu benar! Dalam kasus saya, memang, hanya masalah mengoreksi kepemilikan dalam /etc/php/7.0/php-fpm.d/www.conffile. Terima kasih, bud. :) Semakin banyak orang mungkin mulai melihat masalah ini juga karena popularitas gelandangan terus tumbuh.
user392778
tidak dapat menemukan apa pun di dalam /usr/local/etc/nginx/snippets/fastcgi-php.confpada mac saya .. tetapi saya menemukan/usr/local/etc/nginx/fastcgi.conf
abbood
Bagus !! Berjuang selama berjam
fonini
7

Ok, jadi 3 hal yang saya temukan setelah seharian berjuang

  1. Untuk beberapa alasan saya sudah memiliki sesuatu yang berjalan pada port 9000 jadi saya berubah menjadi 9001
  2. Situs default saya sedang mencegat yang baru, sekali lagi saya tidak mengerti mengapa karena tidak seharusnya, tapi saya hanya memutuskan tautannya
  3. Nginx tidak secara otomatis melakukan tautan sym untuk situs-tersedia untuk situs-diaktifkan.

Semoga ini menyelamatkan seseorang dari masalah!

We0
sumber
halo @ we0, saya menghadapi masalah yang sama dengan pengaturan saya. Saya juga menjalankan aplikasi saya yang lain di port 3001, jadi saya harus meng-host aplikasi php saya di port 3002. Anda dapat melihat posting asli saya di sini: stackoverflow.com/questions/33229867/… dan stackoverflow.com/questions/33409539/… dan yang lainnya adalah stackoverflow.com/questions/33519989/… . Apakah kamu punya ide?
Manish Sapkal
3
Secara otomatis membuat symlinks dari situs-tersedia ke situs-diaktifkan akan, baik, tidak diinginkan. Terserah Anda untuk membuat symlink tersebut sehingga Anda dapat mengontrol situs mana yang 'aktif' dan mana yang 'nonaktif' di server Anda.
Erathiel
6

Punya masalah yang sama dengan nginx yang lebih baru (v1.8). Versi yang lebih baru merekomendasikan menggunakan snippets/fastcgi-php.conf;bukan fastcgi.conf. Jadi, jika Anda menyalin / menempel include fastcgi.confdari tutorial, Anda mungkin berakhir dengan Primary script unknownkesalahan dalam log.

Dan Dascalescu
sumber
4

"Script primer tidak dikenal" disebabkan oleh konteks keamanan SELinux.

klien mendapat respons

Berkas tidak ditemukan.

nginx error.log memiliki pesan kesalahan berikut

* 19 FastCGI mengirim dalam stderr: "Skrip primer tidak diketahui" saat membaca tajuk respons dari hulu

jadi cukup ubah jenis konteks keamanan folder root web ke httpd_sys_content_t

chcon -R -t httpd_sys_content_t /var/www/show




ada 3 pengguna untuk konfigurasi nginx / php-fpm

/etc/nginx/nginx.conf

user nobody nobody;  ### `user-1`, this is the user run nginx woker process
...
include servers/*.conf;

/etc/nginx/conf.d/www.conf

location ~ \.php$ {
#   fastcgi_pass 127.0.0.1:9000;  # tcp socket
    fastcgi_pass unix:/var/run/php-fpm/fpm-www.sock;  # unix socket
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

/etc/php-fpm.d/www.conf

[www]
user = apache  ### `user-2`, this is the user run php-fpm pool process
group = apache

;listen = 127.0.0.1:9000  # tcp socket
listen = /var/run/php-fpm/fpm-www.sock  # unix socket

listen.onwer = nobody  ### `user-3`, this is the user for unix socket, like /var/run/php-fpm/fpm-www.sock
listen.group = nobody  # for tcp socket, these lines can be commented
listen.mode = 0660

user-1 dan user-2 tidak perlu sama.

untuk soket unix, pengguna-1 harus sama dengan pengguna-3, karena nginx fastcgi_pass harus memiliki izin baca / tulis pada soket unix.

jika tidak nginx akan mendapatkan 502 Bad Gateway , dan nginx error.log memiliki pesan kesalahan berikut

* 36 terhubung () ke unix: /var/run/php-fpm/fpm-www.sock gagal (13: Izin ditolak) saat terhubung ke hulu

dan pengguna / grup folder root web (/ var / www / show) tidak perlu sama dengan salah satu dari 3 pengguna ini.

PLA
sumber
2

Saya memiliki masalah ini juga, dan saya menyelesaikannya dengan bertukar garis include fastcgi_paramsdan fastcgi_param SCRIPT_FILENAME ....

Memang nginx menetapkan nilai terakhir dari setiap parameter FastCGI, jadi Anda harus meletakkan nilai Anda setelah nilai default dimasukkan dalam fastcgi_params.

Seb35
sumber
1

Saya memecahkan masalah ini dengan menutup SELINUX dalam sistem CentOS7.3

Langkah:

  • eksekutif setenforce 0
  • Anda juga perlu memodifikasi file konfigurasi

vim /etc/selinux/config set SELINUX to disabled

kent
sumber
0

Saya menemukan pertanyaan Anda mencari pesan kesalahan yang sama tetapi menggunakan apache + php-fpm (no nginx). Bagi saya, masalahnya adalah garis miring di tempat yang salah: banyak saran pengaturan menyertakan baris formulir:

SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost/:9000"

Dengan menempatkan garis miring terakhir setelah nomor port seperti:

SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost:9000/"

masalah menghilang untuk saya. Mungkin Anda bisa melakukan hal serupa

Kristen
sumber
0

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
0

Saya mengkloning situs jarak jauh, dan wp-config.php yang sudah ada memiliki info basis data server jarak jauh.

Saya menyelesaikan masalah ini dengan mengatur konfigurasi wordpress lokal saya, dengan info basis data lokal saya.

Shean Hoxie
sumber
0

Saya melakukan segalanya dari atas, kehilangan 2 jam membenturkan kepala dan masalah masih ada. Akhirnya saya lakukan:

sudo service php7.0-fpm restart

Dan biola berhasil!

Btw, saya sedang menyiapkan proyek symfony 3.4 baru dengan nginx conf dari tautan: https://symfony.com/doc/3.4/setup/web_server_configuration.html

Itu adalah kelima kalinya saya memulai proyek symfony baru dan saya tidak percaya "skrip Primer tidak dikenal" ini terjadi.

ermacmkx
sumber
0

Periksa izin untuk file kaus php-fpm Anda, entah bagaimana itu tidak dapat diakses:

chmod 755 /usr/local/var/run/php-fpm.sock

kemudian coba restart nginx.

spetsnaz
sumber
0

Saya telah terjebak oleh pesan aneh ini untuk waktu yang sangat lama. Saya tidak yakin tentang penyebabnya karena semuanya bekerja sebentar kemudian tiba-tiba berhenti bekerja.

Saya memperpendek URL wiki seperti yang ditentukan oleh MediaWiki, dengan Bitnami / Nginx di Lightsail.

Mencari dan membaca banyak posting, yang ini sepertinya merangkum semua skenario yang mungkin, dan saya mencoba semuanya:

  • nginx baik-baik saja, folder root php berfungsi, subfolder tidak
  • kesalahan dilemparkan sebagai 404 + string kosong "File tidak ditemukan", bukan oleh nginx
  • tambahkan rootke server, tidak berfungsi
  • periksa izin folder dan php-fpm / nginx, tidak ada root masalah dan subfolder yang sama
  • periksa manual php-fpm untuk interpretasi kode kesalahan, tidak dapat menemukannya
  • nyalakan log akses php-fpm, menemukan permintaan URI benar, tetapi 404 dikembalikan
  • coba nyalakan mode verbose / debug untuk php-fpm, tidak berfungsi, file log kesalahan yang seharusnya selalu kosong

Jadi saya harus mencoba pilihan terakhir, karena folder root php berfungsi dan subfolder tidak, satu-satunya perbedaan utama di antara mereka selain rootfolder root yang digunakan $request_filenamedan lokasi subfolder yang digunakan $document_rootdan $fastcgi_script_name, jadi saya mengubah pengaturan lokasi subfolder agar sesuai dengan folder root.

Kemudian berhasil ... saya masih tidak yakin mengapa itu berhasil. Karena ketika saya memeriksa log akses php-fpm saya melihat URI yang sama, satu adalah 404 dan yang lainnya 200.

masukkan deskripsi gambar di sini

Satu-satunya perbedaan adalah dalam konfigurasi. Karena mereka menghasilkan output yang sama, saya tidak tahu mengapa hasilnya berbeda.

Pokoknya saya memutuskan untuk memposting 2 sen saya di sini, semoga ini membantu.

PS: Saya benar-benar berharap PHP memberikan pesan kesalahan dan mode verbose yang lebih baik, karena ini benar-benar membuat frustrasi karena tidak dapat mengisolasi masalah dan tidak ada cara untuk melihat keluaran verbose dan info debug.

Dai
sumber
-1

Cobalah untuk menambahkan arahan root di dalam lokasi php Anda.

location ~ \.php {
      root /home/willem/git/console/www;
      ...
}
lg.
sumber
1
The rootdirektif harus ditetapkan pada per serversecara dan tidak boleh digunakan dalam setiap locationblok (kecuali Anda seorang profesional dan ingin menghindari beberapa bug nginx sangat istimewa dalam konfigurasi Anda).
Fleshgrinder
1
@Fleshgrinder satu root per server bukan praktik terbaik.
Garet Claborn
@Fleshgrinder Bukan itu yang dikatakan bagian yang ditautkan. Contoh praktik yang baik di bagian itu menunjukkan rootarahan di dalam locationblok.
ishigoya
@ishigoya silakan kunjungi lagi tautannya, banyak rootarahan di dalam banyak locationblok jelas di bawah judul BAD.
Fleshgrinder