Adres resolvera Nginx z /etc/resolv.conf

18

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.

Nikołaj Golub
źródło

Odpowiedzi:

16

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.

Xavier Lucas
źródło
6

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 z resolverdyrektywą 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 .

FelikZ
źródło
2
Awk, nauczyć go, że to fantastyczne narzędzie dla munging tekstowy: export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Nie ma potrzeby cat, grepani trtam.
j0057
nie działa to jednak na Kubernetes.
Kim
1

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.

Marko Kohtala
źródło
1

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;
Pierz
źródło