resolver
Nginx proxy yapılandırmasında adres ayarlamak mümkün müdür /etc/resolv.conf
?
Örneğin liman işçisinde veya sanal ortamda yararlı olabilir.
resolver
Nginx proxy yapılandırmasında adres ayarlamak mümkün müdür /etc/resolv.conf
?
Örneğin liman işçisinde veya sanal ortamda yararlı olabilir.
Yanıtlar:
Ne yazık ki bunu yapmanın kolay bir yolu yok çünkü nginx kendi çözümleyici uygulamasını kullanıyor. Gördüğüm iki çözüm:
1) Çözümleyici listesini bir komut dosyasından oluşturur ve eklersiniz, örneğin:
echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/resolvers.conf
http {
include resolvers.conf;
}
2) nginx'i (çok) deneysel perl modülü gibi bir üçüncü taraf modülü ile yeniden derlersiniz ve değişken bir işleyici yazarsınız:
http {
perl_modules perl/lib;
perl_set $resolvers '
sub {
return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf");
};
resolver "$resolvers";
}
Şimdi, bir C kodlayıcı cehennemiyseniz (gözlerinizi biraz kan için hazırlayın), yine de bu şekilde çalışması için alternatif bir yama veya modül yazabilirsiniz.
Docker kullanıcıları için çözüm burada bulundu :
Docker kullanan insanlar için bir geçici çözüm vardır.
export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`
Bunun yaptığı tüm
nameserver
girişleri almak/etc/resolv.conf
ve bir satıra yazdırmaktır, böylece bunları nginxresolver
direktifiyle kullanabilirsiniz. Dockerfile dosyanızın giriş noktası için yapılandırma dosyasını oluşturan ve ardından nginx'i başlatan özel bir komut dosyasına sahip olması gerekir. Diyelimnginx.conf.template
ki şöyle bir dosya var :
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Başlangıç komut dosyanız daha sonra
envsubst
birnginx.conf
nginx oluşturmak ve başlatmak için programı kullanabilir . Örneğin:
#!/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;"
Docker'da bunun, varsayılan olarak docker katıştırılmış DNS sunucusunun olduğu gibi aynı dosyayla sonuçlanma eğiliminde olduğunu unutmayın, Docker Network Nginx Resolver için bu yanıta127.0.0.11
bakın .
Sisteminiz resolvconf kullanıyorsa (birçok sanal makinede olduğu gibi, ancak ne yazık ki Docker kullanmıyorsa, bkz. man 8 resolvconf
), İçinde nginx resolvers.conf
(diğer yanıtta olduğu gibi) oluşturabilirsiniz /etc/resolvconf/update-libc.d/nginx
. Bu, çözümleyicilerin nadir görülen dinamik değişimi durumunda bile iyi davranır.
#!/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
Bazı linux dağıtımları /etc/nginx/conf.d/*.conf
varsayılan yapılandırmalarına dahildir. Yeniden yükleme genellikle servis çalışmadığında dikkate alınmaz. Komut dosyasının /usr/bin
PATH olmadan çalıştırılabileceğine dikkat edin , bu nedenle awk için mutlak yola ihtiyacınız olabilir.
Eğer nginx ait Openresty sürümünü kullanıyorsanız, o zaman kendi özel kullanabilirsiniz local
için argüman resolver
seti için direktif local=on
, standart yolunu anlamına /etc/resolv.conf
Resolverde (daha fazla detay için bakınız tarafından kullanılacak Openresty çözümleyici docs ):
resolver local=on;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)
. Gerek yokcat
,grep
yatr
da orada.