Nginx 1 FastCGI stderr'de gönderildi: “Birincil komut dosyası bilinmiyor”


81

İlk kez Nginx kullanıyorum, fakat Apache ve Linux'a aşina değilim. Varolan bir projeyi kullanıyorum ve ne zaman index.php'yi görmeye çalışıyorum 404 Dosya bulunamadı.

İşte access.log girişi:

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"

Ve burada siteler kullanılabilir dosya:

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

/ Home / willem / git / konsolum www-data'ya aittir: www-data (php çalıştıran web kullanıcım) vb.

En iyi tahminim, yapılandırmada bir sorun olduğu, ancak çözemiyorum ...

GÜNCELLEME Böylece taşıdım /var/www/ve çok daha temel bir config kullandım:

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

}

Ayrıca ararsam localhost/console/frontend/www/index.php500 PHP alıyorum, bu da orada hizmet ettiği anlamına geliyor. Sadece konsoldan ibaret değil. Ordercloud ...


Başka bir olası neden: php-fpm kullanıyorsanız, /etc/php-fpm.d/www.conf dosyasındaki kullanıcının çalıştırmaya çalıştığı komut dosyası için izinleri olduğundan emin olun. Apache'nin varsayılan olduğunu düşünüyorum.
Dave,

SElinux'unuzun etkin olmasına neden olan başka bir neden, SElinux yapılandırmasını kontrol edin ve devre dışı bırakın.
CK.Nguyen

Host Konfigürasyonumu FCGId'den (sanal sunucu sahibi olarak çalıştırın) FPM'ye (sanal sunucu sahibi olarak çalıştırın) değiştirdim. PhP 7.2-fpm, cli ve daha fazlasını kurmanın yanı sıra ...
PauloBoaventura

Yanıtlar:


92

“Temel komut dosyası bilinmiyor” hata mesajı, hemen hemen her zamanSCRIPT_FILENAME nginx fastcgi_paramyönergesinde yanlış ayarlanmış (veya yanlış izinler, diğer cevaplara bakınız) ile ilgilidir.

ifİlk gönderdiğiniz yapılandırmada bir kullanıyorsunuz . Şey, şimdi bilinmesi gerekir ki, eğer kötüyse ve sık sık sorun çıkarır.

Yönergeyi rootbir yer bloğu içinde belirlemek elbette işe yaramazsa kötü bir uygulamadır.

Aşağıdaki gibi bir şey deneyebilirsiniz:

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

Lütfen yukarıdaki konfigürasyonun test edilmediğini unutmayın. nginx -tNginx'in hemen tespit edebileceği sorunları kontrol etmek için uygulamadan önce çalıştırmalısınız .


1
Bu benim için çözmek; $ Document_root önekini kullanmanız gerektiğinin farkında değildim, bunu kökten temel alarak otomatik olarak yaptığını varsaydım.
b01

3
Kişi, rootmekanı yerleştirmenin kötü uygulaması hakkında nereden daha fazla bilgi edinebilir ?
Dan Dascalescu

