Чи можна встановити resolverадресу в конфігурації проксі nginx з /etc/resolv.conf?
Це може бути корисно, наприклад, у докері або у віртуальному оточенні.
Чи можна встановити resolverадресу в конфігурації проксі nginx з /etc/resolv.conf?
Це може бути корисно, наприклад, у докері або у віртуальному оточенні.
Відповіді:
На жаль, немає простого способу зробити це, оскільки 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";
}
Тепер, якщо ви пекла кодера С (підготуйте очі до крові), ви все одно можете написати альтернативний патч або модуль, щоб він працював таким чином.
Для користувачів 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 .
Якщо у вашій системі використовується 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, тому вам може знадобитися абсолютний шлях до пробудження.
Якщо ви використовуєте версію nginx Openresty, тоді ви можете використовувати їх спеціальний localаргумент до resolverдирективи, яка, коли вона встановлена local=on, означає, що стандартний шлях /etc/resolv.confбуде використаний розв'язувачем (докладнішу інформацію див. У документах з резолюції Openresty ):
resolver local=on;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Не потрібноcat,grepабоtrтам.