ฉันได้ตั้งค่า Nginx เป็น reverse proxy load balancing ระหว่างสอง docker container ที่รันทั้งหมดบนเซิร์ฟเวอร์เดียวกัน เมื่อโหลดหน้าเว็บเป็นครั้งแรก หน้าเว็บโหลด แต่ฉันได้รับข้อผิดพลาด 404 จำนวนมากสำหรับไฟล์ css และ js ทั้งหมด:
เมื่อรีเฟรชหรือเปิดแท็บที่สอง ข้อผิดพลาดเหล่านี้จะหายไปและโหลดหน้าเว็บได้ตามปกติ เมื่อฉันลดสิ่งนี้ลงเพื่อให้บริการคอนเทนเนอร์เดียวเท่านั้น มันก็ใช้ได้ดีเช่นเดียวกัน
ตอนแรกฉันคิดว่าเป็นเพราะมีการร้องขอ js และ css จาก root url เดียวกัน และโหลดบาลานเซอร์และคอนเทนเนอร์บางส่วนเกิดข้อผิดพลาด เนื่องจากกลุ่มคำขอสำหรับผู้ใช้รายเดียวมีความสมดุลระหว่างสองเซิร์ฟเวอร์ จากการทดลองเล็กน้อยฉันได้ลองใช้ proxy_set_header โฮสต์ $host
(มอง ที่นี่ และ ที่นี่ สำหรับคำตอบ) - ความเข้าใจของฉันคือสิ่งนี้ควรส่งคำขอที่ตามมาของผู้ใช้รายเดียวไปยังเซิร์ฟเวอร์อัปสตรีมเดียวกัน สิ่งนี้ดูเหมือนจะทำให้ปัญหาเกิดขึ้นน้อยมาก แต่ก็ไม่ได้กำจัดมันทั้งหมด
คำถามที่เหลือของฉัน (จากมือสมัครเล่นในการเรียนรู้!):
- นี่คือการใช้ที่ถูกต้องของ
proxy_set_header
และเป็นไปได้ไหมที่จะให้บริการ js/css จากเซิร์ฟเวอร์อัปสตรีมเดียวกันไปยังผู้ใช้รายเดียว แทนที่จะจัดสรรภาระงานให้กับคำขอที่ค่อนข้างเล็กเหล่านี้ในเซิร์ฟเวอร์สองเครื่อง
- นี่เป็นต้นตอของปัญหาหรือไม่ที่คอนเทนเนอร์ที่สองต้องตอบสนองต่อคำขอบางส่วนที่แจ้งโดยการโหลดหน้าสำหรับคอนเทนเนอร์แรก การตอบสนองเหล่านี้ไม่เข้าแถวกัน
- ฐานผู้ใช้ของฉันคือผู้ใช้ 100-200 รายพร้อมกันที่เข้าถึง URL ระยะไกลจากที่เดียว ฉันไม่คิดว่า
ip_hash
จะทำงานตามที่ร้องขอทั้งหมดจะมาจาก IP เดียวกันหรือไม่ มีวิธีอื่นในการผูกผู้ใช้รายเดียวเข้ากับเซิร์ฟเวอร์เครื่องเดียวอย่างมีประสิทธิภาพมากขึ้นหรือไม่
ไฟล์กำหนดค่า nginx ของฉัน:
แบ็กเอนด์ต้นน้ำ {
little_conn;
เซิร์ฟเวอร์ localhost:4000;
เซิร์ฟเวอร์ localhost:4001;
}
เซิร์ฟเวอร์ {
ฟัง 80;
ฟัง [::]:80;
ชื่อเซิร์ฟเวอร์ xxxxxxxxxx;
ที่ตั้ง / {
proxy_pass http://แบ็กเอนด์;
proxy_redirect http://backend/ $scheme://$host/;
proxy_http_version 1.1;
proxy_set_header อัพเกรด $http_upgrade;
proxy_set_header โฮสต์ $host;
proxy_set_header การเชื่อมต่อ $connection_upgrade;
proxy_read_timeout 20d;
ปิด proxy_buffering;
}
}