502 Bad Gateway - ซ็อกเก็ตถูกวางสาย

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X
ข้อมูล

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์จะได้รับรหัสสถานะ HTTP เป็น 502 Bad Gateway พร้อมรหัส ECONNRESET เป็นการตอบกลับสำหรับการเรียก API ใน Edge Microgateway

ข้อความแสดงข้อผิดพลาด

ไคลเอ็นต์จะเห็นโค้ดตอบกลับต่อไปนี้

HTTP/1.1 502 Bad Gateway

การตอบกลับมีข้อความแสดงข้อผิดพลาดต่อไปนี้

{"message":"socket hang up","code":"ECONNRESET"}

สาเหตุที่เป็นไปได้

สาเหตุ คำอธิบาย วิธีการแก้ปัญหาที่ใช้กับ
ระยะหมดเวลาของ Keep-alive ที่กำหนดค่าไม่ถูกต้อง ระยะหมดเวลาของ Keep-alive ที่กำหนดค่าไม่ถูกต้องระหว่าง Edge Microgateway กับเซิร์ฟเวอร์เป้าหมาย ผู้ใช้ Edge Public และ Private Cloud
เซิร์ฟเวอร์เป้าหมายปิดการเชื่อมต่อก่อนกำหนด เซิร์ฟเวอร์เป้าหมายจะปิดการเชื่อมต่อก่อนกำหนดขณะที่ Edge Microgateway ส่งเพย์โหลดคำขอ ผู้ใช้ Edge Public และ Private Cloud

ขั้นตอนการวินิจฉัยทั่วไป

  1. ตรวจสอบบันทึก Edge Microgateway ดังนี้
    /var/tmp/edgemicro-`hostname`-*.log
    
  2. ค้นหาเพื่อดูว่ามีข้อผิดพลาด 502 ที่มีรหัส ECONNRESET ในช่วงเวลาที่ระบุหรือไม่ (หากเกิดปัญหาในอดีต) หรือมีคำขอใดที่ยังคงดำเนินการไม่สำเร็จเมื่อใช้ 502
    2021-06-23T03:52:24.110Z [error][0:8000][3][myorg][test]
    [emg_badtarget/flakey/hangup][][][6b089a00-d3d6-11eb-95aa-911f1ee6c684]
    [microgateway-core][][GET][502][socket hang up][ECONNRESET][]
    
  3. หากตั้งค่าระดับการบันทึกเป็น warn หรือ info จะมีข้อความ [warn] รวมถึงชื่อโฮสต์ของเซิร์ฟเวอร์เป้าหมายและพอร์ตในองค์ประกอบที่ 2 ด้วย ในตัวอย่างนี้คือ X.X.X.X:8080 และจะใช้ภายหลังเพื่อบันทึก tcpdump ได้
    2021-06-23T03:52:24.109Z
    [warn][X.X.X.X:8080][3][myorg][test][emg_badtarget/flakey/hangup]
    [][][6b089a00-d3d6-11eb-95aa-911f1ee6c684][plugins-middleware]
    [targetRequest error][GET][][socket hang up][ECONNRESET][395]
    
  4. รหัสข้อผิดพลาด [socket hang up][ECONNRESET] บ่งบอกว่าเซิร์ฟเวอร์เป้าหมายได้ปิดการเชื่อมต่อกับ Edge Microgateway แล้ว คุณค้นหานี้ในบันทึกเพื่อดูความถี่ในการเกิดขึ้นได้

สาเหตุ: กำหนดค่าระยะหมดเวลา Keep-alive ไม่ถูกต้อง

การวินิจฉัย

  1. ใช้ขั้นตอนในขั้นตอนการวิเคราะห์ทั่วไป และตรวจสอบว่าคุณได้รับข้อผิดพลาด [socket hang up][ECONNRESET] หรือไม่
  2. หากใช่ ให้ตรวจสอบเพิ่มเติมโดยใช้ tcpdump ตามที่อธิบายไว้ด้านล่าง

การใช้ tcpdump

  1. บันทึก tcpdump ระหว่าง Edge Microgateway และเซิร์ฟเวอร์แบ็กเอนด์ในระบบปฏิบัติการโฮสต์ Edge Microgateway ด้วยคำสั่งต่อไปนี้
    tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
    
  2. วิเคราะห์ tcpdump ที่บันทึกไว้

    ตัวอย่างเอาต์พุต tcpdump: ( ดูรูปภาพขนาดใหญ่ขึ้น)

    ในตัวอย่าง tcpdump ด้านบน คุณจะเห็นข้อมูลต่อไปนี้

    1. ในแพ็กเก็ต 250288 ไคลเอ็นต์จะส่งคำขอ POST
    2. ในแพ็กเก็ต 250371 เซิร์ฟเวอร์ตอบสนองด้วย 200 OK
    3. ในแพ็กเก็ต 250559 ไคลเอ็นต์จะส่ง ACK.
    4. ในแพ็กเก็ต 250560 เซิร์ฟเวอร์จะส่งข้อความ Continuation
    5. ในแพ็กเก็ต 250561 ไคลเอ็นต์จะส่ง ACK.
    6. ในแพ็กเกต 262436 เซิร์ฟเวอร์จะส่ง FIN, ACK ไปยังไคลเอ็นต์ที่เริ่มการปิดการเชื่อมต่อ โปรดทราบว่าประมาณ 5 วินาทีหลังจากแพ็กเก็ตก่อนหน้า (250561)
    7. ในแพ็กเก็ต 262441 ไคลเอ็นต์จะส่งคำขอ POST อีกรายการ แต่การดำเนินการนี้ล้มเหลวเนื่องจากเซิร์ฟเวอร์ได้เริ่มปิดการเชื่อมต่อแล้ว โดยจะตอบสนองด้วย RST ในแพ็กเก็ต 262441

    ในตัวอย่างนี้มีการใช้การเชื่อมต่อเดียวกันซ้ำอย่างน้อย 1 ครั้ง แต่ในคำขอสุดท้าย เซิร์ฟเวอร์เริ่มปิดการเชื่อมต่อหลังจากไม่มีความเคลื่อนไหว 5 วินาที ซึ่งเกิดขึ้นในขณะที่ไคลเอ็นต์ส่งคำขอใหม่ ซึ่งบ่งชี้ว่าระยะหมดเวลา Keep-alive ของเซิร์ฟเวอร์แบ็กเอนด์มักจะสั้นกว่าหรือเท่ากับค่าที่ตั้งไว้ในไคลเอ็นต์ หากต้องการตรวจสอบความถูกต้องนี้ โปรดดูเปรียบเทียบระยะหมดเวลา Keep-alive ใน Edge Microgateway และเซิร์ฟเวอร์แบ็กเอนด์

เปรียบเทียบระยะหมดเวลาของ Keep-alive

  1. Edge Microgateway ไม่มีพร็อพเพอร์ตี้ระยะหมดเวลาของ Keep-alive ที่เฉพาะเจาะจง ซึ่งกำหนดโดยระบบปฏิบัติการที่อุปกรณ์ทำงานอยู่ ตัวอย่างทั่วไป ได้แก่ คอนเทนเนอร์ Windows, Linux และ Docker
  2. อาจเป็นไปได้ว่ามีการกำหนดค่านี้ในระบบปฏิบัติการ โปรดตรวจสอบกับผู้ดูแลระบบ โดยค่าเริ่มต้น ระบบปฏิบัติการ Linux จะมีระยะหมดเวลาของ Keep-alive เริ่มต้นอยู่ที่ 2 ชั่วโมง
  3. ถัดไป ให้ตรวจสอบพร็อพเพอร์ตี้ระยะหมดเวลาของ Keep-alive ที่กำหนดค่าไว้ในเซิร์ฟเวอร์แบ็กเอนด์ของคุณ สมมติว่าเซิร์ฟเวอร์แบ็กเอนด์ได้รับการกําหนดค่าด้วยค่า 10 วินาที
  4. หากพบว่าค่าระยะหมดเวลาของ Keep-alive ในระบบปฏิบัติการสูงกว่าค่าของพร็อพเพอร์ตี้ระยะหมดเวลาของ Keep-alive ในเซิร์ฟเวอร์แบ็กเอนด์ตามตัวอย่างข้างต้น จึงเป็นสาเหตุที่ทําให้เกิดข้อผิดพลาด 502

ความละเอียด

