Чи можна встановити 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/bin
PATH, тому вам може знадобитися абсолютний шлях до пробудження.
Якщо ви використовуєте версію 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
там.