503 ไม่มีบริการ - ปิดก่อนกำหนดโดยเซิร์ฟเวอร์ส่วนหลัง

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

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะการตอบกลับ HTTP 503 พร้อมข้อความ Service Unavailable หลังจากเรียกพร็อกซี API

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

แอปพลิเคชันไคลเอ็นต์ได้รับโค้ดตอบกลับต่อไปนี้

HTTP/1.1 503 Service Unavailable

นอกจากนี้ คุณอาจเห็นข้อความแสดงข้อผิดพลาดต่อไปนี้

{
   "fault": {
      "faultstring": "The Service is temporarily unavailable",
      "detail": {
           "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
       }
    }
}

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

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

ขั้นตอนการวินิจฉัยที่พบบ่อย

กำหนดรหัสข้อความของคำขอที่ไม่สำเร็จ

เครื่องมือติดตาม

วิธีกำหนดรหัสข้อความของคำขอที่ไม่สำเร็จโดยใช้เครื่องมือติดตาม

  1. หากปัญหายังคงเกิดขึ้นอยู่ ให้เปิดใช้ เซสชันการติดตามสำหรับ API ที่ได้รับผลกระทบ
  2. เรียก API และจำลองปัญหา - 503 Service Unavailable ที่มีรหัสข้อผิดพลาด messaging.adaptors.http.flow.ServiceUnavailable.
  3. เลือกคำขอที่ไม่สำเร็จรายการใดรายการหนึ่ง
  4. ไปที่ระยะ AX แล้วกำหนดรหัสข้อความ (X-Apigee.Message-ID) ของคำขอโดยเลื่อนลงใน ส่วนรายละเอียดระยะ ตามที่แสดงในรูปภาพต่อไปนี้

    รหัสข้อความในส่วนรายละเอียดระยะ

บันทึกการเข้าถึงของ NGINX

วิธีกำหนดรหัสข้อความของคำขอที่ไม่สำเร็จโดยใช้บันทึกการเข้าถึงของ NGINX

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

  1. ตรวจสอบบันทึกการเข้าถึงของ NGINX (/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log)
  2. ค้นหาเพื่อดูว่ามีข้อผิดพลาด 503 สำหรับพร็อกซี API ที่เฉพาะเจาะจงในช่วงระยะเวลาหนึ่ง (หากปัญหาเกิดขึ้นในอดีต) หรือหากยังมีคำขอที่ไม่สำเร็จโดยมีข้อผิดพลาด 503 อยู่หรือไม่
  3. หากมีข้อผิดพลาด 503 ที่มีรหัสข้อผิดพลาด X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable ให้จดรหัสข้อความสำหรับคำขออย่างน้อย 1 รายการตามที่แสดงในตัวอย่างต่อไปนี้

    ตัวอย่างรายการที่แสดงข้อผิดพลาด 503

    ตัวอย่างรายการที่แสดงรหัสสถานะ รหัสข้อความ แหล่งที่มาของข้อผิดพลาด และรหัสข้อผิดพลาด

สาเหตุ: เซิร์ฟเวอร์ปลายทางปิดการเชื่อมต่อก่อนเวลาอันควร

