ฉันเริ่มใช้ Nginx เป็น reverse proxy สำหรับชุดเซิร์ฟเวอร์ที่ให้บริการบางประเภท
บริการอาจค่อนข้างช้าในบางครั้ง (การทำงานบน Java และ JVM บางครั้งอาจติดอยู่ใน "การรวบรวมขยะเต็ม" ซึ่งอาจใช้เวลาหลายวินาที) ดังนั้นฉันจึงตั้งค่าเป็นproxy_connect_timeout
2 วินาทีซึ่งจะทำให้ Nginx มีเวลาพอที่จะคิด ออกว่าบริการติดอยู่ใน GC และจะไม่ตอบสนองในเวลาและมันควรจะผ่านการร้องขอไปยังเซิร์ฟเวอร์ที่แตกต่างกัน
ฉันยังได้ตั้งค่าproxy_read_timeout
เพื่อป้องกันไม่ให้พร็อกซีย้อนกลับติดขัดหากบริการใช้เวลามากเกินไปในการคำนวณการตอบสนอง - อีกครั้งควรย้ายคำร้องขอไปยังเซิร์ฟเวอร์อื่นที่ควรจะว่างพอที่จะตอบกลับในเวลาที่เหมาะสม
ฉันใช้การวัดประสิทธิภาพบางอย่างและฉันสามารถเห็นได้อย่างชัดเจนว่าการproxy_connect_timeout
ทำงานอย่างถูกต้องตามที่คำขอบางอย่างกลับมาตรงตามเวลาที่กำหนดไว้สำหรับการหมดเวลาการเชื่อมต่อเนื่องจากบริการติดขัดและไม่ยอมรับการเชื่อมต่อขาเข้า (บริการกำลังใช้ Jetty ภาชนะ servlet) proxy_read_timeout
ยังทำงานที่ฉันสามารถดูการร้องขอว่าการกลับมาหลังจากที่หมดเวลาที่ระบุไว้มี
ปัญหาคือฉันคาดว่าจะเห็นคำขอบางอย่างที่หมดเวลาหลังจากproxy_read_timeout + proxy_connect_timeout
นั้นหรือเกือบระยะเวลานั้นถ้าบริการค้างอยู่และไม่ยอมรับการเชื่อมต่อเมื่อ Nginx พยายามเข้าถึงมัน แต่ก่อนที่ Nginx จะหมดเวลา - มันจะถูกปล่อยออกมา และเริ่มการประมวลผล แต่ช้าเกินไปและ Nginx จะยกเลิกเนื่องจากการหมดเวลาอ่าน ฉันเชื่อว่าบริการดังกล่าวมีกรณีดังกล่าว แต่หลังจากใช้การวัดประสิทธิภาพหลายครั้งรวมคำขอหลายล้านรายการ - ฉันไม่เห็นคำขอเดียวที่ส่งคืนสิ่งใด ๆ ข้างต้นproxy_read_timeout
(ซึ่งเป็นการหมดเวลาที่มากขึ้น)
ฉันจะขอบคุณความคิดเห็นใด ๆ เกี่ยวกับปัญหานี้แม้ว่าฉันคิดว่าอาจเป็นเพราะข้อผิดพลาดใน Nginx (ฉันยังไม่ได้ดูรหัสดังนั้นนี่เป็นเพียงข้อสันนิษฐาน) ว่าตัวนับการหมดเวลาไม่ได้รับการรีเซ็ตหลังจากการเชื่อมต่อ สำเร็จถ้า Nginx ไม่อ่านอะไรจากเซิร์ฟเวอร์ upstream
proxy_read_timeout
ไม่ใช่ "หมดเวลาทั่วโลก" แต่ระหว่างการดำเนินการอ่าน 2 ครั้ง
proxy_read_timeout + proxy_connect_timeout
ใช่ฉันรู้ว่าซึ่งเป็นเหตุผลที่ผมคาดว่าหมดเวลาที่จะรวม