Ist es möglich, die resolver
Adresse in der Nginx-Proxy-Konfiguration von einzustellen /etc/resolv.conf
?
Dies kann beispielsweise im Docker oder in einer virtuellen Umgebung hilfreich sein.
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.
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
nameserver
Einträge/etc/resolv.conf
entnommen und in einer Zeile gedruckt, sodass Sie sie mit derresolver
Direktive 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 Namennginx.conf.template
, die ungefähr so aussieht:
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Ihr Startskript kann dann das
envsubst
Programm verwenden, um eine zu generierennginx.conf
und 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 .
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)
. Keine Notwendigkeit fürcat
,grep
odertr
dort.Wenn Ihr System resolvconf verwendet (wie viele virtuelle Maschinen, aber Docker leider nicht
man 8 resolvconf
), können Sie das nginxresolvers.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.Einige Linux-Distributionen sind
/etc/nginx/conf.d/*.conf
in der Standardkonfiguration enthalten. Das Neuladen wird normalerweise ignoriert, wenn der Dienst nicht ausgeführt wird. Beachten Sie, dass das Skript möglicherweise ohne/usr/bin
PATH ausgeführt wird. Daher benötigen Sie möglicherweise einen absoluten Pfad zu awk.quelle
Wenn Sie die Openresty-Version von nginx verwenden, können Sie deren spezielles
local
Argument für dieresolver
Direktive verwenden. Wenn dieses Argument auf gesetzt istlocal=on
, bedeutet dies, dass der Standardpfad von/etc/resolv.conf
vom Resolver verwendet wird (weitere Informationen finden Sie in den Openresty-Resolver-Dokumenten ):quelle