ตรวจสอบว่าพร็อพเพอร์ตี้ระยะหมดเวลาของ Keep-alive ต่ำกว่าเสมอในระบบปฏิบัติการที่ Edge Microgateway ทำงานอยู่เมื่อเทียบกับในเซิร์ฟเวอร์แบ็กเอนด์

  1. ระบุค่าที่ตั้งค่าสำหรับระยะหมดเวลา Keep-alive ในเซิร์ฟเวอร์แบ็กเอนด์
  2. กำหนดค่าที่เหมาะสมสำหรับพร็อพเพอร์ตี้ระยะหมดเวลาของ Keep-alive ในระบบปฏิบัติการ เพื่อให้พร็อพเพอร์ตี้ระยะหมดเวลาของ Keep-alive ต่ำกว่าค่าที่ตั้งไว้ในเซิร์ฟเวอร์แบ็กเอนด์โดยใช้ขั้นตอนที่เกี่ยวข้องกับระบบปฏิบัติการของคุณ

แนวทางปฏิบัติแนะนำ

ขอแนะนำเป็นอย่างยิ่งว่าคอมโพเนนต์ดาวน์สตรีมจะมีเกณฑ์ระยะหมดเวลาของ Keep-alive ต่ำกว่าที่กำหนดค่าไว้บนเซิร์ฟเวอร์อัปสตรีมเสมอ เพื่อหลีกเลี่ยงเงื่อนไขเกี่ยวกับการแข่งขันและข้อผิดพลาด 502 ประเภทนี้ ฮอพดาวน์สตรีมแต่ละรายการควรต่ำกว่าอัปสตรีมฮอพแต่ละรายการ ใน Edge Microgateway แนวทางปฏิบัติที่ดีคือการใช้หลักเกณฑ์ต่อไปนี้

  1. ระยะหมดเวลาของ Keep-alive ในแอปพลิเคชันไคลเอ็นต์หรือตัวจัดสรรภาระงานควรน้อยกว่าระยะหมดเวลา Keep-alive ของ Edge Microgateway

    หากต้องการกำหนดค่าระยะหมดเวลาของ Keep-alive ใน Edge Microgateway ให้เพิ่มค่า keep_alive_timeout ลงในไฟล์ ~/.edgemicro/org-env-config.yaml

    edgemicro:
      keep_alive_timeout: 65000
    
  2. ระยะหมดเวลา Keep-alive ของระบบปฏิบัติการ Edge Microgateway ควรน้อยกว่าระยะหมดเวลา Keep-alive ของเซิร์ฟเวอร์เป้าหมาย
  3. หากมีฮอพอื่นๆ ด้านหน้าหรือด้านหลัง Edge Microgateway ควรใช้กฎเดียวกัน คุณควรปล่อยให้ไคลเอ็นต์เป็นความรับผิดชอบของไคลเอ็นต์ดาวน์สตรีมในการปิดการเชื่อมต่อกับอัปสตรีมเสมอ

สาเหตุ: เซิร์ฟเวอร์เป้าหมายปิดการเชื่อมต่อก่อนกำหนด

