सवाल Proxy_pass करते समय हर बार DNS (गतिशील होस्टनाम का) हल करने के लिए nginx को कैसे बल दें?


मैं निम्न कॉन्फ़िगरेशन के साथ सेंटोस पर चल रहे nginx / 0.7.68 का उपयोग कर रहा हूं:

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 पुराना आईपी पता कैश करता है, जिसके परिणामस्वरूप गलत आईपी पते का अनुरोध होता है।

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


36
2018-02-26 00:55


मूल


nginx स्रोत के माध्यम से देखकर, ऐसा लगता है कि nginx को उनके टीटीएल के लिए हल करने के लिए हार्डकोड किया गया है - आपके गतिशील डीएनएस पर टीटीएल क्या है? - lunixbochs
मेरे डीडीएन पर टीटीएल 60 है, dyndns.com का डिफ़ॉल्ट मान - xiamx
यह भी देखें stackoverflow.com/questions/26956979/... - Cheekysoft


जवाब:


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

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


7
2018-02-26 01:19



आश्चर्य की बात है जब मैं अपस्ट्रीम में बदल गया, सबकुछ अपेक्षित काम करता था। इसके बाद मैं इसे सही उत्तर के रूप में चिह्नित करूंगा - xiamx
प्रलेखन के अनुसार, एक विशेष अपस्ट्रीम है server झंडा resolve यह केवल वाणिज्यिक संस्करण में उपलब्ध है (देखें nginx.org/en/docs/http/ngx_http_upstream_module.html#server) - omribahumi
नि: शुल्क Nginx का उपयोग करके इसे करने का एक तरीका यहां है, केवल कुछ चालक के साथ कुछ चालें: distinctplace.com/2017/04/19/nginx-resolver-explained (यह नीचे दिए गए उत्तर में भी कहा गया है, लेकिन इसे किसी कारण से सही उत्तर के रूप में स्वीकार नहीं किया गया है?) - gansbrest
@gansbrest वह साइट किसी प्रकार की स्पैममी साइट प्रतीत होती है? मैं पूछूंगा कि आप अपनी प्रतिक्रिया हटा दें। - majikman


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

सेटिंग proxy_pass एक परिवर्तनीय बलों को DNS नामों का पुन: समाधान करने के लिए, क्योंकि Nginx स्थिर कॉन्फ़िगरेशन के लिए चर अलग-अलग व्यवहार करता है। [1]

उदाहरण:

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

नोट: एक रिज़ॉल्वर (उदा। नाम सर्वर जो आप उपयोग करते हैं) को इसके लिए काम करने के लिए कॉन्फ़िगर किया जाना चाहिए।

डिफ़ॉल्ट रूप से, nginx कैश प्रतिक्रिया के टीटीएल मान का उपयोग कर जवाब देता है। एक वैकल्पिक वैध पैरामीटर इसे ओवरराइड करने की अनुमति देता है: [2]

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

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

सूत्रों का कहना है:
[1] http://forum.nginx.org/read.php?2,215830,215832#msg-215832
[2] http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver


65
2018-05-04 09:59



क्या यह हर अनुरोध पर डीएनएस पूछताछ नहीं करेगा? यह भयानक प्रदर्शन की तरह लगता है ... - lucascaro
नहीं, स्रोत पढ़ें। In such setup ip address of "foo.example.com" will be looked up dynamically and result will be cached for 5 minutes. मैंने इसे स्पष्टता के उत्तर में जोड़ा है। - ohaal
इस पर मेरा अधिकांश दिन खर्च करने के बाद - उबंटू 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
नोट: डॉकर के लिए, यह DNS रिज़ॉल्वर 127.0.0.11 पर रहता है, इसलिए विकास के लिए, मैं इसका उपयोग करता हूं: resolver 127.0.0.11 [::1]:5353 valid=15s; - Dalibor Filus


गैंसब्रेस्ट टिप्पणी और ओहल उत्तर में मूल्यवान जानकारी है।

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

हमें वास्तव में "एक वैरिएबल में डोमेन नाम सेट करना होगा" और इसका उपयोग करना होगा समाधानकर्ता निर्देश।

हालांकि, एक परिवर्तनीय का उपयोग पुनर्लेख व्यवहार में परिवर्तन करता है। आपको पुनः लिखने के निर्देश का उपयोग करना पड़ सकता है, यह आपके स्थान और proxy_pass सेटअप पर निर्भर करता है।

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


6
2018-06-23 21:37





मैंने डीएनएस परिवर्तनों के लिए conf.d फ़ोल्डर अपस्ट्रीम देखने और पहचान पर nginx को फिर से लोड करने के लिए एक स्क्रिप्ट को एक साथ हैक किया है। यह पहला पास है, और निश्चित रूप से सुधार किया जा सकता है (अगला पास, मैं विशेष रूप से अपस्ट्रीम को पार्स करने के लिए nginx -T का उपयोग करूंगा। समान विचार proxy_pass निर्देशों के लिए उपयोग किया जा सकता है):

#!/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

0
2018-04-24 01:21