เรามีแอพทางรถไฟหลายตัวภายใต้โดเมนทั่วไปใน Docker และเราใช้ nginx เพื่อส่งคำขอไปยังแอพเฉพาะ
our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar
Config มีลักษณะดังนี้:
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...
}
หากแอปใดแอปหนึ่งเหล่านี้ไม่เริ่มทำงาน nginx จะล้มเหลวและหยุดทำงาน:
host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6
เราไม่ต้องการให้พวกเขาทั้งหมดขึ้น แต่ nginx ล้มเหลวเป็นอย่างอื่น จะทำให้ nginx ละเว้นต้นน้ำล้มเหลวได้อย่างไร
resolver
( nginx.org/en/docs/http/ngx_http_core_module.html#resolver ) จะใช้ได้ผลไหมในกรณีของคุณ
proxy.sh
สคริปต์ที่อ่านตัวแปรสภาพแวดล้อมและเพิ่มupstream
รายการแบบไดนามิกสำหรับแต่ละรายการจากนั้นเริ่ม Nginx สิ่งนี้ใช้งานได้ดีเมื่อเราเรียกใช้พร็อกซีคอนเทนเนอร์ของเราเราสามารถส่งผ่านอัปสตรีมที่จำเป็นในรันไทม์ได้ คุณสามารถทำสิ่งที่คล้ายกับการเปิด / ปิดการใช้งานอัปสตรีมบางอย่างเมื่อเปิดตัว(หรือเช่นเดียวกับการตั้งค่าของฉันเพียงแค่เพิ่มสิ่งที่จำเป็นในรันไทม์)
upstream
บล็อกไม่สามารถแก้ไขได้เมื่อรันไทม์ Nginx จะออกพร้อมกับข้อผิดพลาดข้างต้น ...