resolverNginx 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.
resolverNginx 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
nameservergirişleri almak/etc/resolv.confve bir satıra yazdırmaktır, böylece bunları nginxresolverdirektifiyle 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.templateki şöyle bir dosya var :
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Başlangıç komut dosyanız daha sonra
envsubstbirnginx.confnginx 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/*.confvarsayılan yapılandırmalarına dahildir. Yeniden yükleme genellikle servis çalışmadığında dikkate alınmaz. Komut dosyasının /usr/binPATH 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 localiçin argüman resolverseti için direktif local=on, standart yolunu anlamına /etc/resolv.confResolverde (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,grepyatrda orada.