Nginx-Resolver-Adresse aus /etc/resolv.conf

18

Ist es möglich, die resolverAdresse in der Nginx-Proxy-Konfiguration von einzustellen /etc/resolv.conf?

Dies kann beispielsweise im Docker oder in einer virtuellen Umgebung hilfreich sein.

Nikolai Golub
quelle

Antworten:

16

Leider gibt es keine einfache Möglichkeit, dies zu tun, da Nginx eine eigene Resolver-Implementierung verwendet. Die zwei Lösungen, die ich sehe, sind:

1) Sie generieren die Resolverliste aus einem Skript und fügen sie ein, zB:

echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/resolvers.conf

http {

    include resolvers.conf;

}

2) Sie kompilieren nginx mit einem Drittanbieter-Modul wie dem (sehr) experimentellen Perl-Modul neu und schreiben einen Variablen-Handler:

http {

    perl_modules perl/lib;
    perl_set $resolvers '

        sub {
            return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf");
        };

    resolver "$resolvers";
}

Wenn Sie ein absoluter C-Coder sind (bereiten Sie Ihre Augen auf etwas Blut vor), können Sie dennoch einen alternativen Patch oder ein alternatives Modul schreiben, damit es auf diese Weise funktioniert.

Xavier Lucas
quelle
6

Die Lösung für Docker-Benutzer finden Sie hier :

Hier ist eine Problemumgehung für Benutzer von Docker.

export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`

Dabei werden alle nameserverEinträge /etc/resolv.confentnommen und in einer Zeile gedruckt, sodass Sie sie mit der resolverDirektive von nginx verwenden können . Ihre Docker-Datei benötigt ein benutzerdefiniertes Skript für den Entypoint, der die Konfigurationsdatei generiert und dann nginx startet. Nehmen wir an, Sie haben eine Datei mit dem Namen nginx.conf.template, die ungefähr so ​​aussieht:

...snip...
http {
  server {

    resolver $NAMESERVER valid=10s;

    ...snip....  
    }
  }
}

Ihr Startskript kann dann das envsubstProgramm verwenden, um eine zu generieren nginx.confund dann Nginx zu starten. z.B:

#!/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;"

HINWEIS: In Docker führt dies in der Regel zu der gleichen Datei wie der standardmäßig in Docker eingebettete DNS-Server. Weitere Informationen finden127.0.0.11 Sie in dieser Antwort zu Docker Network Nginx Resolver .

FelikZ
quelle
2
Awk, erfahren Sie es, es ist ein fantastisches Werkzeug für Text munging: export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Keine Notwendigkeit für cat, grepoder trdort.
J0057
Dies funktioniert jedoch nicht auf Kubernetes.
Kim
1

Wenn Ihr System resolvconf verwendet (wie viele virtuelle Maschinen, aber Docker leider nicht man 8 resolvconf), können Sie das nginx resolvers.conf(wie in der anderen Antwort) in erstellen /etc/resolvconf/update-libc.d/nginx. Dies verhält sich auch im seltenen Fall einer dynamischen Änderung von Resolvern gut.

#!/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

Einige Linux-Distributionen sind /etc/nginx/conf.d/*.confin der Standardkonfiguration enthalten. Das Neuladen wird normalerweise ignoriert, wenn der Dienst nicht ausgeführt wird. Beachten Sie, dass das Skript möglicherweise ohne /usr/binPATH ausgeführt wird. Daher benötigen Sie möglicherweise einen absoluten Pfad zu awk.

Marko Kohtala
quelle
1

Wenn Sie die Openresty-Version von nginx verwenden, können Sie deren spezielles localArgument für die resolverDirektive verwenden. Wenn dieses Argument auf gesetzt ist local=on, bedeutet dies, dass der Standardpfad von /etc/resolv.confvom Resolver verwendet wird (weitere Informationen finden Sie in den Openresty-Resolver-Dokumenten ):

resolver local=on;
Pierz
quelle