การวินิจฉัย

  1. ใช้ขั้นตอนที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไปและตรวจสอบว่าคุณได้รับข้อผิดพลาด [socket hang up][ECONNRESET] หรือไม่
  2. หากใช่ ให้ตรวจสอบเพิ่มเติมจากความช่วยเหลือจาก tcpdump ตามที่อธิบายไว้ด้านล่าง

    ข้อความแสดงข้อผิดพลาด [targetRequest error][GET][][socket hang up][ECONNRESET] ในตัวอย่างด้านบนบ่งบอกว่าข้อผิดพลาดนี้เกิดขึ้นขณะที่ Edge Microgateway ส่งคำขอไปยังเซิร์ฟเวอร์แบ็กเอนด์ (เป้าหมาย) กล่าวคือ Edge Microgateway ได้ส่งคำขอ API ไปยังเซิร์ฟเวอร์แบ็กเอนด์และกำลังรอการตอบกลับ แต่เซิร์ฟเวอร์แบ็กเอนด์จะยุติการเชื่อมต่ออย่างกะทันหันก่อนที่ Edge Microgateway จะได้รับการตอบสนอง

  3. ตรวจสอบบันทึกเซิร์ฟเวอร์แบ็กเอนด์และดูว่ามีข้อผิดพลาดหรือข้อมูลที่อาจทําให้เซิร์ฟเวอร์แบ็กเอนด์ยุติการเชื่อมต่ออย่างกะทันหันหรือไม่ หากพบข้อผิดพลาดหรือข้อมูล ให้ไปที่การแก้ปัญหาแล้วแก้ไขปัญหาที่เหมาะสมในเซิร์ฟเวอร์แบ็กเอนด์
  4. หากไม่พบข้อผิดพลาดหรือข้อมูลในเซิร์ฟเวอร์แบ็กเอนด์ ให้รวบรวมเอาต์พุต tcpdump ในเซิร์ฟเวอร์ Edge Microgateway ดังนี้
    tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
    
  5. วิเคราะห์ tcpdump ที่บันทึกไว้

    ตัวอย่างเอาต์พุต tcpdump: ( ดูรูปภาพขนาดใหญ่ขึ้น)

    ในตัวอย่าง tcpdump ด้านบน คุณจะเห็นข้อมูลต่อไปนี้

    1. ในแพ็กเกต 4 Edge Microgateway ได้ส่งคำขอ GET ไปยังเซิร์ฟเวอร์เป้าหมาย
    2. ในแพ็กเก็ต 5 เซิร์ฟเวอร์เป้าหมายตอบกลับด้วย ACK เพื่อรับทราบคำขอ
    3. อย่างไรก็ตาม ในแพ็กเก็ต 6 แทนที่จะตอบกลับด้วยเพย์โหลดการตอบกลับ เซิร์ฟเวอร์เป้าหมายจะส่ง FIN, ACK ที่เริ่มการปิดการเชื่อมต่อ
    4. ในแพ็กเก็ต 7 เป็นต้นไป การเชื่อมต่อจะถูกปิดพร้อมกัน เนื่องจากการเชื่อมต่อถูกปิดก่อนที่จะส่งการตอบกลับ Edge Microgateway จึงจะแสดงข้อผิดพลาด HTTP 502 กลับไปยังไคลเอ็นต์
    5. โปรดทราบว่าการประทับเวลาของแพ็กเกต 8 2021-06-23T03:52:24.110Z ตรงกับการประทับเวลาที่บันทึกข้อผิดพลาดในบันทึก Edge Microgateway การประทับเวลาในไฟล์บันทึกและใน tcpdump มักใช้เพื่อเชื่อมโยงข้อผิดพลาดกับแพ็กเก็ตจริง

    ความละเอียด

    แก้ไขปัญหาในเซิร์ฟเวอร์แบ็กเอนด์อย่างเหมาะสม

    หากปัญหายังคงอยู่และคุณต้องการความช่วยเหลือในการแก้ปัญหา 502 Bad Gateway Error หรือคุณสงสัยว่าเป็นปัญหาใน Edge Microgateway ให้ไปที่ต้องรวบรวมข้อมูลการวินิจฉัย

    ต้องรวบรวมข้อมูลการวินิจฉัย

    หากปัญหายังคงอยู่แม้ว่าจะทำตามวิธีการข้างต้นแล้ว ให้รวบรวมข้อมูลการวินิจฉัยต่อไปนี้แล้วติดต่อทีมสนับสนุนของ Apigee Edge

    • ไฟล์บันทึก: โฟลเดอร์เริ่มต้นคือ /var/tmp แต่อาจลบล้างในไฟล์ config.yaml หลัก (logging > dir parameter) ขอแนะนําให้เปลี่ยน log > level เป็น info ก่อนส่งไฟล์บันทึกกับทีมสนับสนุนของ Apigee
    • ไฟล์การกำหนดค่า: การกำหนดค่าหลักของ Edge Microgateway อยู่ในไฟล์ YAML ในโฟลเดอร์ Edge Microgateway เริ่มต้น $HOME/.edgemicro มีไฟล์การกำหนดค่าเริ่มต้นชื่อ default.yaml และมีไฟล์กำหนดค่าเริ่มต้นอีก 1 ไฟล์สำหรับแต่ละสภาพแวดล้อม ORG-ENV-config.yaml โปรดอัปโหลดไฟล์นี้แบบเต็มสำหรับองค์กรและสภาพแวดล้อมที่ได้รับผลกระทบ