Czy można ustawić resolveradres w konfiguracji proxy Nginx /etc/resolv.conf?
Może być przydatny na przykład w oknie dokowanym lub w środowisku wirtualnym.
Czy można ustawić resolveradres w konfiguracji proxy Nginx /etc/resolv.conf?
Może być przydatny na przykład w oknie dokowanym lub w środowisku wirtualnym.
Odpowiedzi:
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
nameserverwpisów/etc/resolv.confi wydrukowanie ich w linii, dzięki czemu można ich używać zgodnie zresolverdyrektywą 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.templatektóry wygląda mniej więcej tak:
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Skrypt startowy może następnie użyć
envsubstprogramu do wygenerowania,nginx.confa 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 .
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ć nginx resolvers.conf(jak w drugiej odpowiedzi) w /etc/resolvconf/update-libc.d/nginx. Zachowuje się to ładnie nawet w rzadkim przypadku dynamicznej zmiany resolwera.
#!/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
Niektóre dystrybucje linuksowe zawierają /etc/nginx/conf.d/*.confdomyślną konfigurację. Przeładowanie jest zwykle ignorowane, gdy usługa nie jest uruchomiona. Zauważ, że skrypt może być uruchamiany bez /usr/binPATH, więc możesz potrzebować bezwzględnej ścieżki do awk.
Jeśli używasz wersji OpenGsty nginx, możesz użyć ich specjalnego localargumentu do resolverdyrektywy, który po ustawieniu na local=onto oznacza, że standardowa ścieżka /etc/resolv.confbędzie używana przez resolver (więcej szczegółów w dokumentacji Openresty resolver ):
resolver local=on;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Nie ma potrzebycat,grepanitrtam.