প্রক্সি_পাস করার সময় কীভাবে এনজিঙ্ক্সকে ডিএনএস (ডায়নামিক হোস্টনামের) সমাধান করতে বাধ্য করবেন?


52

আমি নিম্নোক্ত কনফিগারেশন সহ সেন্টোস-এ চলমান এনগিনেক্স / 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 রেকর্ড যার আইপি ঘন ঘন পরিবর্তন হয়। এনগিনেক্স পুরানো আইপি ঠিকানাটি ক্যাশে করে, ফলস্বরূপ ভুল আইপি ঠিকানার অনুরোধ জানায় request

আইপি অ্যাড্রেসটি পুরানো হয়ে গেলে আমি কীভাবে এনজিঙ্ক্সকে থামাতে পারি?


এনজিনেক্স উত্সটি অনুসন্ধান করে দেখা যাচ্ছে যে এনজিনক্স তাদের টিটিএল-কে সমাধান করার জন্য ক্যাশে হার্ডকডড রয়েছে - আপনার গতিশীল ডিএনএস-এ টিটিএল কী?
lunixbochs

আমার ডিডিএনএসের টিটিএল 60 এর দশক, dyndns.com এর ডিফল্ট মান
xiamx


উত্তর:


8

এটি একটি উদ্বেগজনক প্রশ্ন এবং আফাইক যা ভালভাবে কাজ করছে না। আপনি প্রবাহের মডিউলটি ব্যবহার করার চেষ্টা করতে পারেন এবং এটি হ্যাক হিসাবে কাজ করে কিনা তা দেখতে ব্যর্থতার জন্য নির্দেশাবলী ব্যবহার করতে পারেন।

2018 সম্পাদনা: অনেক কিছুই পরিবর্তিত হয়েছে। এ সম্পর্কে আসল তথ্য পেতে @ ওহালের মাধ্যমে উত্তরটি দেখুন ।


1
আশ্চর্যজনকভাবে যখন আমি উজানের দিকে বদলে গেলাম, সবকিছু প্রত্যাশা অনুযায়ী কাজ করেছিল। এরপরে আমি এটিকে সঠিক উত্তর হিসাবে চিহ্নিত করব
xiamx

