/Etc/resolv.conf से Nginx रिज़ॉल्वर का पता


18

क्या resolvernginx प्रॉक्सी कॉन्फ़िगरेशन में पता सेट करना संभव है /etc/resolv.conf?

यह docker में या virtualenvironment में उदाहरण के लिए उपयोगी हो सकता है।

जवाबों:


16

दुर्भाग्य से ऐसा करने का कोई आसान तरीका नहीं है क्योंकि nginx का उपयोग यह स्वयं के रिज़ॉल्वर कार्यान्वयन है। मेरे द्वारा देखे जाने वाले दो समाधान हैं:

1) आप एक स्क्रिप्ट से रिज़ॉल्वर सूची उत्पन्न करते हैं और इसे शामिल करते हैं, जैसे:

echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/resolvers.conf

http {

    include resolvers.conf;

}

2) आप (बहुत) प्रायोगिक पर्ल मॉड्यूल जैसे तीसरे पक्ष के मॉड्यूल के साथ nginx को फिर से जोड़ते हैं और एक चर हैंडलर लिखते हैं:

http {

    perl_modules perl/lib;
    perl_set $resolvers '

        sub {
            return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf");
        };

    resolver "$resolvers";
}

अब, यदि आप एक सी कोडर के नरक हैं (कुछ रक्त के लिए अपनी आँखें तैयार करें), तो आप अभी भी इसे इस तरह से काम करने के लिए एक वैकल्पिक पैच या मॉड्यूल लिख सकते हैं।


6

डॉकर उपयोगकर्ताओं के लिए, समाधान यहां पाया गया :

डॉकर का उपयोग करने वाले लोगों के लिए एक समाधान है।

export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`

यह क्या करता है सभी nameserverप्रविष्टियों को /etc/resolv.confएक पंक्ति में लें और उन्हें एक पंक्ति में प्रिंट करें, ताकि आप उन्हें नंगेक्स के resolverनिर्देश के साथ उपयोग कर सकें । आपके डॉकरीफाइल को एंट्रीपॉइंट के लिए एक कस्टम स्क्रिप्ट की आवश्यकता होगी जो कि कॉन्फिग फाइल को जेनरेट करता है और फिर nginx शुरू होता है। कहते हैं कि आपके पास एक फ़ाइल है nginx.conf.templateजो कुछ इस तरह दिखाई देती है:

...snip...
http {
  server {

    resolver $NAMESERVER valid=10s;

    ...snip....  
    }
  }
}

आपकी स्टार्टअप स्क्रिप्ट तब envsubstप्रोग्राम उत्पन्न करने के लिए उपयोग कर सकती है nginx.confऔर फिर nginx शुरू कर सकती है। उदाहरण के लिए:

#!/bin/bash
if [ "$NAMESERVER" == "" ]; then
    export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`
fi

echo "Nameserver is: $NAMESERVER"

echo "Copying nginx config"
envsubst '$NAMESERVER' < /nginx.conf.template > /nginx.conf

echo "Using nginx config:"
cat /nginx.conf

echo "Starting nginx"
nginx -c /nginx.conf -g "daemon off;"

ध्यान दें कि docker में यह उसी फ़ाइल में परिणामित होता है, जैसा कि डिफ़ॉल्ट रूप से docker एम्बेडेड DNS सर्वर होता है 127.0.0.11, इस उत्तर को Docker Network Nginx Resolver पर देखें


2
अक्क, इसे जानें, यह पाठ के लिए एक शानदार उपकरण है export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf):। कोई जरूरत नहीं है cat, grepया trवहाँ के लिए।
j0057

हालांकि यह कुबेरनेट्स पर काम नहीं करता है।
किम

1

यदि आपका सिस्टम resolvconf का उपयोग करता है (जैसा कि कई वर्चुअल मशीन करते हैं, लेकिन दुर्भाग्य से डॉकर नहीं करता है, देखें man 8 resolvconf), तो आप nginx resolvers.conf(अन्य उत्तर में) बना सकते हैं /etc/resolvconf/update-libc.d/nginx। यह रिज़ॉल्वर के गतिशील परिवर्तन के दुर्लभ मामले में भी अच्छी तरह से व्यवहार करता है।

#!/bin/sh
conf="resolver $(/usr/bin/awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf);"
[ "$conf" = "resolver ;" ] && exit 0
confpath=/etc/nginx/conf.d/resolvers.conf
if [ ! -e $confpath ] || [ "$conf" != "$(cat $confpath)" ]
then
    echo "$conf" > $confpath
    service nginx reload >/dev/null
fi
exit 0

कुछ लिनक्स वितरण /etc/nginx/conf.d/*.confउनके डिफ़ॉल्ट कॉन्फ़िगरेशन में शामिल हैं। जब सेवा नहीं चल रही हो तो रीलोड को आमतौर पर अनदेखा कर दिया जाता है। ध्यान दें कि स्क्रिप्ट /usr/binपैठ के बिना चलाई जा सकती है , इसलिए आपको जागने के लिए पूर्ण पथ की आवश्यकता हो सकती है।


1

यदि आप नार्नेक्स के ओपनरेस्टी संस्करण का उपयोग कर रहे हैं, तो आप उनके विशेष localतर्क का उपयोग उस resolverनिर्देश के लिए कर सकते हैं जो सेट करने के लिए है local=on, इसका मतलब /etc/resolv.confहै कि रिज़ॉल्वर द्वारा मानक पथ का उपयोग किया जाएगा (अधिक जानकारी के लिए ओपनएस्टी रिज़ॉल्वर डॉक्स देखें ):

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