Saya menjalankan beberapa wadah buruh pelabuhan dengan nama host:
web1.local web2.local web3.local
Routing ke ini dilakukan berdasarkan hostname oleh nginx. Saya memiliki proxy di depan pengaturan ini (pada mesin yang berbeda terhubung ke internet) di mana saya mendefinisikan hulu sebagai:
upstream main {
server web1.local:80;
server web2.local:80;
server web3.local:80;
}
Dan deskripsi host virtual aktual:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://main;
}
}
Sekarang, karena kontainer menerima nama host "utama" alih-alih "web1.local", mereka tidak menanggapi permintaan dengan benar.
Pertanyaan: bagaimana saya bisa memberi tahu nginx untuk memberikan nama server upstream alih-alih nama grup server upstream di Host: header ketika meminta proxy?
nginx
reverse-proxy
pavel_karoukin
sumber
sumber
Jawaban:
Sebenarnya Anda bisa melakukannya melalui proxy_set_header.
Untuk lebih jelasnya lihat di sini: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header atau lihat contoh kasus penggunaan di sini: https://stackoverflow.com/questions/12847771/configure-nginx- dengan-proxy-pass
Saya telah memasukkan pendekatan dinamis ke dalam konfigurasi yang Anda posting di atas:
Berikut ini adalah contoh dengan nama host statis:
sumber
site1.myisp.com
dansite2.myisp.com
dan mereka hanya menanggapi nama mereka masing-masing. Saya, sekarang, memiliki nama domain saya dan saya ingin menggunakan situs web ISP saya untuk memuat saldo server saya. Bukankah itu alasan yang bagus? Terima kasih banyak;)Saya memiliki masalah yang sama dan saya akhirnya menyelesaikannya dengan menggunakan dua tingkat proxy. Inilah yang dapat Anda lakukan untuk situasi Anda (saya pikir):
Seperti yang Anda lihat, triknya adalah membuat server lokal merespons port tertentu yang akan mem-proxy server dengan menulis ulang Host yang tepat untuk setiap server. Kemudian, Anda dapat menggunakan server lokal ini di hulu Anda dan akhirnya menggunakannya hulu di proksi nyata.
sumber
Jadi dari membaca semua dokumentasi untuk nginx (saya tidak dapat benar-benar menguraikan kode untuk modul hulu = () Saya datang dengan solusi bastardized ini. Sayangnya solusi ini tidak melacak host yang gagal, tetapi cukup pilih satu acak dan arahkan permintaan ke sana. Jadi saya harus mengatur semacam pemantauan untuk memastikan semua backend berjalan.
sumber
Kami meneruskan addr upstream sebagai header terpisah seperti ini
Bagaimana jika Anda mencobanya?
sumber
Meskipun tujuannya tampak logis, nginx tidak akan mengubah header Host: agar sesuai dengan hulu . Sebaliknya, ia memperlakukan
upstream
nama domain sepertiCNAME
di DNS - sebagai cara untuk mendapatkan alamat IP.Tajuk permintaan (dan isi) diperbaiki sebelum hulu dipilih. Hulu dapat mengubah pertengahan permintaan jika hulu tertentu ternyata tidak responsif, tetapi permintaan tidak berubah.
sumber
Hmm. Saya memiliki pengaturan yang sama, di mana saya hanya selesai
Penggunaan
$http_host
(tajuk Host HTTP dari permintaan masuk) di sini alih-alih$host
(konfigurasi nama host server) menyebabkan tajuk Host yang sama yang dilewatkan oleh klien untuk diteruskan ke hulu, dalam pengujian saya.Lihat juga https://stackoverflow.com/questions/14352690/change-host-header-in-nginx-reverse-proxy .
sumber
Karena orang lain sudah memposting menggunakan variabel skrip (seperti $ hulu), Anda dapat mengaturnya sesuka Anda, dan itu akan memperbaiki masalah, tanpa peretasan header tambahan.
Variabel skrip ancaman penangan Proxy Pass dengan cara yang berbeda, jika nilai tidak bersyarat (tidak memiliki $ pada nama) didukung ke hulu pada tahap konfigurasi dan digunakan nanti.
Cara sederhana untuk menghilangkan masalah ini, dan memiliki kelebihan (versi gratis) hulu akan menggunakan sesuatu seperti
Split_Clients
:Contoh di atas terlihat hampir sama dengan hulu. Ada modul-modul lain yang melakukan pemetaan, yaitu chash_map_module , tetapi karena mereka keluar dari pohon, Anda harus membuatnya sendiri, yang tidak mungkin dilakukan untuk beberapa kasus penggunaan /
sumber