Score:3

Nginx ไม่ให้บริการ js และ css เสมอเมื่อโหลดบาลานซ์ระหว่างคอนเทนเนอร์นักเทียบท่า - ทำงานเมื่อรีเฟรช

ธง us

ฉันได้ตั้งค่า Nginx เป็น reverse proxy load balancing ระหว่างสอง docker container ที่รันทั้งหมดบนเซิร์ฟเวอร์เดียวกัน เมื่อโหลดหน้าเว็บเป็นครั้งแรก หน้าเว็บโหลด แต่ฉันได้รับข้อผิดพลาด 404 จำนวนมากสำหรับไฟล์ css และ js ทั้งหมด:

ข้อผิดพลาด 404 จากการโหลดหน้าเว็บ

เมื่อรีเฟรชหรือเปิดแท็บที่สอง ข้อผิดพลาดเหล่านี้จะหายไปและโหลดหน้าเว็บได้ตามปกติ เมื่อฉันลดสิ่งนี้ลงเพื่อให้บริการคอนเทนเนอร์เดียวเท่านั้น มันก็ใช้ได้ดีเช่นเดียวกัน

ตอนแรกฉันคิดว่าเป็นเพราะมีการร้องขอ 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;
        }
}
ru flag
ดูบันทึกสำหรับ nginx ดูเหมือนว่า 404 ไม่ใช่การตอบสนองของ nginx แต่เป็นการตอบกลับส่วนหลัง
Andy Baxter avatar
us flag
ขอบคุณสำหรับสิ่งนี้. ใช่ ดูเหมือนว่าคำขอจะถูกส่งขึ้นไปบนสตรีมด้วยดี แต่เซิร์ฟเวอร์คอนเทนเนอร์นักเทียบท่ากลับตอบสนองอย่างรวดเร็ว ตอนนี้ฉันได้ลองใช้ `ip_hash` เพื่อเพิ่มความคงอยู่ให้กับแต่ละเซิร์ฟเวอร์และทดสอบจากสอง IP ฉันได้รับการตอบสนองที่สมบูรณ์แบบจากทั้งสอง ดูเหมือนว่าจะเป็นเมื่ออุปกรณ์หนึ่งส่งข้อความค้นหาตามลำดับไปยังทั้งสองปัญหาที่เกิดขึ้น

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา