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

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

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์ได้รับสถานะการตอบกลับ 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"
       }
    }
}

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

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

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

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

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

วิธีระบุรหัสข้อความของคำขอที่ล้มเหลวโดยใช้เครื่องมือติดตาม

  1. หากยังพบปัญหาอยู่ ให้เปิดใช้ เซสชันการติดตามสำหรับ API ที่ได้รับผลกระทบ
  2. เรียก API และทำให้เกิดปัญหาซ้ำ - 503 Service Unavailable ที่มีรหัสข้อผิดพลาด messaging.adaptors.http.flow.ServiceUnavailable.
  3. เลือกคำขอที่ล้มเหลว 1 รายการ
  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 messages.adaptors.http.flow.ServiceUnavailable โปรดจดรหัสข้อความสำหรับคำขออย่างน้อย 1 รายการดังที่แสดงในตัวอย่างต่อไปนี้

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

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

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

การวินิจฉัย

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

      alt_text

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

      alt_text

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

      ข้อยกเว้น #1: java.io.IOException: พบท่อเสียหายขณะเขียนไปยังช่องทาง ClientExportChannel

      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การยกเว้น: {}
      java.io.IOException: ไปป์เสียหาย

      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 รายการนี้ระบุว่าในขณะที่ผู้ประมวลผลข้อความยังคงเขียนเปย์โหลดคำขอไปยังเซิร์ฟเวอร์แบ็กเอนด์อยู่ การเชื่อมต่อถูกปิดก่อนกำหนดโดยเซิร์ฟเวอร์แบ็กเอนด์ ดังนั้น โปรแกรมประมวลผลข้อความจึงแสดงข้อผิดพลาด java.io.IOException: Broken pipe
    • Remote:IP:PORT จะระบุที่อยู่ IP และหมายเลขพอร์ตของเซิร์ฟเวอร์แบ็กเอนด์ที่แก้ไขแล้ว
    • แอตทริบิวต์ bytesWritten=76295 ในข้อความแสดงข้อผิดพลาดข้างต้นบ่งบอกว่าผู้ประมวลผลข้อความได้ส่งเพย์โหลด 76295 ไบต์ไปยังเซิร์ฟเวอร์แบ็กเอนด์เมื่อปิดการเชื่อมต่อก่อนกำหนด
    • แอตทริบิวต์ bytesRead=0 บ่งบอกว่าผู้ประมวลผลข้อความยังไม่ได้รับข้อมูลใดๆ (การตอบสนอง) จากเซิร์ฟเวอร์แบ็กเอนด์
    • หากต้องการตรวจสอบปัญหานี้เพิ่มเติม ให้รวบรวม tcpdump ในเซิร์ฟเวอร์แบ็กเอนด์หรือ Message Processor แล้ววิเคราะห์ตามที่อธิบายด้านล่าง

การใช้ tcpdump

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

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

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

    คำสั่งเพื่อรวบรวม tcpdump ในตัวประมวลผลข้อความ:

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

    ตัวอย่างเอาต์พุต tcpdump (รวบรวมในเครื่องมือประมวลผลข้อความ):

    alt_text

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

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

ความละเอียด

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

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

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

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

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

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

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

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