การวินิจฉัย

  1. หากคุณเป็นผู้ใช้ Public Cloud หรือ Private Cloud ให้ทำดังนี้
    1. ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยที่พบบ่อย) และตรวจสอบว่าคุณได้ตั้งค่าทั้ง 2 รายการต่อไปนี้ในบานหน้าต่างข้อมูลการวิเคราะห์ที่บันทึกไว้:
      • X-Apigee.fault-code: messaging.adaptors.http.flow.ServiceUnavailable
      • X-Apigee.fault-source: target

      alt_text

    2. ใช้เครื่องมือติดตาม (ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยที่พบบ่อย) และตรวจสอบว่าคุณได้ตั้งค่าทั้ง 2 รายการต่อไปนี้ในบานหน้าต่างข้อผิดพลาด ทันทีหลังจาก พร็อพเพอร์ตี้ TARGET_REQ_FLOW state:
      • error.class: com.apigee.errors.http.server.ServiceUnavailableException
      • error.cause: Broken pipe

      alt_text

    3. ไปที่การใช้ tcpdump เพื่อตรวจสอบเพิ่มเติม
  2. หากคุณเป็นผู้ใช้ Private Cloud ให้ทำดังนี้
    • กำหนดรหัสข้อความ ของคำขอที่ไม่สำเร็จ
    • ค้นหารหัสข้อความในบันทึกของ Message Processor (/opt/apigee/var/log/edge-message-processor/logs/system.log)
    • คุณจะเห็นข้อยกเว้นรายการใดรายการหนึ่งต่อไปนี้

      ข้อยกเว้นที่ 1: java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel

      2021-01-30 15:31:14,693 org:anotherorg env:prod api:myproxy
      rev:1 messageid:myorg-opdk-test-1-30312-13747-1  NIOThread@1
      INFO  HTTP.SERVICE - ExceptionHandler.handleException() :
      Exception java.io.IOException: Broken pipe occurred while writing to channel
      ClientOutputChannel(ClientChannel[Connected:
      Remote:IP:PORT Local:0.0.0.0:42828]@8380 useCount=1
      bytesRead=0 bytesWritten=76295 age=2012ms  lastIO=2ms  isOpen=false)

      หรือ

      ข้อยกเว้นที่ 2: onExceptionWrite exception: {}
      java.io.IOException: Broken pipe

      2021-01-31 15:29:37,438 org:anotherorg env:prod api:503-test
      rev:1 messageid:leonyoung-opdk-test-1-18604-13978-1
      NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$2.onException() :
      ClientChannel[Connected: Remote:IP:PORT
      Local:0.0.0.0:57880]@8569 useCount=1 bytesRead=0 bytesWritten=76295 age=3180ms  lastIO=2
      ms  isOpen=false.onExceptionWrite exception: {}
      java.io.IOException: Broken pipe
    • ข้อยกเว้นทั้ง 2 รายการนี้บ่งชี้ว่าในขณะที่ Message Processor ยังคงเขียน เพย์โหลดของคำขอไปยังเซิร์ฟเวอร์แบ็กเอนด์ เซิร์ฟเวอร์แบ็กเอนด์ได้ปิดการเชื่อมต่อก่อนเวลาอันควร ดังนั้น Message Processor จึงแสดงข้อยกเว้น java.io.IOException: Broken pipe
    • Remote:IP:PORT ระบุที่อยู่ IP และหมายเลขพอร์ตของเซิร์ฟเวอร์แบ็กเอนด์ที่แก้ไขแล้ว
    • แอตทริบิวต์ bytesWritten=76295 ในข้อความแสดงข้อผิดพลาดข้างต้นบ่งชี้ว่า Message Processor ได้ส่งเพย์โหลดขนาด 76295 ไบต์ไปยังเซิร์ฟเวอร์แบ็กเอนด์เมื่อการเชื่อมต่อถูกปิดก่อนเวลาอันควร
    • แอตทริบิวต์ bytesRead=0 บ่งชี้ว่า Message Processor ไม่ได้ รับข้อมูล (การตอบกลับ) จากเซิร์ฟเวอร์แบ็กเอนด์
    • หากต้องการตรวจสอบปัญหานี้เพิ่มเติม ให้รวบรวม tcpdump ในเซิร์ฟเวอร์แบ็กเอนด์ หรือ Message Processor แล้ววิเคราะห์ตามที่อธิบายไว้ด้านล่าง

