Nginx - रूट और अन्य के साथ भ्रम की सेवा करने वाली स्थिर फ़ाइल


473

मुझे अपने ऐप सर्वर पर अपने ऐप के माध्यम से सेवा करनी होगी 8080, और ऐप सर्वर को छूने के बिना एक निर्देशिका से मेरी स्थिर फ़ाइलों को। मेरे पास nginx config कुछ इस तरह है ...

    # app server on port 8080
    # nginx listens on port 8123
    server {
            listen          8123;
            access_log      off;

            location /static/ {
                    # root /var/www/app/static/;
                    alias /var/www/app/static/;
                    autoindex off;
            }


            location / {
                    proxy_pass              http://127.0.0.1:8080;
                    proxy_set_header        Host             $host;
                    proxy_set_header        X-Real-IP        $remote_addr;
                    proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
            }
    }

अब, इस विन्यास के साथ, सब कुछ ठीक काम कर रहा है। ध्यान दें कि rootनिर्देश पर टिप्पणी की गई है।

अगर मैं सक्रिय करता हूं rootऔर निष्क्रिय करता हूं alias- तो यह काम करना बंद कर देता है। हालाँकि, जब मैं इसमें /static/से अनुगामी हटाता हूँ तो rootफिर से काम करना शुरू कर देता है।

क्या कोई समझा सकता है कि क्या चल रहा है। कृपया स्पष्ट रूप से और स्पष्ट रूप से समझाएं कि rootऔर alias, और उनके उद्देश्यों के बीच क्या अंतर हैं।

जवाबों:


1074

मुझे अपने भ्रमों के जवाब मिल गए हैं।

rootऔर aliasनिर्देशों के बीच एक बहुत महत्वपूर्ण अंतर है । यह अंतर उस तरीके से मौजूद है जिस तरह से rootया निर्दिष्ट aliasप्रक्रिया है।

rootनिर्देश के मामले में , पूर्ण पथ को रूट भाग सहित रूट से जोड़ दिया जाता है , जबकि aliasनिर्देश के मामले में , केवल स्थान का हिस्सा नहीं है, जिसमें स्थान भाग भी शामिल नहीं है

उदाहरण देकर स्पष्ट करने के लिए:

मान लीजिए कि हमारे पास कॉन्फ़िगरेशन है

location /static/ {
    root /var/www/app/static/;
    autoindex off;
}

इस मामले में अंतिम रास्ता जो Nginx व्युत्पन्न होगा

/var/www/app/static/static

यह लौटने वाला है 404क्योंकि static/भीतर कोई नहीं हैstatic/

इसका कारण यह है कि स्थान भाग निर्दिष्ट पथ में संलग्न है root। इसलिए, rootसही तरीका है

location /static/ {
    root /var/www/app/;
    autoindex off;
}

दूसरी ओर, के साथ alias, स्थान का हिस्सा गिरा हुआ हो जाता है । तो विन्यास के लिए

location /static/ {
    alias /var/www/app/static/;
    autoindex off;           ↑
}                            |
                             pay attention to this trailing slash

अंतिम रास्ता सही तरीके से बनेगा

/var/www/app/static

aliasनिर्देश के लिए अनुगामी स्लेश का मामला

इस बात के बारे में कोई निश्चित दिशानिर्देश नहीं है कि क्या निगंल दस्तावेज़ीकरण के अनुसार एक अनुगामी स्लैश अनिवार्य है , लेकिन यहां और अन्य जगहों के लोगों द्वारा किया गया एक सामान्य अवलोकन यह दर्शाता है कि यह है।

कुछ और स्थानों ने इस पर चर्चा की है, हालांकि निर्णायक रूप से नहीं।

/server/376162/how-can-i-create-a-location-in-nginx-that-works-with-and-without-a-trailing-slas

/server/375602/why-is-my-nginx-alias-not-working


97
उर्फ पथ पर अनुगामी स्लैश आवश्यक है!
मफ्रोसिस

2
यह सब बहुत अच्छा है (इससे मुझे अपने कॉन्फ़िगर मुद्दों को ठीक करने में मदद मिली), लेकिन मुझे आश्चर्य है कि लोग किस प्रकार की सेटिंग का उपयोग करके इन प्रकार की समस्याओं का निदान कर सकते हैं? जैसे, "लॉग के लिए अनुरोध प्राप्त [...]," स्थान [...] द्वारा कॉन्फ़िगर किया गया ", ब्लॉक को सर्च डायरेक्टरी [...]"
पिस्टोस

2
@Pistos: डाल log_format scripts '$document_root | $uri | > $request';में httpअनुभाग और access_log /var/log/nginx/scripts.log scripts;में serverकी nginx config .. अनुभाग
helvete

धन्यवाद! वास्तव में अनुगामी स्लैश उर्फ ​​पर आवश्यक है, अन्यथा मुझे मिल गया nginx: [emerg] invalid number of arguments in "alias" directive, और सर्वर अपने पुनरारंभ के दौरान नीचे चला गया।
फोटिस

