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 สาธารณะและ Private Cloud
เซิร์ฟเวอร์เป้าหมายปิดการเชื่อมต่อก่อนกำหนด เซิร์ฟเวอร์เป้าหมายปิดการเชื่อมต่อก่อนกำหนดขณะที่ Edge Microgateway ส่งคำขอ เพย์โหลดคำขอ ผู้ใช้ Edge สาธารณะและ 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] ซึ่งรวมถึงชื่อโฮสต์ของเซิร์ฟเวอร์เป้าหมายและพอร์ตใน ในตัวอย่างนี้คือ 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 เริ่มต้น สองชั่วโมง
  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 การใช้หลักเกณฑ์ต่อไปนี้เป็นแนวทางปฏิบัติที่ดี

  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 และอีกไฟล์สำหรับแต่ละสภาพแวดล้อม ORG-ENV-config.yaml โปรดอัปโหลดไฟล์นี้ ฉบับเต็มสำหรับองค์กรและสภาพแวดล้อมที่ได้รับผลกระทบ