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.
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.
Antworten:
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
nameserverEinträge/etc/resolv.confentnommen und in einer Zeile gedruckt, sodass Sie sie mit derresolverDirektive 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
envsubstProgramm verwenden, um eine zu generierennginx.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 .
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.
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;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Keine Notwendigkeit fürcat,grepodertrdort.