Kami memiliki beberapa aplikasi rel di bawah domain umum di Docker, dan kami menggunakan nginx untuk mengarahkan permintaan ke aplikasi tertentu.
our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar
Config terlihat seperti ini:
upstream foo {
server foo:3000;
}
upstream bar {
server bar:3000;
}
# and about 10 more...
server {
listen *:80 default_server;
server_name our_dev_server.com;
location /foo {
# this is specific to asset management in rails dev
rewrite ^/foo/assets(/.*)$ /assets/$1 break;
rewrite ^/foo(/.*)$ /foo/$1 break;
proxy_pass http://foo;
}
location /bar {
rewrite ^/bar/assets(/.*)$ /assets/$1 break;
rewrite ^/bar(/.*)$ /bar/$1 break;
proxy_pass http://bar;
}
# and about 10 more...
}
Jika salah satu dari aplikasi ini tidak dimulai maka nginx gagal dan berhenti:
host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6
Kami tidak membutuhkan semuanya untuk aktif tetapi nginx gagal jika tidak. Bagaimana cara membuat nginx mengabaikan upstream yang gagal?
nginx
url-rewriting
proxypass
Morozov
sumber
sumber
upstream
blok tidak menyelesaikan, saat runtime, maka Nginx akan keluar dengan kesalahan di atas ...resolver
( nginx.org/en/docs/http/ngx_http_core_module.html#resolver ) akan berhasil dalam kasus Anda?proxy.sh
skrip yang membaca variabel lingkungan dan secara dinamis menambahkanupstream
entri untuk masing-masing variabel , lalu memulai Nginx. Ini bekerja dengan baik karena ketika kita menjalankan penampung proxy kita, kita dapat meneruskan upstream yang dibutuhkan pada waktu proses. Anda dapat melakukan sesuatu yang serupa untuk mengaktifkan / menonaktifkan hulu tertentu saat peluncuran (atau seperti penyiapan saya, tambahkan saja yang diperlukan saat runtime)Jawaban:
Jika Anda dapat menggunakan IP statis maka gunakan saja, itu akan startup dan hanya kembali
503
jika tidak merespon.Gunakan
resolver
arahan untuk menunjuk ke sesuatu yang dapat menyelesaikan masalah tuan rumah, terlepas dari apakah itu saat ini atau tidak.Selesaikan di
location
level, jika Anda tidak dapat melakukan hal di atas (ini akan memungkinkan Nginx untuk memulai / menjalankan) :sumber
location ~ ^/foo/(.*)$ { proxy_pass http://foo/$1; }
Bagi saya, opsi 3 dari jawaban dari @ Justin / @ senjawuff menyelesaikan masalah, tetapi saya harus mengubah IP resolver ke 127.0.0.11 (server DNS Docker):
Namun seperti yang disebutkan @ Justin / @ senjawuff, Anda dapat menggunakan server DNS eksternal lainnya.
sumber
Keuntungan utama penggunaan
upstream
adalah untuk menentukan sekelompok server yang dapat mendengarkan pada port yang berbeda dan mengonfigurasi load-balancing dan failover di antara mereka .Dalam kasus Anda, Anda hanya menentukan 1 server utama per upstream sehingga harus up .
Sebaliknya, gunakan variabel untuk Anda
proxy_pass
dan ingatlah untuk menangani kemungkinan kesalahan (404s, 503s) yang mungkin Anda dapatkan saat server target tidak aktif.sumber
set $variable http://foo
danproxy_pass $variable
dan menjaga foo "upstream" (untuk menjaga keuntungan yang Anda sebutkan) maka saya masih mengenai masalah yang disebutkan oleh OP.set $variable foo
danproxy_pass http://$variable
Saya mengalami masalah "Host tidak ditemukan" yang sama karena bagian dari host saya sedang dipetakan menggunakan,
$uri
bukan$request_uri
:Dan ketika permintaan berubah menjadi permintaan auth, nilai
$uri
awalnya hilang. Mengubah pemetaan untuk digunakan$request_uri
alih-alih$uri
menyelesaikan masalah saya:sumber
Anda tidak dapat menggunakan
--link
opsi, sebagai gantinya Anda dapat menggunakan pemetaan port dan mengikat nginx ke alamat host.Contoh: Jalankan kontainer buruh pelabuhan pertama Anda dengan
-p 180:80
opsi, kontainer kedua dengan-p 280:80
opsi.Jalankan nginx dan atur alamat ini untuk proxy:
sumber