सवाल Nginx 1 FastCGI stderr में भेजा गया: "प्राथमिक लिपि अज्ञात"


मेरा पहला समय Nginx का उपयोग कर रहा है, लेकिन मैं अपाचे और लिनक्स से परिचित हूं। मैं एक मौजूदा प्रोजेक्ट का उपयोग कर रहा हूं और जब भी मैं index.php को देखने की कोशिश कर रहा हूं मुझे 404 फ़ाइल नहीं मिली है।

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"

और यहां साइट-उपलब्ध फ़ाइल है:

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

मेरा / घर / विलेम / गिट / कंसोल का स्वामित्व www-data: www-data (मेरा वेब उपयोगकर्ता php आदि चला रहा है) और मैंने इसे निराशा से 777 अनुमतियां दी हैं ...

मेरा सबसे अच्छा अनुमान यह है कि कॉन्फ़िगरेशन में कुछ गड़बड़ है, लेकिन मैं इसे समझ नहीं सकता ...

अद्यतन करें तो मैंने इसे स्थानांतरित कर दिया /var/www/ और एक और अधिक बुनियादी विन्यास का उपयोग किया:

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

}

अगर मैं फोन करता हूं localhost/console/frontend/www/index.php मुझे एक 500 PHP मिलता है जिसका अर्थ है कि यह वहां परोसा जा रहा है। यह सिर्फ console.ordercloud सेवारत नहीं कर रहा है ...


58
2018-06-20 08:33


मूल


एक अन्य संभावित कारण: यदि आप php-fpm का उपयोग कर रहे हैं, तो सुनिश्चित करें कि उपयोगकर्ता /etc/php-fpm.d/www.conf में सेट की गई स्क्रिप्ट के लिए अनुमतियां हैं जो इसे चलाने का प्रयास कर रही हैं। मुझे लगता है कि यह अपाचे के लिए डिफ़ॉल्ट है। - Dave
एक और संभावित कारण है कि आपका सेलिनक्स सक्षम है, चेकआउट SELINux कॉन्फ़िगर करें और इसे अक्षम करें। - CK.Nguyen


जवाब:


त्रुटि संदेश "प्राथमिक स्क्रिप्ट अज्ञात" है ज्यादातर हमेशा एक गलत सेट से संबंधित है SCRIPT_FILENAME nginx में fastcgi_param निर्देश (या गलत अनुमतियां, अन्य उत्तरों देखें)।

आप एक का उपयोग कर रहे हैं if कॉन्फ़िगरेशन में आपने पहले पोस्ट किया था। वैसे यह अब तक अच्छी तरह से जाना जाना चाहिए अगर बुरा है और अक्सर समस्याएं पैदा करता है।

सेट करना root एक स्थान ब्लॉक के भीतर निर्देश खराब अभ्यास है, बेशक यह काम करता है।

आप निम्न की तरह कुछ कोशिश कर सकते हैं:

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

कृपया ध्यान दें कि उपरोक्त कॉन्फ़िगरेशन अनचाहे है। आपको निष्पादित करना चाहिए nginx -t nginx तुरंत पता लगाने वाली समस्याओं की जांच करने के लिए इसे लागू करने से पहले।


80
2018-06-20 16:50



यह मेरे लिए हल करता है; मुझे पता नहीं था कि आपको $ document_root उपसर्ग करना था, मैंने माना कि यह रूट पर आधारित स्वचालित रूप से ऐसा करता है। - b01
सेटिंग स्थापित करने के बुरे अभ्यास के बारे में कोई और कहां से सीख सकता है root स्थान के भीतर? - Dan Dascalescu
उन लोगों के लिए जो समझ में नहीं आता कि चर कैसे गलत हो सकता है: मुख्य Nginx में जोड़ें http निम्नलिखित खंड: log_format scripts '$document_root$fastcgi_script_name > $request'; (या जो भी आप SCRIPT_FILENAME को खिला रहे हैं), और आपके लिए server: access_log /var/log/nginx/scripts.log scripts। पुनः लोड करें और अपनी नई स्क्रिप्ट लॉग पर नज़र डालें;) - igorsantos07
हां यकीनन: nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/... - Fleshgrinder
Yii_bootstrap क्या है? - Love


यह हमेशा कि SCRIPT_FILENAME गलत है।
यह भी हो सकता है PHP गलत उपयोगकर्ता / समूह के रूप में चल रहा है

यह उदाहरण विशिष्ट है मैक ओएस एक्स, जो मेरे अनुभव में सेटअप करने के लिए सबसे परेशानी है (तुलनात्मक रूप से डेबियन आसान है) - मैंने अभी PHP 5.6 से 7.0 तक अपग्रेड किया है homebrew और उत्कृष्ट josegonzalez संकुल।

