/Etc/resolv.conf sitesinden Nginx çözümleyici adresi


18

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:


16

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.


6

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ı nginx resolverdirektifiyle 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. Diyelim nginx.conf.templateki şöyle bir dosya var :

...snip...
http {
  server {

    resolver $NAMESERVER valid=10s;

    ...snip....  
    }
  }
}

Başlangıç ​​komut dosyanız daha sonra envsubstbir nginx.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 .


2
Awk, bu metin munging için harika bir araçtır, bunu öğrenmek: export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Gerek yok cat, grepya trda orada.
j0057

bu Kubernetes üzerinde çalışmıyor.
Kim

1

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.


1

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.