การใช้ tcpdump

  1. บันทึก tcpdump ในเซิร์ฟเวอร์แบ็กเอนด์หรือ Message Processor ด้วย คำสั่งต่อไปนี้

    คำสั่งรวบรวม tcpdump ในเซิร์ฟเวอร์แบ็กเอนด์

    tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
    

    คำสั่งรวบรวม tcpdump ใน Message Processor

    tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
    
  2. วิเคราะห์ tcpdump ที่บันทึกไว้

    ตัวอย่างเอาต์พุต tcpdump (รวบรวมใน Message Processor)

    alt_text

    ใน tcpdump ข้างต้น คุณจะเห็นสิ่งต่อไปนี้

    1. ในแพ็กเก็ต 4 Message Processor ส่งคำขอ POST ไปยัง เซิร์ฟเวอร์แบ็กเอนด์
    2. ในแพ็กเก็ต 5, 8, 9, 10, 11 Message Processor ยังคงส่งเพย์โหลดของคำขอไปยัง เซิร์ฟเวอร์แบ็กเอนด์
    3. ในแพ็กเก็ต 6 และ 7 เซิร์ฟเวอร์แบ็กเอนด์ตอบกลับด้วย ACK สำหรับเพย์โหลดของคำขอที่ได้รับจาก Message Processor
    4. อย่างไรก็ตาม ในแพ็กเก็ต 12 แทนที่จะตอบกลับด้วย ACK สำหรับแพ็กเก็ตข้อมูลแอปพลิเคชันที่ได้รับและตอบกลับด้วยเพย์โหลดของการตอบกลับในภายหลัง เซิร์ฟเวอร์แบ็กเอนด์กลับตอบกลับด้วย FIN ACK ซึ่งเริ่มการปิดการเชื่อมต่อ
    5. ซึ่งแสดงให้เห็นอย่างชัดเจนว่าเซิร์ฟเวอร์แบ็กเอนด์กำลังปิดการเชื่อมต่อก่อนเวลาอันควร ในขณะที่ Message Processor ยังคงส่งเพย์โหลดของคำขออยู่
    6. การดำเนินการนี้ทำให้ Message Processor บันทึกข้อผิดพลาด IOException: Broken Pipe และแสดงข้อผิดพลาด 503 ให้ไคลเอ็นต์

ความละเอียด

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

หากปัญหายังคงอยู่ ให้ไปที่ ข้อมูลการวินิจฉัยที่ต้องรวบรวม

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

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

หากคุณเป็นผู้ใช้ Public Cloud โปรดระบุข้อมูลต่อไปนี้

  • ชื่อองค์กร
  • ชื่อสภาพแวดล้อม
  • ชื่อพร็อกซี API
  • คำสั่ง curl ที่สมบูรณ์เพื่อจำลองข้อผิดพลาด 503
  • ไฟล์การติดตามที่มีคำขอซึ่งมีข้อผิดพลาด 503 Service Unavailable
  • หากข้อผิดพลาด 503 ไม่เกิดขึ้นในปัจจุบัน โปรดระบุช่วงเวลาพร้อมข้อมูลเขตเวลาที่ข้อผิดพลาด 503 เกิดขึ้นในอดีต

หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้

  • ข้อความแสดงข้อผิดพลาดทั้งหมดที่พบสำหรับคำขอที่ไม่สำเร็จ
  • ชื่อองค์กร ชื่อสภาพแวดล้อม และชื่อพร็อกซี API ที่คุณพบข้อผิดพลาด 503
  • App Bundle ของพร็อกซี API
  • ไฟล์การติดตามที่มีคำขอซึ่งมีข้อผิดพลาด 503 Service Unavailable
  • บันทึกการเข้าถึงของ NGINX
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  • บันทึกของ Message Processor
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • ช่วงเวลาพร้อมข้อมูลเขตเวลาที่ข้อผิดพลาด 503 เกิดขึ้น
  • Tcpdumps ที่รวบรวมใน Message Processor และเซิร์ฟเวอร์แบ็กเอนด์เมื่อ เกิดข้อผิดพลาด