การตั้งค่าแบบ Keepalive สำหรับ Gunicorn เบื้องหลัง ELB โดยไม่มี Nginx


15

REST API ของแอปของเราให้บริการโดย Gunicorn ( ไม่ใช่ Nginx) ที่ทำงานบนอินสแตนซ์ AWS EC2 ด้วยการตั้งค่าการปรับขนาดอัตโนมัติ / การโหลดบาลานซ์โดยทั่วไป การหมดเวลาว่างของตัวโหลดบาลานซ์คือ 60 วินาทีและการหมดเวลาการรักษาของ Gunicorn คือ 2 วินาที เราได้เห็น504 Gateway Timeoutการตอบสนองเป็นระยะ ๆจากการกำหนดค่านี้ ตามเอกสารของ Amazonอาจเป็นเพราะการหมดเวลาแบบเก็บสดของเซิร์ฟเวอร์ต่ำกว่าการตั้งค่าการหมดเวลาที่ไม่ได้ใช้งานของ load balancer:

สาเหตุที่ 2: อินสแตนซ์ที่ลงทะเบียนแล้วปิดการเชื่อมต่อกับ Elastic Load Balancing

โซลูชันที่ 2: เปิดใช้งานการตั้งค่าแบบ keep-alive ในอินสแตนซ์ EC2 ของคุณและตั้งค่าการหมดเวลาแบบ keep-alive ให้มากกว่าหรือเท่ากับการตั้งค่าการหมดเวลาที่ไม่ได้ใช้งานของตัวโหลดบาลานซ์ของคุณ

ด้วย Nginx ค่าเริ่มต้นkeepalive_timeoutคือ 75 วินาทีซึ่งเห็นได้ชัดว่าทำงานได้ดีกับการตั้งค่าเริ่มต้นของ ELB อย่างไรก็ตามGunicorn docsแนะนำการkeepaliveตั้งค่าในช่วง 1-5 วินาที

มันสมเหตุสมผลหรือไม่ที่จะชนกันเป็นเวลา 75 วินาทีของ Gunicorn หรือมีเหตุผลที่ดีที่จะทำให้มันต่ำกว่า 5 วินาทีแม้ว่าเราไม่ได้ใช้ reverse proxy อยู่ข้างหน้า

คำตอบ:


16

คุณเกือบจะต้องการเพิ่มตัวจับเวลา keepalive ตามคำแนะนำของ ELB เนื่องจาก ELB นำการเชื่อมต่อกลับมาใช้ใหม่ มันจะเก็บไว้จนกว่าจะหมดเวลาและหากมีการร้องขออื่นมาถึง ELB ก็มักจะใช้หนึ่งในการเชื่อมต่อที่เปิดอยู่แล้วเพื่อส่งให้คุณ

504 Gateway Timeout เป็นข้อผิดพลาดที่แปลกสำหรับเงื่อนไขนี้ แต่ปรากฏว่าเป็นสิ่งที่ ELB ส่งคืนเมื่อการเชื่อมต่อที่นำมาใช้ซ้ำเกิดขึ้นพร้อมกับการปิดก่อนกำหนดของ back-end

คำแนะนำ 5 วินาทีอาจสมเหตุสมผลถ้าเบราว์เซอร์สื่อสารกับส่วนหลังโดยตรง แต่นั่นไม่ใช่กรณีของ ELB ซึ่งเป็นพร็อกซีย้อนกลับที่เหมาะสมเมื่อทำงานในโหมด HTTP


ขอบคุณนี่คือสิ่งที่ฉันสงสัย ฉันจะลองใช้การเปลี่ยนแปลงนี้ในสัปดาห์นี้และทำเครื่องหมายคำตอบของคุณถูกต้องหากทุกอย่างเป็นไปอย่างราบรื่น :)
handsofaten

เรารวมการเปลี่ยนแปลงเกี่ยวกับสัปดาห์ที่แล้วและ 504s กลายเป็นเรื่องธรรมดาน้อยกว่ามาก (สองสามครั้งต่อสัปดาห์แทนที่จะเป็นสองร้อยครั้งต่อสัปดาห์)
Handsofaten
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.