समस्या यह थी कि कॉन्फ़िगरेशन फ़ाइलों की एक नई प्रति बनाई गई थी।

मुख्य विन्यास फाइल है /usr/local/etc/php/7.0/php-fpm.conf, लेकिन ध्यान दें पूल परिभाषाएं अंत में अनुभाग जहां यह एक संपूर्ण उपनिर्देशिका शामिल है।

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

में php-fpm.d वहां एक www.conf फ़ाइल। डिफ़ॉल्ट रूप से यह है:

user = _www
group = _www

ओएस एक्स पर, आपको इसे यहां बदलने की आवश्यकता हो सकती है:

user = [your username]
group = staff

(आपको यह मैच एक मिलना चाहिए ls -lh आपके document_root का)

दुर्भाग्य से इस परिवर्तन के बिना, आप इसे अभी भी अपने Nginx त्रुटि लॉग में देखेंगे भले ही यह सही जगह पर फ़ाइल की तलाश में है

"Primary script unknown" while reading response header from upstream

सत्यापित करें कि यह वर्तमान में क्या चल रहा है:

ps aux | grep 'php-fpm'

या अधिक स्वच्छता से:

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

स्क्रिप्ट फ़ाइल नाम सही है या नहीं, यह कैसे सत्यापित करें:

(दूसरे जवाब में igorsantos07 से चोरी)

में जोड़े http मुख्य ब्लॉक /usr/local/etc/nginx/nginx.conf:

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

(जहां पहली बार जो भी आप वर्तमान में उपयोग कर रहे हैं, वही होना चाहिए, ताकि आप देख सकें कि यह सही है या नहीं।)

और उस लॉग का उपयोग करने के लिए जिसे आपने अभी परिभाषित किया है, आपकी साइट में server ब्लॉक:

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

यदि यह सही है, तो example.com/phpinfo.php का अनुरोध करने से कुछ ऐसा होगा:

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

क्या आप अपनी मौजूदा कॉन्फ़िगरेशन को सरल बना सकते हैं?

क्या आप एक का उपयोग कर रहे हैं location ~ \.php { इंटरनेट से कहीं से कॉपी / पेस्ट किया गया ब्लॉक? अधिकांश पैकेज आपको इसे अधिक तेज़ी से और साफ करने की अनुमति देते हैं। जैसे ओएस एक्स पर अब आपको इसकी आवश्यकता है:

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 और fastcgi_index (index.php पर डिफ़ॉल्ट) में हैं /usr/local/etc/nginx/snippets/fastcgi-php.conf

बदले में इसमें शामिल हैं /usr/local/etc/nginx/fastcgi.conf जो की एक सूची है fastcgi_param महत्वपूर्ण SCRIPT_FILENAME समेत सेटिंग्स।

कभी नकल मत करो root PHP स्थान ब्लॉक में।


34
2018-02-06 00:11



बहुत अच्छा! वह मेरे लिए था! चीयर्स दोस्त! - rollsappletree
धन्यवाद। मेरे लिए fpm / nginx डॉकर कंटेनर जो चल रहा था, इन फ़ोल्डरों तक पहुंचने की अनुमति समस्या थी। - Tek
@ Fleshgrinder का जवाब है गलत और तुम्हारा सही है! मेरे मामले में यह वास्तव में था, केवल में स्वामित्व को सही करने का मामला /etc/php/7.0/php-fpm.d/www.conf फ़ाइल। आप के लिए चीयर्स, कली। :) कई लोग इस मुद्दे को भी देखना शुरू कर सकते हैं क्योंकि वानर लोकप्रियता बढ़ती जा रही है। - user392778
अंदर कुछ भी नहीं मिला /usr/local/etc/nginx/snippets/fastcgi-php.conf मेरे मैक पर .. लेकिन मुझे मिला /usr/local/etc/nginx/fastcgi.conf - abbood


ठीक है, तो संघर्ष के एक दिन के बाद मुझे 3 चीजें मिलीं

  1. किसी कारण से मैं पोर्ट 9000 पर पहले से ही कुछ चल रहा था इसलिए मैं 9 001 में बदल गया
  2. मेरी डिफ़ॉल्ट साइट मेरे नए एक को रोक रही थी, एक बार फिर मैं नहीं करता स्टैंड के तहत क्यों नहीं होना चाहिए, लेकिन मैंने इसे अभी अनलिंक किया है
  3. Nginx स्वचालित रूप से साइट्स के लिए sym लिंक नहीं करता है-के लिए उपलब्ध है साइट-सक्षम।

