/Etc/resolv.conf থেকে Nginx সমাধানের ঠিকানা


18

resolverNginx প্রক্সি কনফিগারেশন থেকে ঠিকানা সেট করা সম্ভব /etc/resolv.conf?

এটি উদাহরণস্বরূপ ডকারে বা ভার্চুয়াল পরিবেশে কার্যকর হতে পারে।

উত্তর:


16

দুর্ভাগ্যক্রমে এটি করার সহজ কোনও উপায় নেই কারণ এনজিনেক্স এর নিজস্ব রেজলভার বাস্তবায়ন ব্যবহার করে। দুটি সমাধান আমি দেখতে পাচ্ছি:

1) আপনি কোনও স্ক্রিপ্ট থেকে সমাধানের তালিকা তৈরি করেন এবং এটি অন্তর্ভুক্ত করুন, যেমন:

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

http {

    include resolvers.conf;

}

২) আপনি (খুব) পরীক্ষামূলক পার্ল মডিউলটির মতো তৃতীয় পক্ষের মডিউল সহ এনজিঙ্ক্স পুনরায় সংকলন করুন এবং একটি পরিবর্তনশীল হ্যান্ডলার লিখুন:

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.conf.templateযা দেখতে এমন কিছু দেখাচ্ছে:

...snip...
http {
  server {

    resolver $NAMESERVER valid=10s;

    ...snip....  
    }
  }
}

আপনার স্টার্টআপ স্ক্রিপ্টটি envsubstপ্রোগ্রাম তৈরি করতে nginx.confএবং তারপর এনজিনেক্স শুরু করতে পারে can উদাহরণ:

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

নোট করুন যে ডকারে এটি একই ফাইলে পরিণত হয়, পূর্বনির্ধারিত ডকার এম্বেড করা ডিএনএস সার্ভার হিসাবে 127.0.0.11, ডকার নেটওয়ার্ক এনগিনেক্স রিসলভারটির এই উত্তরটি দেখুন ।


2
Awk, এটা শিখতে, এটা টেক্সট munging জন্য একটি চমত্কার টুল আছে: export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)। প্রয়োজন নেই cat, grepবা trসেখানে নেই।
j0057

যদিও এটি কুবারনেটসে কাজ করে না।
কিম

1

যদি আপনার সিস্টেমটি রেজলভকনফ ব্যবহার করে (অনেক ভার্চুয়াল মেশিন যেমন করে তবে দুর্ভাগ্যক্রমে ডকার তা দেখেন না man 8 resolvconf), আপনি সম্ভবত এনজিনেক্স তৈরি করতে পারেন 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/binPATH ব্যতীত চলতে পারে , যাতে আপনার অবাস্তব পথে যাওয়ার জন্য নিখুঁত পথের প্রয়োজন হতে পারে।


1

আপনি যদি এনগিনেক্সের ওপেনেরস্টি সংস্করণটি ব্যবহার করছেন তবে আপনি localসেই resolverনির্দেশের জন্য তাদের বিশেষ যুক্তিটি ব্যবহার করতে পারেন যা সেট করার পরে local=on, এর অর্থ হল স্ট্যান্ডার্ড পাথটি রিসলভারটি/etc/resolv.conf ব্যবহার করবে (আরও তথ্যের জন্য ওপেনস্ট্রি রেজলভার ডক্স দেখুন ):

resolver local=on;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.