Saya menggunakan nginx / 0.7.68, berjalan pada CentOS, dengan konfigurasi berikut:
server {
listen 80;
server_name ***;
index index.html index.htm index.php default.html default.htm default.php;
location / {
root /***;
proxy_pass http://***:8888;
index index.html index.htm;
}
# where *** is my variables
Ini proxy_pass
untuk catatan DNS yang IP-nya sering berubah. Nginx melakukan cache alamat IP yang kedaluwarsa, menghasilkan permintaan ke alamat IP yang salah.
Bagaimana saya bisa menghentikan nginx dari caching alamat IP, ketika sudah usang?
Jawaban:
Ini pertanyaan yang menarik dan AFAIK yang tidak akan bekerja dengan baik. Anda dapat mencoba menggunakan modul upstream dan menggunakan arahan untuk failover untuk melihat apakah itu berfungsi sebagai peretasan.
Sunting 2018: banyak hal berubah. Periksa jawabannya oleh @ohaal untuk mendapatkan informasi nyata tentang ini.
sumber
server
bendera hulu khususresolve
yang hanya tersedia dalam versi komersial (lihat nginx.org/en/docs/http/ngx_http_upstream_module.html#server )Jawaban yang diterima tidak berfungsi untuk saya di nginx / 1.4.2.
Menggunakan variabel yang
proxy_pass
memaksa resolusi ulang nama DNS karena NGINX memperlakukan variabel secara berbeda untuk konfigurasi statis. Dari dokumentasi NGINXproxy_pass
:Sebagai contoh:
Catatan: Penyelesai (yaitu server nama yang akan digunakan) HARUS tersedia dan dikonfigurasikan 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 jawaban cache NGINX menggunakan nilai TTL dari respons dan
valid
parameter opsional memungkinkan waktu cache ditimpa:Sebelum versi 1.1.9, penyetelan waktu caching tidak dimungkinkan, dan nginx selalu menyembunyikan jawaban selama 5 menit. .
sumber
In such setup ip address of "foo.example.com" will be looked up dynamically and result will be cached for 5 minutes.
Saya telah menambahkannya ke jawaban untuk kejelasan.set
di dalamnyalocation
tidak berfungsi dengan baik. WaspadalahBy default, nginx caches answers using the TTL value of a response. An optional valid parameter allows overriding it: resolver 127.0.0.1 [::1]:5353 valid=30s;
resolver 127.0.0.11 [::1]:5353 valid=15s;
Ada informasi berharga di komentar gansbrest dan jawaban ohaal.
Tapi saya pikir penting untuk menyebutkan artikel nginx resmi 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 /
Kita memang harus "Mengatur Nama Domain dalam Variabel" dan menggunakan arahan resolver .
Namun, menggunakan variabel mengubah perilaku menulis ulang. Anda mungkin harus menggunakan arahan penulisan ulang, itu tergantung pada lokasi Anda dan pengaturan proxy_pass.
PS: akan memposting komentar tetapi belum cukup poin ...
sumber
jawaban ohaal membawa sebagian besar dari kita ke sana, tetapi ada kasus di mana resolver DNS tidak hidup di 127.0.0.1 (mis. ketika Anda berada di lingkungan kemas khusus)
Dalam hal ini, Anda mungkin ingin mengubah conf nginx menjadi
resolver ${DNS_SERVER};
. Lalu, sebelum Anda memulai nginx, jalankansumber
Saya telah meretas sebuah skrip untuk menonton folder conf.d upstreams untuk perubahan dns dan memuat ulang nginx saat terdeteksi. Ini merupakan pass pertama, dan tentunya dapat ditingkatkan (pass berikutnya, saya akan menggunakan nginx -T untuk mengurai upstreams secara khusus. Ide yang sama dapat digunakan untuk arahan proxy_pass):
sumber