Apakah mungkin untuk mengatur resolveralamat di konfigurasi proxy nginx /etc/resolv.conf?
Ini bisa berguna misalnya di buruh pelabuhan atau di lingkungan virtual.
Apakah mungkin untuk mengatur resolveralamat 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
nameserverentri dari/etc/resolv.confdan mencetaknya dalam satu baris, sehingga Anda dapat menggunakannya denganresolverarahan nginx . Dockerfile Anda harus memiliki skrip khusus untuk titik masuk yang menghasilkan file konfigurasi dan kemudian mulai nginx. Katakanlah Anda memiliki file bernamanginx.conf.templateyang terlihat seperti:
...snip...
http {
server {
resolver $NAMESERVER valid=10s;
...snip....
}
}
}
Skrip startup Anda kemudian dapat menggunakan
envsubstprogram untuk menghasilkannginx.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 .
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.
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;
export NAMESERVER=$(awk '/^nameserver/{print $2}' /etc/resolv.conf). Tidak perlucat,grepatautrdi sana.