प्रॉक्सी_पास करते समय DNS (एक डायनेमिक होस्टनाम की) को हल करने के लिए nginx को मजबूर कैसे करें?


52

मैं nginx / 0.7.68 का उपयोग कर रहा हूं, CentOS पर चल रहा है, निम्नलिखित विन्यास के साथ:

server {
    listen       80;
    server_name ***;
    index index.html index.htm index.php default.html default.htm default.php;

    location / {
            root   /***;
            proxy_pass   http://***:8888;
            index  index.html index.htm;
    }
    # where *** is my variables

proxy_passएक DNS रिकॉर्ड जिसका आईपी अक्सर बदलती रहती है। Nginx ने पुराने IP पते को कैश किया, जिसके परिणामस्वरूप गलत IP पते का अनुरोध किया गया।

जब यह पुराना हो गया है, तो मैं आईपी एड्रेस को कैशिंग से कैसे रोक सकता हूं?


nginx स्रोत के माध्यम से देखने पर, ऐसा प्रतीत होता है कि nginx हार्डकोड को कैश करने के लिए अपने टीटीएल के लिए हल करता है - आपके गतिशील डीएनएस पर टीटीएल क्या है?
lunixbochs 1

मेरे ddns पर TTL 60 के दशक का है, dyndns.com का डिफ़ॉल्ट मान
xiamx

यह भी देखें stackoverflow.com/questions/26956979/…
Cheekysoft

जवाबों:


8

यह एक पेचीदा सवाल है और AFAIK जो अच्छी तरह से काम नहीं कर रहा है। आप अपस्ट्रीम मॉड्यूल का उपयोग करने की कोशिश कर सकते हैं और विफलता के लिए निर्देशों का उपयोग करके देख सकते हैं कि यह हैक के रूप में काम करता है या नहीं।

2018 संपादित करें: बहुत सारी चीजें बदल गईं। इस बारे में वास्तविक जानकारी प्राप्त करने के लिए @ohaal द्वारा उत्तर की जाँच करें।


1
आश्चर्यजनक रूप से जब मैं अपस्ट्रीम में बदल गया, तो सब कुछ उम्मीद के मुताबिक काम किया। फिर मैं इसे सही उत्तर के रूप में चिह्नित
करूंगा

1
प्रलेखन के अनुसार, एक विशेष अपस्ट्रीम serverध्वज है resolveजो केवल व्यावसायिक संस्करण में उपलब्ध है (देखें nginx.org/en/docs/http/ngx_http_upstream_module.html#server )
omribahn

1
@gansbrest उस साइट को किसी प्रकार की स्पैम साइट लगती है? मैं पूछता हूँ कि आप अपनी प्रतिक्रिया को हटा दें।
माजिकमैन

90

स्वीकृत जवाब मेरे लिए nginx / 1.4.2 पर काम नहीं किया।

proxy_passDNS नामों के री-रिज़ॉल्यूशन बलों में एक चर का उपयोग करना क्योंकि NGINX वैरिएबल को स्थिर कॉन्फ़िगरेशन के लिए अलग-अलग व्यवहार करता है। से nginx proxy_passप्रलेखन :

पैरामीटर मान में चर हो सकते हैं। इस स्थिति में, यदि कोई पता डोमेन नाम के रूप में निर्दिष्ट किया जाता है, तो नाम वर्णित सर्वर समूहों के बीच खोजा जाता है, और यदि नहीं मिला है, तो एक रिज़ॉल्वर का उपयोग करके निर्धारित किया जाता है।

उदाहरण के लिए:

server {
    ...
    resolver 127.0.0.1;
    set $backend "http://dynamic.example.com:80";
    proxy_pass $backend;
    ...
}

नोट: एक रिसॉल्वर (यानी उपयोग करने के लिए नाम सर्वर) उपलब्ध होने के लिए जरूरी है और इसे काम करने के लिए कॉन्फ़िगर किया गया है (और किसी /etc/hostsफ़ाइल के अंदर प्रविष्टियां एक लुकअप में उपयोग नहीं की जाएंगी)।

डिफ़ॉल्ट रूप से, एनजीआईएनएक्स कैश के संस्करण 1.1.9 या बाद के संस्करणों ने एक प्रतिक्रिया के टीटीएल मूल्य का उपयोग करके उत्तर दिया और एक वैकल्पिक validपैरामीटर कैश समय को ओवरराइड करने की अनुमति देता है:

resolver 127.0.0.1 [::1]:5353 valid=30s;

संस्करण 1.1.9 से पहले, कैशिंग समय की ट्यूनिंग संभव नहीं थी, और nginx ने हमेशा 5 मिनट की अवधि के लिए जवाब कैश किया।


यह हर एक अनुरोध पर डीएनएस क्वेरी को बाध्य नहीं करेगा? यह भयानक प्रदर्शन की तरह लगता है ...
लूकासकारो

नहीं, स्रोत पढ़ें। In such setup ip address of "foo.example.com" will be looked up dynamically and result will be cached for 5 minutes.मैंने इसे स्पष्टता के जवाब में जोड़ दिया है।
ओहल

13
इस पर मेरा अधिकांश दिन बिताने के बाद - Ubuntu 12.04 पर nginx 1.1.19 के साथ, setअंदर locationठीक से काम नहीं करता है। खबरदार
omribahumi

इस समाधान ने मेरे साथ काम किया, हालांकि मुझे 5 मिनट टीटीएल के लिए एक संदर्भ नहीं मिला। nginx.org/en/docs/http/ngx_http_core_module.html#resolver By default, nginx caches answers using the TTL value of a response. An optional valid parameter allows overriding it: resolver 127.0.0.1 [::1]:5353 valid=30s;
Montaro

4
नोट: डॉकटर के लिए, यह डीएनएस रिसॉल्वर 127.0.0.11 पर रहता है, इसलिए विकास के लिए, मैं इसका उपयोग करता हूं:resolver 127.0.0.11 [::1]:5353 valid=15s;
Dalibor Filus

9

Gansbrest टिप्पणी और ohaal उत्तर में बहुमूल्य जानकारी है।

लेकिन मुझे लगता है कि 2016 में पोस्ट किए गए इस आधिकारिक nginx लेख का उल्लेख करना महत्वपूर्ण है, यह स्पष्ट रूप से इस मामले पर nginx व्यवहार और संभावित समाधान बताता है: https://www.nginx.com/blog/dns-service-discovery-nginx-plus /

हमें वास्तव में "डोमेन नाम को एक चर में सेट करें" और रिज़ॉल्वर निर्देश का उपयोग करना होगा ।

हालांकि, एक चर का उपयोग कर फिर से लिखना व्यवहार को बदलता है। आपको फिर से लिखना निर्देश का उपयोग करना पड़ सकता है, यह आपके स्थान और प्रॉक्सी_पास सेटअप पर निर्भर करता है।

पुनश्च: एक टिप्पणी पोस्ट होगा लेकिन अभी तक पर्याप्त अंक नहीं ...


1

ohaal का जवाब हम में से अधिकांश को वहां ले जाता है, लेकिन एक ऐसा मामला है जहां DNS रिज़ॉल्वर 127.0.0.1 पर नहीं रहता है (जैसे जब आप एक विशेष कंटेनरीकृत वातावरण में होते हैं)

उस स्थिति में, आप nginx conf को बदलना चाहते हैं resolver ${DNS_SERVER};। फिर, नगणक्स शुरू करने से पहले, दौड़ें

export DNS_SERVER=$(cat /etc/resolv.conf |grep -i '^nameserver'|head -n1|cut -d ' ' -f2)
envsubst '${DNS_SERVER} < your_nginx.conf.template > your_nginx.conf

0

मैं एक स्क्रिप्ट हैक करने के लिए एक dnn dn बदलाव के लिए फ़ोल्डर upstreams देखने के लिए और पता लगाने पर nginx पुनः लोड किया है। यह पहली पास है, और निश्चित रूप से सुधार किया जा सकता है (अगले पास, मैं विशेष रूप से अपस्ट्रीम को पार्स करने के लिए nginx -T का उपयोग करूंगा। समान विचार प्रॉक्सी_पास निर्देशों के लिए इस्तेमाल किया जा सकता है):

#!/bin/bash

get_upstreams() {
  local files=$@
  grep -hEo '(server\s+)[^:;]+' $files | cut -d' ' -f 2
}

resolve_hosts() {
  local hosts=$@
  for h in $hosts; do dig +short $h; done | sort -u
}

watch_dir=$1

[ -d $watch_dir ] || exit 2

upstreams=$(get_upstreams $watch_dir/*)
ips=$(resolve_hosts $upstreams)
if [ ! "$ips" ]; then
  echo "Found no resolvable hosts in $watch_dir files."
fi

host_hash=$(echo $ips | /usr/bin/sha512sum)

echo $host_hash
echo $ips

while [ -d $watch_dir ]; do
  sleep 30
  upstreams=$(get_upstreams $watch_dir/*)
  ips=$(resolve_hosts $upstreams)
  new_hash=$(echo $ips | /usr/bin/sha512sum)
  if [ "$host_hash" != "$new_hash" ]; then
    echo Detected an upstream address change.  $ips
    echo Reloading nginx
    echo $new_hash
    echo $ips
    /sbin/service nginx reload
    host_hash=$new_hash
  fi
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.