15
Ana Nginx eklemek: değişken yanlış olabilir tam olarak nasıl anlamıyorum olanlar için httpaşağıdaki bölümde: log_format scripts '$document_root$fastcgi_script_name > $request';(veya her ne SCRIPT_FILENAME'e besliyorsun) ve gözünü için server: access_log /var/log/nginx/scripts.log scripts. Yeniden yükle ve yeni script günlüklerine bir göz at;)
igorsantos07


3
Yii_bootstrap nedir?
Aşk

43

O değil her zaman bu SCRIPT_FILENAMEyanlış.
Ayrıca, PHP yanlış kullanıcı / grup olarak çalışıyor olabilir .

Bu örnek benim deneyimime göre kurulum konusunda en zor olan Mac OS X'e özgüdür (Debian, karşılaştırmaya göre kolay) - Homebrew ve mükemmel josegonzalez paketlerini kullanarak PHP 5.6'dan 7.0'a yükselttim .

Sorun, config dosyalarının yeni bir kopyasının yaratılmasıydı.

Ana yapılandırma dosyası /usr/local/etc/php/7.0/php-fpm.conf, ancak sonunda tüm alt dizinin bulunduğu Havuz Tanımları bölümüne dikkat edin .

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

İçinde php-fpm.dbir www.confdosya var. Varsayılan olarak bu:

user = _www
group = _www

OS X'te, bunu şu şekilde değiştirmeniz gerekebilir:

user = [your username]
group = staff

(bunu, doküman_ kökünüzün biriyle eşleştirmelisiniz ls -lh)

Ne yazık ki bu değişiklik olmadan , dosyayı doğru yerde arasa bile, bunu Nginx hata günlüğünüzde göreceksiniz .

"Primary script unknown" while reading response header from upstream

Şu anda çalıştığını doğrulayın:

ps aux | grep 'php-fpm'

veya daha temiz:

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

Komut dosyası dosya adının doğru olup olmadığı nasıl doğrulanır:

(diğer cevabında igorsantos07'den çalınmış)

httpAna bloğa ekle /usr/local/etc/nginx/nginx.conf:

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

(ilk bitin, şu anda kullanmakta olduğunuz şey olması gerektiği yerde, doğru olup olmadığını görebilirsiniz.)

Ayrıca, tanımladığınız günlüğü sitenizin serverbloğunda kullanmak için:

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

Doğruysa, example.com/phpinfo.php istemek, bunun gibi bir şey üretecektir:

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

Mevcut konfigürasyonunuzu basitleştirebilir misiniz?

location ~ \.php {İnternet dışından bir yere kopyaladığınız / yapıştırdığınız bir blok mu kullanıyorsunuz ? Çoğu paket daha hızlı ve temiz bir şekilde yapmanıza izin verir. örneğin, OS X'te şimdi sadece şuna ihtiyacınız var:

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

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

Fastcgi_split_path_info, try_files ve fastcgi_index (index.php varsayılanları) gibi şeyler içeridedir /usr/local/etc/nginx/snippets/fastcgi-php.conf.

Bu, /usr/local/etc/nginx/fastcgi.confhangisi fastcgi_paramSCRIPT_FILENAME için gerekli ayarları içeren bir ayar listesi içeriyor .

rootPHP konum bloğunda hiçbir zaman kopyalama yapmayın .


2
çok hoş! benim için öyleydi! Şerefe arkadaşlar!
rollsappletree

Teşekkürler. Benim için yürüttüğüm fpm / nginx liman konteynerleri bu klasörlere erişim izni aldı.
Tek

@ Fleshgrinder'in cevabı yanlış ve sizinki de doğru! Benim durumumda, aslında, sadece/etc/php/7.0/php-fpm.d/www.conf dosyadaki sahipliğini düzeltme meselesiydi . Şerefe, kanka. :) Çok sayıda insan bu sorunu görmeye başlayabilir ve serser popülaritesi artmaya devam eder.
user392778 16:17

/usr/local/etc/nginx/snippets/fastcgi-php.conf/usr/local/etc/nginx/fastcgi.conf
Mac'imde

Güzel!! Saatlerce uğraşıyor
fonini

7

Tamam, mücadele dolu bir günden sonra bulduğum 3 şey

  1. Nedense zaten 9000 numaralı limanda çalışan bir şeyim vardı ve 9001'e döndüm.
  2. Varsayılan sitem yeni siteme müdahale ediyordu, bir kez daha durmamalı, neden olmasın diye durmam
  3. Nginx, sitelerin erişebileceği siteler için sym bağlantısını otomatik olarak yapmaz.

Umarım bu birileri bir sorun yaratır!


merhaba @ we0, kurulumumla aynı sorunla karşılaştım. Ayrıca port 3001 benim başka bir uygulamayı çalıştıran, bu yüzden burada benim orijinal yayını görebilen port 3002 benim php app barındırmak zorunda: stackoverflow.com/questions/33229867/... ve stackoverflow.com/questions/33409539/... ve bir başkası stackoverflow.com/questions/33519989/… . Herhangi bir fikrin var mı?
Manish Sapkal

3
Otomatik olarak sembolik bağlantıları sitelerden kullanılabilir sitelere etkin hale getirmek, istenmeyen bir durum olacaktır. Bu bağlantıları yapmak size bağlıdır, böylece hangi sitelerin 'açık' olduğunu ve hangilerinin sunucunuzda 'kapalı' olduğunu kontrol edebilirsiniz.
Erathiel

6

Daha yeni bir nginx ile aynı problemi yaşadım (v1.8). Yeni sürümler snippets/fastcgi-php.conf;yerine kullanılmasını tavsiye eder fastcgi.conf. Bu nedenle include fastcgi.conf, bir öğreticiden kopyaladığınızda / yapıştırdığınızda Primary script unknown, günlükte hatayı bulabilirsin.


4

"Birincil komut dosyası bilinmiyor" SELinux güvenlik bağlamından kaynaklanıyor .

müşteri cevap almak

Dosya bulunamadı.

nginx error.log aşağıdaki hata iletisine sahip

* 19 FastCGI stderr'de gönderildi: "Üst komut dosyası bilinmiyor" yanıtını yukarı akıştan okurken

bu yüzden web kök klasörünün güvenlik bağlamı türünü httpd_sys_content_t olarak değiştirin.

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




nginx / php-fpm config için 3 kullanıcı var.

/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

kullanıcı-1 ve kullanıcı-2 aynı olmak zorunda değildir.

unix soketi için, kullanıcı-1, kullanıcı-3 ile aynı olmalıdır , çünkü nginx fastcgi_pass, unix soketinde okuma / yazma iznine sahip olmalıdır.

Aksi takdirde, nginx 502 hatalı ağ geçidi alır ve nginx error.log aşağıdaki hata iletisine sahiptir

* 36 bağlantı () unix'e: /var/run/php-fpm/fpm-www.sock başarısız oldu (13: İzin reddedildi) giriş yönüne bağlanırken

ve web kök klasörünün kullanıcısı / grubu (/ var / www / show), bu 3 kullanıcının hiçbiriyle aynı olması için gerekli değildir.


2

Ben de bu sorunu vardı ve ben çizgiler alışverişi bunu çözmüş include fastcgi_paramsve fastcgi_param SCRIPT_FILENAME ....

Aslında nginx, her bir FastCGI parametresinin son değerini belirler, bu nedenle fastcgi_params içindeki varsayılan değerden sonra değerinizi girmeniz gerekir.


1

SELOS’u CentOS7.3 sisteminde kapatarak bu sorunu çözdüm

adımlar:

  • exec setenforce 0
  • U ayrıca config dosyasını değiştirmeli

vim /etc/selinux/config set SELINUX to disabled


0

Sorunuzu aynı hata mesajını ararken buldum ama apache + php-fpm (nginx yok) kullanarak. Benim için sorun yanlış yerde eğik çizgi oldu: birçok kurulum önerisinde formun bir satırı var:

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

Son eğik çizgiyi aşağıdaki gibi port numarasının arkasına koyarak:

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

sorun benim için ortadan kalktı. Belki benzer bir şey yapabilirsin


0

Aynı soruyu karşıladım, ancak Diğer yöntem soruyu çözmeme yardımcı olmadı!

Çözdüğümde, anahtarın şu olduğunu düşünüyorum: Linux Kullanıcı Hakkı soruyu sorar: FastCGI stderr: "Birincil komut dosyası bilinmiyor"

Çünkü varsayılan PHP-FPM kullanıcısı: group apache: apache, Ama kod dir, someBody: someBody. Yani Kullanıcı hakkını değiştirmelisiniz!

Bu soruyu çözmek için bir blog yazarım, Bu blogu görebilirsiniz:

[Nginx FastCGI stderr'de gönderildi: "Birincil komut dosyası bilinmiyor" "[1]` [1]: http://geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html


0

Uzak bir siteyi klonladım ve zaten var olan wp-config.php uzak sunucu veritabanı bilgisine sahipti.

Bu sorunu yerel wordpress yapılandırmamı kurarak, yerel veritabanı bilgim ile çözdüm.


0

Yukarıdaki her şeyi yaptım, kafamı çarparken 2 saatimi kaybettim ve sorun devam etti. Sonunda yaptım:

sudo service php7.0-fpm restart

Ve viyola işe yaradı!

Btw, linkten nginx conf ile taze symfony 3.4 projesi hazırlıyordum: https://symfony.com/doc/3.4/setup/web_server_configuration.html

Bu benim beşinci zamanımın yeni symfony projesine başlama zamanımdı ve bu "bilinmeyen birincil senaryonun" olduğuna inanamadım.


0

Php-fpm çorap dosyanızın izinlerini kontrol edin, nedense erişilebilir değildi:

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

sonra nginx'i yeniden başlatmayı deneyin.


0

Uzun zamandır bu garip mesajla tuzağa düştüm. Sebebi hakkında emin değilim çünkü her şey bir süre çalıştı, sonra aniden durdu.

Mediaail'in yazdığı wiki URL'lerini Lightsail'de Bitnami / Nginx ile kısaltıyordum.

Birçok gönderiyi aradım ve okudum, bu olası tüm senaryoları özetliyor gibi görünüyor, ben hepsini denedim:

  • nginx gayet iyi, kök klasör php çalışıyor, alt klasör değil
  • 404 +, "nginx değil
  • eklemek rootsunucuya işe yaramadı
  • Klasörlerin ve php-fpm / nginx izinlerini kontrol edin, sorun yok ve alt klasörler aynı
  • hata kodu yorumu için php-fpm el kitabını kontrol edin, birini bulamadınız mı?
  • php-fpm erişim günlüğünü açar, istek URI'sinin doğru olduğunu buldu, ancak 404 döndürüldü
  • php-fpm için ayrıntılı / hata ayıklama modunu açmayı deneyin, işe yaramadı, sözde hata günlüğü dosyası her zaman boş

Bu yüzden, son klasörü denemek zorunda kaldım, çünkü kök klasör php çalışıyordu ve alt klasörler yoktu, aralarındaki tek büyük fark rootkullanılan kök klasör $request_filenameve alt klasör konumları kullanılmış $document_rootve $fastcgi_script_namebu yüzden alt klasör konum ayarlarını kök klasör alanlarıyla eşleşecek şekilde değiştirdim.

Sonra işe yaradı ... Neden işe yaradığından hala emin değilim . Çünkü php-fpm erişim günlüğünü kontrol ettiğimde aynı URI'yi görüyorum, biri 404 diğeri 200 idi.

görüntü tanımını buraya girin

Tek fark konfigürasyondaydı. Aynı çıktıyı ürettikleri için, sonucun neden farklı çıktığını bilmiyorum.

Her neyse, buraya 2 kuruş göndermeye karar verdim, umarım bu yardımcı olur.

Not: PHP'nin daha iyi hata mesajları ve ayrıntılı modlar sunmasını umuyorum, çünkü bu gerçekten problemi izole edememek ve ayrıntılı çıktı ve hata ayıklama bilgilerini görmenin bir yolu olmamak gerçekten sinir bozucu.


-1

PHP konumunuza kök yönergesi eklemeye çalışın.

location ~ \.php {
      root /home/willem/git/console/www;
      ...
}

1
rootYönerge başına ayarlanmış olmalıdır servertemelinde ve herhangi içinde kullanılmamalıdır location(tam bir uzmansınız ve yapılandırmasında bazı çok özel nginx hata aşmak istemiyorsanız) bloklar.
Etli öğütücü

1
@ Fleshgrinder sunucu başına bir kök en iyi yöntem değildir.
Garet Claborn,


@ Fleshgrinder Bağlantılı bölümün söylediği şey bu değil. Bu bölümde iyi uygulama örneği rootbir locationblok içinde bir yönerge gösterir .
ishigoya,

@ishigoya lütfen bağlantıyı tekrar ziyaret edin, rootçoklu locationblokların içindeki çoklu direktifler açıkça BAD başlığı altındadır.
Etli öğütücü
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.