क्या resolver
nginx प्रॉक्सी कॉन्फ़िगरेशन में पता सेट करना संभव है /etc/resolv.conf
?
यह docker में या virtualenvironment में उदाहरण के लिए उपयोगी हो सकता है।
क्या resolver
nginx प्रॉक्सी कॉन्फ़िगरेशन में पता सेट करना संभव है /etc/resolv.conf
?
यह docker में या virtualenvironment में उदाहरण के लिए उपयोगी हो सकता है।
जवाबों:
दुर्भाग्य से ऐसा करने का कोई आसान तरीका नहीं है क्योंकि 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";
}
अब, यदि आप एक सी कोडर के नरक हैं (कुछ रक्त के लिए अपनी आँखें तैयार करें), तो आप अभी भी इसे इस तरह से काम करने के लिए एक वैकल्पिक पैच या मॉड्यूल लिख सकते हैं।
डॉकर उपयोगकर्ताओं के लिए, समाधान यहां पाया गया :
डॉकर का उपयोग करने वाले लोगों के लिए एक समाधान है।
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 पर देखें ।
यदि आपका सिस्टम 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
पैठ के बिना चलाई जा सकती है , इसलिए आपको जागने के लिए पूर्ण पथ की आवश्यकता हो सकती है।
यदि आप नार्नेक्स के ओपनरेस्टी संस्करण का उपयोग कर रहे हैं, तो आप उनके विशेष local
तर्क का उपयोग उस resolver
निर्देश के लिए कर सकते हैं जो सेट करने के लिए है local=on
, इसका मतलब /etc/resolv.conf
है कि रिज़ॉल्वर द्वारा मानक पथ का उपयोग किया जाएगा (अधिक जानकारी के लिए ओपनएस्टी रिज़ॉल्वर डॉक्स देखें ):
resolver local=on;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)
:। कोई जरूरत नहीं हैcat
,grep
याtr
वहाँ के लिए।