Czy można ustawić resolver
adres w konfiguracji proxy Nginx /etc/resolv.conf
?
Może być przydatny na przykład w oknie dokowanym lub w środowisku wirtualnym.
Niestety nie ma łatwego sposobu, aby to zrobić, ponieważ nginx używa własnej implementacji resolvera. Dwa rozwiązania, które widzę to:
1) Generujesz listę resolverów ze skryptu i dołączasz ją, np .:
echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/resolvers.conf
http {
include resolvers.conf;
}
2) Ponownie kompilujesz nginx za pomocą modułu innej firmy, takiego jak (bardzo) eksperymentalny moduł perla i piszesz moduł obsługi zmiennych:
http {
perl_modules perl/lib;
perl_set $resolvers '
sub {
return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf");
};
resolver "$resolvers";
}
Teraz, jeśli jesteś koderem C (przygotuj oczy na trochę krwi), możesz napisać alternatywną łatkę lub moduł, aby działał w ten sposób.
Dla użytkowników Dockera rozwiązanie znajduje się tutaj :
Oto obejście dla osób korzystających z Dockera.
export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`
Powoduje to pobranie wszystkich
nameserver
wpisów/etc/resolv.conf
i wydrukowanie ich w linii, dzięki czemu można ich używać zgodnie zresolver
dyrektywą nginx . Twój plik Docker musi mieć niestandardowy skrypt dla punktu wejścia, który generuje plik konfiguracyjny, a następnie uruchamia nginx. Powiedzmy, że masz plik o nazwie,nginx.conf.template
który wygląda mniej więcej tak:
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Skrypt startowy może następnie użyć
envsubst
programu do wygenerowania,nginx.conf
a następnie uruchomienia nginx. na przykład:
#!/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;"
UWAGA: w oknie dokowanym zwykle powstaje ten sam plik, ponieważ domyślnie jest to wbudowany serwer DNS okna dokowanego127.0.0.11
, zobacz tę odpowiedź na Docker Network Nginx Resolver .
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)
. Nie ma potrzebycat
,grep
anitr
tam.Jeśli twój system używa resolvconf (jak wiele maszyn wirtualnych, ale niestety Docker tego nie robi, zobacz
man 8 resolvconf
), możesz utworzyć nginxresolvers.conf
(jak w drugiej odpowiedzi) w/etc/resolvconf/update-libc.d/nginx
. Zachowuje się to ładnie nawet w rzadkim przypadku dynamicznej zmiany resolwera.Niektóre dystrybucje linuksowe zawierają
/etc/nginx/conf.d/*.conf
domyślną konfigurację. Przeładowanie jest zwykle ignorowane, gdy usługa nie jest uruchomiona. Zauważ, że skrypt może być uruchamiany bez/usr/bin
PATH, więc możesz potrzebować bezwzględnej ścieżki do awk.źródło
Jeśli używasz wersji OpenGsty nginx, możesz użyć ich specjalnego
local
argumentu doresolver
dyrektywy, który po ustawieniu nalocal=on
to oznacza, że standardowa ścieżka/etc/resolv.conf
będzie używana przez resolver (więcej szczegółów w dokumentacji Openresty resolver ):źródło