Alamat penyelesaian nginx dari /etc/resolv.conf


18

Apakah mungkin untuk mengatur resolveralamat di konfigurasi proxy nginx /etc/resolv.conf?

Ini bisa berguna misalnya di buruh pelabuhan atau di lingkungan virtual.

Jawaban:


16

Sayangnya tidak ada cara mudah untuk melakukan ini karena nginx menggunakan implementasi resolver itu sendiri. Dua solusi yang saya lihat adalah:

1) Anda menghasilkan daftar resolver dari skrip dan memasukkannya, misalnya:

echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/resolvers.conf

http {

    include resolvers.conf;

}

2) Anda mengkompilasi ulang nginx dengan modul pihak ketiga seperti modul perl eksperimental (sangat) dan menulis penangan variabel:

http {

    perl_modules perl/lib;
    perl_set $resolvers '

        sub {
            return system("awk BEGIN{ORS=\" \"} /nameserver/{print \$2}" /etc/resolv.conf");
        };

    resolver "$resolvers";
}

Sekarang, jika Anda adalah seorang pembuat kode C (persiapkan mata Anda untuk mendapatkan darah), Anda masih bisa menulis patch atau modul alternatif untuk membuatnya bekerja dengan cara ini.


6

Untuk pengguna Docker, solusi ditemukan di sini :

Inilah solusi untuk orang yang menggunakan Docker.

export NAMESERVER=`cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' '`

Apa yang dilakukan adalah mengambil semua nameserverentri dari /etc/resolv.confdan mencetaknya dalam satu baris, sehingga Anda dapat menggunakannya dengan resolverarahan nginx . Dockerfile Anda harus memiliki skrip khusus untuk titik masuk yang menghasilkan file konfigurasi dan kemudian mulai nginx. Katakanlah Anda memiliki file bernama nginx.conf.templateyang terlihat seperti:

...snip...
http {
  server {

    resolver $NAMESERVER valid=10s;

    ...snip....  
    }
  }
}

Skrip startup Anda kemudian dapat menggunakan envsubstprogram untuk menghasilkan nginx.confdan kemudian memulai nginx. misalnya:

#!/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;"

CATATAN bahwa di buruh pelabuhan ini cenderung menghasilkan file yang sama, seperti secara default server DNS yang tertanam buruh pelabuhan 127.0.0.11, lihat jawaban ini untuk Docker Network Nginx Resolver .


2
Awk, belajar, itu alat yang fantastis untuk munging teks: export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Tidak perlu cat, grepatau trdi sana.
j0057

ini tidak bekerja di Kubernetes.
Kim

1

Jika sistem Anda menggunakan resolvconf (seperti yang dilakukan banyak mesin virtual, tetapi sayangnya Docker tidak, lihat man 8 resolvconf), Anda dapat membuat nginx resolvers.conf(seperti pada jawaban lain) di /etc/resolvconf/update-libc.d/nginx. Ini berperilaku baik bahkan dalam kasus langka dari perubahan dinamis dari resolvers.

#!/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

Beberapa distribusi linux termasuk /etc/nginx/conf.d/*.confdalam konfigurasi default mereka. Reload biasanya diabaikan ketika layanan tidak berjalan. Perhatikan bahwa skrip dapat dijalankan tanpa /usr/bindi PATH, jadi Anda mungkin perlu path absolut untuk awk.


1

Jika Anda menggunakan versi Openresty dari nginx maka Anda dapat menggunakan localargumen khusus mereka ke resolverarahan yang ketika diatur local=on, berarti jalur standar /etc/resolv.confakan digunakan oleh resolver (untuk detail lebih lanjut lihat dokumen resolver Openresty resolver ):

resolver local=on;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.