Apakah mungkin untuk mengatur resolver
alamat di konfigurasi proxy nginx /etc/resolv.conf
?
Ini bisa berguna misalnya di buruh pelabuhan atau di lingkungan virtual.
Apakah mungkin untuk mengatur resolver
alamat di konfigurasi proxy nginx /etc/resolv.conf
?
Ini bisa berguna misalnya di buruh pelabuhan atau di lingkungan virtual.
Jawaban:
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.
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
nameserver
entri dari/etc/resolv.conf
dan mencetaknya dalam satu baris, sehingga Anda dapat menggunakannya denganresolver
arahan nginx . Dockerfile Anda harus memiliki skrip khusus untuk titik masuk yang menghasilkan file konfigurasi dan kemudian mulai nginx. Katakanlah Anda memiliki file bernamanginx.conf.template
yang terlihat seperti:
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Skrip startup Anda kemudian dapat menggunakan
envsubst
program untuk menghasilkannginx.conf
dan 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 .
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/*.conf
dalam konfigurasi default mereka. Reload biasanya diabaikan ketika layanan tidak berjalan. Perhatikan bahwa skrip dapat dijalankan tanpa /usr/bin
di PATH, jadi Anda mungkin perlu path absolut untuk awk.
Jika Anda menggunakan versi Openresty dari nginx maka Anda dapat menggunakan local
argumen khusus mereka ke resolver
arahan yang ketika diatur local=on
, berarti jalur standar /etc/resolv.conf
akan digunakan oleh resolver (untuk detail lebih lanjut lihat dokumen resolver Openresty resolver ):
resolver local=on;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf)
. Tidak perlucat
,grep
atautr
di sana.