@ मैफ्रोसिस क्यों जरूरी है?
ब्रूस सन

104

जैसा कि @treecoder कहते हैं

rootनिर्देश के मामले में , पूर्ण पथ को रूट भाग सहित रूट से जोड़ दिया जाता है, जबकि aliasनिर्देश के मामले में , केवल स्थान का हिस्सा शामिल नहीं होता है, स्थान का हिस्सा उपनाम के साथ जोड़ा जाता है।

एक तस्वीर एक हजार शब्दों के बराबर होती है

के लिए root:

यहाँ छवि विवरण दर्ज करें

के लिए alias:

यहाँ छवि विवरण दर्ज करें


11
क्या दूसरी छवि में पहला तीर "+" होना चाहिए?
aioobe

35

आपके मामले में, आप उपयोग कर सकते हैं root, निर्देश क्योंकि $uriके हिस्से locationके निर्देश पिछले के साथ एक ही है rootनिर्देश हिस्सा।

Nginx प्रलेखन इसे भी सलाह देता है:
जब स्थान निर्देश के मूल्य के अंतिम भाग से मेल खाता है:

location /images/ {
    alias /data/w3/images/;
}

इसके बजाय रूट निर्देश का उपयोग करना बेहतर है:

location /images/ {
    root /data/w3;
}

और rootनिर्देश $uriपथ के लिए अपील करेंगे ।


2
यह बेहतर क्यों है? डॉक्स या तो नहीं कहते हैं।
HostedMetrics.com

मुझे जो लाभ दिख रहा है, वह $ uri के दोहराव से बचने के लिए है, / दिए गए उदाहरणों में चित्र, उर्फ ​​का उपयोग करते समय
antonbormotov

21

@ Good_computer के बहुत उपयोगी उत्तर के लिए बस एक त्वरित परिशिष्ट, मैं एक फ़ोल्डर के साथ URL की जड़ को बदलना चाहता था, लेकिन केवल अगर यह स्थिर फ़ाइलों से युक्त एक सबफ़ोल्डर से मेल खाता था (जो मैं पथ के भाग के रूप में बनाए रखना चाहता था)।

उदाहरण के लिए यदि फ़ाइल का अनुरोध किया है /app/jsया /app/cssमें देखो, /app/location/public/[that folder]

मुझे यह एक regex का उपयोग करके काम करने के लिए मिला।

 location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
     alias /home/user/sites/app/public/$1;
     access_log off;
     expires max;
 }

2
इस उत्तर के लिए धन्यवाद। मुझे पता है कि यह 3 साल बाद है, लेकिन क्या कोई समझा सकता है कि उर्फ ​​बनाम रूट का उपयोग करने के बीच कोई प्रदर्शन और / या सुरक्षा व्यापार है?
मीना

1
@ मीना यदि आप कर सकते हैं तो रूट का उपयोग करना बेहतर है। (डॉक्स wiki.nginx.org/HttpCoreModule#alias में एक टिप्पणी है )
मैथ्यू विलकोक्सन

यह ठीक वैसा ही है जैसा मैं exactly
एलियनफ्रॉमआउटर्सस्पेस

6

aliasअनुरोध पथ में स्थान भाग पथ (LPP) को प्रतिस्थापित करने के लिए उपयोग किया जाता है, जबकि rootइसका उपयोग अनुरोध पथ से पहले करने के लिए किया जाता है।

वे अंतिम फ़ाइल पथ के लिए अनुरोध पथ को मैप करने के दो तरीके हैं।

aliasकेवल स्थान ब्लॉक में उपयोग किया जा सकता है, और यह बाहर से ओवरराइड करेगा root

aliasऔर rootएक साथ स्थान ब्लॉक में इस्तेमाल नहीं किया जा सकता।


3
server {
    server_name xyz.com;
    root /home/ubuntu/project_folder/;

    client_max_body_size 10M;
    access_log  /var/log/nginx/project.access.log;
    error_log  /var/log/nginx/project.error.log;

    location /static {
        index index.html;
    }

    location /media {
        alias /home/ubuntu/project/media/;
    }
}

सर्वर ब्लॉक nginx पर स्थिर पेज जीने के लिए।


2

इसे संक्षिप्त रखने पर दूसरे शब्दों में: rootनिर्दिष्ट स्थान तर्क के मामले में फाइलसिस्टम के पथ और URI का हिस्सा है । दूसरी ओर - aliasस्थान विवरण के प्रत्यक्ष तर्क के लिए केवल यूआरआई का हिस्सा है

तो, aliasएक अलग नाम है जो कुछ यूआरआई को फाइलसिस्टम में निश्चित पथ पर मैप करता है, जबकि rootस्थान तर्क को rootनिर्देश के तर्क के रूप में दिए गए रूट पथ पर जोड़ता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.