आप सशर्त रूप से Nginx vhost में फ़ाइलें कैसे शामिल करते हैं?


12

नीचे की पंक्तियों में, मेरे पास साइट-विशिष्ट कॉन्फ़िगरेशन फ़ाइल हो सकती है , जिसमें उस साइट के लिए अनन्य fastcgi_params शामिल हैं । यदि यह फाइल मौजूद है तो मैं इसे लोड करना चाहता हूं।

server {
        listen 80 default;
        server_name _;
        root /path/www/$host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;


                if (-f /path/www/$host/nginx.conf) {
                        include /path/www/$host/nginx.conf;
                }
        }
}

हालाँकि, यह काम नहीं करता है और मुझे मिलने वाली त्रुटि है:

nginx: [emerg] "में शामिल हैं" निर्देश यहां अनुमति नहीं है ...

अपडेट करें

मैंने सोचा कि अलग से जाँच करने के बजाय, मैं अपने लिए जाँच को शामिल कर सकता हूँ।

server {
        listen 80 default;
        server_name _;
        root /path/www/$host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;

                include /path/www/$host/*.nginx;
        }
}

हालाँकि, यह काम नहीं कर रहा है।


क्या आपको इस समस्या का हल मिला? मैं एक ही नाव में हूं, और मैं सोच रहा हूं कि आपने यह कैसे किया?
जैकवीर्डी

क्षमा करें, मुझे लगता है कि मैंने आखिरकार हल किया जो भी समस्या एक अलग तरीका था।
Xeoncross

जवाबों:


8

includeसर्वर शुरू के दौरान अपनी बात करता है - रनटाइम चर का $hostउपयोग नहीं किया जा सकता है, और न ही यह एक ifसंदर्भ में उपयोग करने में सक्षम है , जैसा कि आपको पता चला है।

आपको serverअलग-अलग मेजबानों के लिए ब्लॉकों को विभाजित करना होगा । माफ़ करना!


31

खैर, यह बल्कि पुराना है, लेकिन वैसे भी, मुझे एक काम मिला।

मेरे पास इस शैली में कॉन्फ़िगर किए गए vhosts के साथ एक सेटअप है:

/etc/nginx/sites-enabled/site.com.conf

यदि फ़ाइल मौजूद है (जो संभव नहीं है) जाँचने के बजाय, मैं बस करता हूँ:

include /etc/nginx/sites-customizations/site.com.*.conf

इस तरह से मैं केवल एक फाइल बना सकता हूँ sites-customizations-folder में, जो कि मेरे कन्वेंशन के द्वारा, मुख्य कॉन्फ़िगरेशन के समान है। *अगर वहाँ कोई अतिरिक्त विन्यास फाइल काम करता है काफी की तरह है, इसे तोड़ने नहीं करता है। यदि आप चाहें, तो यह आपको अलग-अलग फ़ाइलों में कई अतिरिक्त कॉन्फ़िगरेशन जोड़ने में सक्षम बनाता है।


5

मुझे पता है कि यह पुराना है, लेकिन समाधान किसी ऐसे उत्तर की तलाश में मदद कर सकता है जैसे मैंने किया।

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

इसलिए मेरे पास एक include /etc/nginx/conf.d/redirectsऔर उस फ़ाइल के अंदर है:

if ($host = "www.example.com") {
    # Some conf or redirects for this site only.
}

5

मैं glob()फंक्शन पैटर्न के विस्तार का लाभ उठाता हूं , जिसका उपयोग includeनिर्देश में nginx द्वारा किया जाता है , और मेरे डेबियन सर्वर पर अच्छी तरह से काम करता है।

आपके मामले में, इस पंक्ति को बदलने का प्रयास करें:

include /path/www/$host/nginx.conf;

इसके साथ:

include /path/www/<hostname>/nginx[.]conf;

यह एक फ़ाइल मास्क है जो केवल एक फ़ाइल से मेल खाता है, और यदि फ़ाइल मौजूद नहीं है, तो nginx शिकायत नहीं करेगा। हालाँकि चरों में निर्देशों को शामिल करने की अनुमति नहीं है, इसलिए आपको निश्चित मूल्य की आपूर्ति करनी चाहिए <hostname>। हमें एक स्क्रिप्ट बनानी थी, जो अलग-अलग .conf फाइलें (प्रति vhost) बनाती है।

संपादित करें

जैसा कि गेराल्ड श्नाइडर ने बताया, मैं $hostप्रतिस्थापन में रखने का सुझाव दे रहा था , जिसकी अनुमति नहीं है। मैंने ऊपर का सुझाव बदल दिया है।


1
चर $hostअभी भी यहाँ काम करने वाला नहीं है।
जेराल्ड श्नाइडर

क्षमा करें, आप सही हैं, चरों में शामिल निर्देशों में चर की अनुमति नहीं है। हम एक पायथन स्क्रिप्ट का उपयोग करते हैं जो प्रत्येक सूची के लिए एकल .conf बनाता है एक सूची से, लेकिन हम मानक से "कस्टम" अतिरिक्त प्रति-vhost विचलन का व्यापक उपयोग करते हैं।
अल्बर्टो पास्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.