उम्मीद है कि यह किसी को कुछ परेशानी बचाता है!


6
2018-06-20 10:00



हैलो @ वी 0, मुझे अपने सेटअप के साथ एक ही समस्या का सामना करना पड़ रहा है। मैंने पोर्ट 3001 पर अपना दूसरा एप भी चलाया है, इसलिए मुझे पोर्ट 3002 पर अपना PHP एप होस्ट करना होगा। आप यहां मेरी मूल पोस्ट देख सकते हैं: stackoverflow.com/questions/33229867/... तथा stackoverflow.com/questions/33409539/... और दूसरा है stackoverflow.com/questions/33519989/...। क्या तुम्हारे पास कोई विचार है? - Manish Sapkal
साइट्स से स्वचालित रूप से सिम्लिंक बनाना-साइट-सक्षम के लिए उपलब्ध, ठीक है, अवांछनीय होगा। उन सिम्लिंक को बनाने के लिए आप पर निर्भर है ताकि आप नियंत्रित कर सकें कि कौन सी साइटें 'ऑन' हैं और जो आपके सर्वर पर 'ऑफ' हैं। - Erathiel


एक नई nginx (v1.8) के साथ एक ही समस्या थी। नए संस्करणों का उपयोग करने की सलाह देते हैं snippets/fastcgi-php.conf; के बजाय fastcgi.conf। तो अगर आप कॉपी / पेस्ट करते हैं include fastcgi.conf एक ट्यूटोरियल से, आप के साथ समाप्त हो सकता है Primary script unknown लॉग में त्रुटि।


6
2018-06-17 09:24





"प्राथमिक लिपि अज्ञात" के कारण है SELinux सुरक्षा संदर्भ।

ग्राहक प्रतिक्रिया प्राप्त करते हैं

फाइल नहीं मिली।

nginx error.log में निम्न त्रुटि संदेश है

* 1 9 फास्टसीजीआई stderr में भेजा गया: अपस्ट्रीम से प्रतिक्रिया शीर्षलेख पढ़ने के दौरान "प्राथमिक लिपि अज्ञात"

तो केवल वेब रूट फ़ोल्डर के सुरक्षा संदर्भ प्रकार को बदलें httpd_sys_content_t

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




nginx / php-fpm config के लिए 3 उपयोगकर्ता हैं

/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

उपयोगकर्ता -1 और उपयोगकर्ता -2 समान होने के लिए आवश्यक नहीं हैं।

यूनिक्स सॉकेट के लिए, उपयोगकर्ता -1 को उपयोगकर्ता -3 के समान होना चाहिए, क्योंकि nginx fastcgi_pass में यूनिक्स सॉकेट पर पढ़ने / लिखने की अनुमति होनी चाहिए।

अन्यथा nginx मिल जाएगा 502 खराब गेटवे, और nginx error.log में निम्न त्रुटि संदेश है

* 36 कनेक्ट () को यूनिक्स में: /var/run/php-fpm/fpm-www.sock विफल (13: अनुमति अस्वीकृत) अपस्ट्रीम से कनेक्ट करते समय

और वेब रूट फ़ोल्डर (/ var / www / show) का उपयोगकर्ता / समूह इन 3 उपयोगकर्ताओं में से किसी एक के समान नहीं होना आवश्यक है।


3
2017-07-27 15:05





मुझे यह मुद्दा भी था, और मैंने इसे लाइनों का आदान-प्रदान करके हल किया include fastcgi_params तथा fastcgi_param SCRIPT_FILENAME ...

वास्तव में nginx प्रत्येक FastCGI पैरामीटर का अंतिम मान सेट करता है, इसलिए आपको fastcgi_params में डिफ़ॉल्ट मान के बाद अपना मान रखना होगा।


2
2017-08-05 19:39





मैंने ऊपर से सब कुछ किया, मेरे सिर को टक्कर लगी 2 घंटे खो दी और समस्या अभी भी बनी हुई है। अंत में मैंने किया:

sudo service php7.0-fpm restart

और व्हायोला ने काम किया!

बीटीडब्ल्यू, मैं लिंक से nginx conf के साथ ताजा सिम्फनी 3.4 प्रोजेक्ट स्थापित कर रहा था: https://symfony.com/doc/3.4/setup/web_server_configuration.html

यह नई सिम्फनी परियोजना शुरू करने का मेरा पांचवां समय था और मुझे विश्वास नहीं था कि यह "प्राथमिक लिपि अज्ञात" हो रहा है।


1
2018-03-11 23:19