1
ডকুমেন্টেশন অনুসারে, একটি বিশেষ প্রবাহের serverপতাকা রয়েছে resolveযা কেবলমাত্র বাণিজ্যিক সংস্করণে পাওয়া যায় (দেখুন nginx.org/en/docs/http/ngx_http_upstream_module.html#server )
ওমরিবাহি

1
@gansbrest এই সাইটটি স্প্যামি সাইটের একরকম বলে মনে হচ্ছে? আমি আপনাকে আপনার প্রতিক্রিয়া অপসারণ করতে চাই।
majikman

90

স্বীকৃত উত্তরটি আমার জন্য এনজিএনএক্স / 1.4.2 এ কার্যকর হয়নি।

proxy_passডিএনএস নামগুলির পুনঃ-রেজোলিউশন করার জন্য একটি ভেরিয়েবল ব্যবহার করে কারণ এনজিআইএনএক্স স্থির কনফিগারেশনে ভেরিয়েবলকে আলাদাভাবে আচরণ করে। থেকে nginx proxy_passডকুমেন্টেশন :

প্যারামিটার মান ভেরিয়েবল থাকতে পারে। এই ক্ষেত্রে, যদি কোনও ঠিকানা কোনও ডোমেন নাম হিসাবে নির্দিষ্ট করা থাকে, বর্ণিত সার্ভার গ্রুপগুলির মধ্যে নামটি অনুসন্ধান করা হয়, এবং যদি খুঁজে না পাওয়া যায় তবে একটি সমাধানকারী ব্যবহার করে নির্ধারিত হয়।

উদাহরণ স্বরূপ:

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

দ্রষ্টব্য: একটি সমাধানকারী (অর্থাত্ ব্যবহারকারীর নাম নাম সার্ভার) এটি কাজ করার জন্য উপলব্ধ এবং কনফিগার করতে হবে (এবং কোনও /etc/hostsফাইলের অভ্যন্তরীণ এন্ট্রিগুলি একটি অনুসন্ধানে ব্যবহার করা হবে না)।

ডিফল্টরূপে, সংস্করণ ১.১.৯ বা পরবর্তী সংস্করণগুলি এনজিআইএনএক্স ক্যাশে জবাবগুলির টিটিএল মান ব্যবহার করে এবং একটি alচ্ছিক validপরামিতি ক্যাশে সময়কে ওভাররাইড করার অনুমতি দেয়:

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

সংস্করণ ১.১.৯ এর আগে, ক্যাচিংয়ের সময়ের টিউন করা সম্ভব ছিল না এবং এনগিনেক্স সর্বদা ৫ মিনিটের সময়কালের জন্য উত্তরগুলি ক্যাশে করে।


এই জোর প্রতিটি অনুরোধে একটি ডিএনএস কোয়েরি না? এটি ভয়ানক পারফরম্যান্সের মতো শোনাচ্ছে ...
লুকাস্কারো

না, উত্স পড়ুন। In such setup ip address of "foo.example.com" will be looked up dynamically and result will be cached for 5 minutes.আমি স্বচ্ছতার জন্য উত্তরে এটি যুক্ত করেছি।
ওহাল

13
আমার বেশিরভাগ দিন এটি ব্যয় করার পরে - উবুন্টু 12.04 এ এনজিনেক্স 1.1.19 এর সাথে, setভিতরে locationসঠিকভাবে কাজ করে না। সাবধান
ওমরিবহুমি

এই সমাধানটি আমার সাথে কাজ করেছিল, তবে আমি 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;
মন্টারো

4
দ্রষ্টব্য: ডকারের জন্য, এটি ডিএনএস resolver 127.0.0.11 [::1]:5353 valid=15s;
রেজোলভারটি

9

গ্যানস্রেস্ট মন্তব্য এবং ওহাল উত্তরের মূল্যবান তথ্য রয়েছে।

তবে আমি মনে করি যে 2016 সালে পোস্ট করা এই অফিশিয়াল এনজিনেক্স নিবন্ধটি উল্লেখ করা জরুরী, এটি স্পষ্টভাবে এই বিষয়ে nginx আচরণ এবং সম্ভাব্য সমাধানগুলি ব্যাখ্যা করে: https://www.nginx.com/blog/dns-service-discovery-nginx-plus /

আমরা প্রকৃতপক্ষে "একটি চলক মধ্যে ডোমেন নাম সেট করুন" এবং ব্যবহার করতে হবে সমাধানকারী নির্দেশ।

তবে, একটি ভেরিয়েবল ব্যবহার পুনরায় লেখার আচরণকে পরিবর্তন করে। আপনাকে পুনরায় লেখার নির্দেশিকা ব্যবহার করতে হতে পারে, এটি আপনার অবস্থান এবং প্রক্সি_পাস সেটআপের উপর নির্ভর করে।

পিএস: একটি মন্তব্য পোস্ট করেছেন তবে পর্যাপ্ত পয়েন্টগুলি এখনও নেই ...


1

ওহালের উত্তরটি আমাদের বেশিরভাগ ক্ষেত্রে নিয়ে যায়, তবে এমন একটি মামলা রয়েছে যেখানে ডিএনএস রেজোলভার 127.0.0.1 এ বাস করে না (যেমন আপনি যখন একটি বিশেষ ধারক পরিবেশে থাকবেন)

সেক্ষেত্রে আপনি এনজিন্স কনফেমে পরিবর্তন করতে পারেন resolver ${DNS_SERVER};। তারপরে, আপনি nginx শুরু করার আগে, চালান

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

ডিএনএস পরিবর্তনের জন্য কনফিডার ফোল্ডার আপস্ট্রিমগুলি দেখতে এবং সনাক্তকরণের পরে এনজিনেক্স পুনরায় লোড করতে আমি একটি স্ক্রিপ্ট হ্যাক করেছি। এটি প্রথম পাস, এবং অবশ্যই উন্নতি করা যেতে পারে (পরবর্তী পাস, আমি বিশেষত উজানের প্রবাহগুলি পার্স করার জন্য এনগিনেক্স-টি ব্যবহার করব S একই ধারণা প্রক্সি_পাস নির্দেশের জন্য ব্যবহার করা যেতে পারে):

#!/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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.