วิธีการแก้ไขข้อผิดพลาดไทม์เอาต์ของผู้ปฏิบัติงานวิกฤติของ gunicorn?


26

ฉันใช้ nginx และ gunicorn เพื่อโฮสต์เว็บไซต์ของฉันในเซิร์ฟเวอร์สองเครื่อง

เซิร์ฟเวอร์ทั้งสองมีแพคเกจรุ่นเดียวกันและโฮสต์เว็บไซต์สำเร็จแล้ว

แต่หนึ่งใน Gunicorn เซิร์ฟเวอร์ตัวหนึ่งของฉันมักจะได้รับการหยุดพัก

[CRITICAL]Worker Timeout
Booting worker with pid
Worker cannot boot with pid

หลังจากนี้ฉันได้รับข้อผิดพลาด 502 Badgateway ในหน้าเว็บ ฉันต้องรีสตาร์ทกระบวนการ gunicorn เพื่อเปิดเว็บไซต์

ต่อไปนี้เป็นบันทึกข้อผิดพลาด:

2014-02-16 14:29:53 [1267] [CRITICAL] WORKER TIMEOUT (pid:4994)
2014-02-16 14:29:53 [1267] [CRITICAL] WORKER TIMEOUT (pid:4994)   
2014-02-16 14:29:53 [22140] [INFO] Booting worker with pid: 22140

และฉันได้รับข้อผิดพลาดต่อเนื่องเช่นนี้

2014-02-16 14:29:53 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE
2014-02-16 14:29:53 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE
2014-02-16 14:29:57 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE

และคนงานก็เริ่มใหม่อีกครั้ง

2014-02-16 14:32:44 [1267] [CRITICAL] WORKER TIMEOUT (pid:4993)
2014-02-16 14:32:44 [1267] [CRITICAL] WORKER TIMEOUT (pid:4993)
2014-02-16 14:32:44 [22276] [INFO] Booting worker with pid: 22276

ละเว้นข้อผิดพลาด EPIPE อีกครั้งและจะดำเนินต่อไปจนกว่าฉันจะเริ่มต้นใหม่ gunicorn และเมื่อฉันได้รับข้อผิดพลาดนี้ฉันจะได้รับข้อผิดพลาด 504 เกตเวย์จาก nginx


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

ติดตามคนงานเพื่อดูว่ามันติดอยู่ที่ไหน:strace -p <PID> -e trace=network -t
รัยเลอิตเทาโร

แอปพลิเคชันที่คุณใช้คืออะไร คุณอาจต้องการเพิ่มการหมดเวลาเริ่มต้น
Burhan Khalid

ใช่ Burhan Khalid ตอนนี้ฉันได้เพิ่ม proxy_read_timeout เป็น 1200 ใน nginx และหมดเวลาเป็น 3600 ในการกำหนดค่า gunicorn หวังว่ามันจะใช้ได้
sm

@sm - มันทำงานอย่างไร
iamkhush

คำตอบ:


29

ในการแก้ไขปัญหานี้ให้เพิ่มค่าการหมดเวลาใน Nginx

ในการเพิ่ม Nginx proxy_connect_timeoutและproxy_read_timeoutคุณสามารถเพิ่มสิ่งต่อไปนี้ในไฟล์ nginx.conf ภายใต้httpคำสั่ง พวกเขาเริ่มต้นที่ 60s

proxy_connect_timeout 300 วินาที

proxy_read_timeout 300 วินาที

รีสตาร์ทเซิร์ฟเวอร์ Nginx ดูเอกสาร Nginx บนหมดเวลา

หากการแก้ไขด้านบนไม่ทำงานให้เพิ่มค่าการหมดเวลาของ Gunicorn ในการกำหนดค่า Gunicorn การหมดเวลาของ Gunicorn ที่เป็นค่าเริ่มต้นคือ 30 วินาที

- หมดเวลา 90

เอกสารของ Gunicorn เกี่ยวกับการหมดเวลา

-t INT, - หมดเวลา INT 30 คนทำงานเงียบกว่าหลายวินาทีนี้จะถูกฆ่าและรีสตาร์ท

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

Gunicorn Docs เกี่ยวกับ Timeouts ของผู้ปฏิบัติงาน

หวังว่ามันจะช่วยได้


2
ทางออกนี้ช่วยชีวิตฉันหลังจากที่ฉันหาทางออกตลอดทั้งวัน หากคุณมีกระบวนการที่ใช้เวลานานกว่า 30 วินาที (ซึ่งเป็นปัญหาของฉัน) นี่คือทางออกที่ถูกต้องแน่นอน
Alex P. Miller

ใช่แม้เราจะมีสถานการณ์จำลองที่ใช้เวลานานกว่า 30 วินาทีดังนั้นเราจึงเลือกใช้โซลูชัน มันช่วยได้ดี
ชาวกรีก

เราไม่มีสถานการณ์แบบนั้น มีการจราจรติดขัดเล็กน้อยบนเว็บไซต์ แต่คนงานหยุดงานในแต่ละวันเกือบจะในเวลาเดียวกัน จากนั้นจึงเริ่มทำงานหลังจาก 1-2 นาที การตั้งค่าของฉันคือ nginx - ผู้ควบคุม - gunicorn - django ฉันหมดเวลา 120 วินาที
iamkhush

proxy_connect_timeout: "กำหนดหมดเวลาสำหรับการสร้างการเชื่อมต่อกับเซิร์ฟเวอร์พร็อกซีควรสังเกตว่าการหมดเวลานี้มักจะไม่เกิน 75 วินาที "
deweydb

@iamkhush คุณสามารถหาคำตอบสำหรับปัญหานี้ได้หรือไม่? ฉันยังประสบปัญหานี้แม้ว่าแอปพลิเคชันของฉันจะไม่ทำงาน คนงานของ Gunicorn หมดเวลาทุกวันและไม่มีทางแก้ปัญหาเช่นเพิ่มการหมดเวลา
Ankit Jaiswal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.