GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara memaksa nginx untuk menyelesaikan DNS (nama host dinamis) setiap kali melakukan proxy_pass?

Solusi 1:

Jawaban yang diterima tidak bekerja untuk saya di nginx/1.4.2.

Menggunakan variabel di proxy_pass memaksa resolusi ulang nama DNS karena NGINX memperlakukan variabel secara berbeda dengan konfigurasi statis. Dari NGINX proxy_pass dokumentasi:

Nilai parameter dapat berisi variabel. Dalam hal ini, jika sebuah alamat ditentukan sebagai nama domain, nama tersebut dicari di antara grup server yang dijelaskan, dan, jika tidak ditemukan, ditentukan menggunakan penyelesai.

Misalnya:

server {
    ...
    resolver 127.0.0.1;
    set $backend "http://dynamic.example.com:80";
    proxy_pass $backend;
    ...
}

Catatan:Penyelesai (yaitu server nama yang akan digunakan) HARUS tersedia dan dikonfigurasi agar ini berfungsi (dan entri di dalam /etc/hosts file tidak akan digunakan dalam pencarian).

Secara default, versi 1.1.9 atau versi yang lebih baru dari cache NGINX menjawab menggunakan nilai TTL dari respons dan valid opsional parameter memungkinkan waktu cache diganti:

resolver 127.0.0.1 [::1]:5353 valid=30s;

Sebelum versi 1.1.9, penyetelan waktu caching tidak dimungkinkan, dan nginx selalu meng-cache jawaban selama 5 menit. .

Solusi 2:

Ada informasi berharga di komentar gansbrest dan jawaban ohaal.

Tapi menurut saya penting untuk menyebutkan artikel resmi nginx ini, yang diposting pada tahun 2016, dengan jelas menjelaskan perilaku nginx tentang masalah ini dan kemungkinan solusinya:https://www.nginx.com/blog/dns-service-discovery-nginx-plus //P>

Kami memang harus "Menyetel Nama Domain dalam Variabel" dan menggunakan direktif penyelesai.

namun, menggunakan variabel mengubah perilaku penulisan ulang. Anda mungkin harus menggunakan direktif penulisan ulang, tergantung pada lokasi dan penyiapan proxy_pass Anda.

PS:ingin memposting komentar tetapi belum cukup poin...

Solusi 3:

Itu pertanyaan yang menarik dan AFAIK itu tidak akan bekerja dengan baik. Anda dapat mencoba menggunakan modul upstream dan menggunakan arahan untuk failover untuk melihat apakah ini berfungsi sebagai peretasan.

Suntingan 2018:banyak hal berubah. Periksa jawabannya oleh @ohaal untuk mendapatkan informasi sebenarnya tentang ini.

Solusi 4:

jawaban ohaal membawa sebagian besar dari kita ke sana, tetapi ada kasus di mana penyelesai DNS tidak hidup di 127.0.0.1 (mis. saat Anda berada di lingkungan kemas khusus)

Dalam hal ini, Anda mungkin ingin mengubah conf nginx menjadi resolver ${DNS_SERVER}; . Lalu, sebelum Anda memulai nginx, jalankan

export DNS_SERVER=$(cat /etc/resolv.conf |grep -i '^nameserver'|head -n1|cut -d ' ' -f2)
envsubst '${DNS_SERVER}' < your_nginx.conf.template > your_nginx.conf

Perhatikan, bahwa Anda memerlukan gettext paket diinstal, karena menyediakan envsubst perintah.


Linux
  1. Cara Menonaktifkan ETag di NGINX

  2. Pemecahan Masalah:Tidak Dapat Menyelesaikan Nama Inang

  3. Pemecahan Masalah Dns. Domain Kampus Tidak Menyelesaikan Saat Menggunakan Jaringan Kampus?

  1. nginx - 413 Permintaan Entitas Terlalu Besar

  2. Bagaimana cara menonaktifkan permintaan kata sandi saat melakukan git push/pull?

  3. Bagaimana saya bisa menyelesaikan nama host ke alamat IP dalam skrip Bash?

  1. Cara Menyebarkan Server DNS Dinamis dengan Docker di Debian 10

  2. Cara Mengaktifkan HTTP2 di NGINX

  3. Bagaimana Cara Menyelesaikan Nama Host Ke Alamat Ip Dalam Skrip Bash?