Адреса резолюції Nginx від /etc/resolv.conf


18

Чи можна встановити resolverадресу в конфігурації проксі nginx з /etc/resolv.conf?

Це може бути корисно, наприклад, у докері або у віртуальному оточенні.

Відповіді:


16

На жаль, немає простого способу зробити це, оскільки nginx використовує власну реалізацію. Я бачу два рішення:

1) Ви генеруєте список резолюцій із скрипту і включаєте його, наприклад:

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

http {

    include resolvers.conf;

}

2) Ви перекомпілюєте nginx із стороннім модулем, як-от (дуже) експериментальний модуль perl, і пишете змінний обробник:

http {

    perl_modules perl/lib;
    perl_set $resolvers '

        sub {
            return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf");
        };

    resolver "$resolvers";
}

Тепер, якщо ви пекла кодера С (підготуйте очі до крові), ви все одно можете написати альтернативний патч або модуль, щоб він працював таким чином.


6

Для користувачів Docker рішення знайдено тут :

Ось вирішення для людей, які використовують Докер.

export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`

Для цього потрібно взяти всі nameserverзаписи /etc/resolv.confта надрукувати їх у рядку, щоб ви могли використовувати їх із resolverдирективою nginx . Ваш Dockerfile повинен мати спеціальний скрипт для точки входу, який генерує конфігураційний файл, а потім запускає 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 це, як правило, призводить до того ж файлу, як і за замовчуванням докер вбудований DNS-сервер 127.0.0.11, дивіться цю відповідь на Docker Network Nginx Resolver .


2
Awk, дізнатися його, це фантастичний інструмент для тексту munging: export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Не потрібно cat, grepабо trтам.
j0057

на Kubernetes це не працює.
Кім

1

Якщо у вашій системі використовується resoluvconf (як це робить багато віртуальних машин, але, на жаль, Docker цього не бачить 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

Деякі дистрибутиви Linux включають /etc/nginx/conf.d/*.confу конфігурацію за замовчуванням. Перезавантаження зазвичай ігнорується, коли служба не працює. Зауважте, що сценарій може працювати без /usr/binPATH, тому вам може знадобитися абсолютний шлях до пробудження.


1

Якщо ви використовуєте версію nginx Openresty, тоді ви можете використовувати їх спеціальний localаргумент до resolverдирективи, яка, коли вона встановлена local=on, означає, що стандартний шлях /etc/resolv.confбуде використаний розв'язувачем (докладнішу інформацію див. У документах з резолюції Openresty ):

resolver local=on;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.