502 เกตเวย์ไม่ถูกต้อง - ResponseWithBody

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

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะ HTTP 502 Bad Gateway ที่มีข้อผิดพลาด protocol.http.ResponseWithBody เป็นการตอบกลับสำหรับการเรียก API

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

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"Received 204 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}
{
   "fault":{
      "faultstring":"Received 205 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}

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

ข้อผิดพลาดนี้เกิดขึ้นหากการตอบสนอง HTTP จากเซิร์ฟเวอร์แบ็กเอนด์ไปยัง Apigee Edge เป็น 204 No Content หรือ 205 Reset Content แต่มีการตอบกลับ เนื้อหา และ/หรือส่วนหัวต่อไปนี้อย่างน้อย 1 ส่วนหัว

  • Content-Length
  • Content-Encoding
  • Transfer-Encoding

ตามข้อกำหนด RFC 7231 ส่วน 6.3.5: 204 ไม่มีเนื้อหา และ RFC 7231 ส่วน 6.3.6: 205 รีเซ็ตเนื้อหา ไม่ควรมีเนื้อหาเพิ่มเติม ควรส่งเป็นส่วนหนึ่งของเนื้อหาเพย์โหลดการตอบกลับที่มีรหัสสถานะ 204 No Content หรือ 205 Reset Content โดยเซิร์ฟเวอร์ต้นทาง ส่วนหัวการตอบกลับ เช่น Content-Length, Content-Encoding หรือ Transfer-Encoding ระบุขนาด ประเภท หรือรูปแบบของเพย์โหลดการตอบกลับ

ดังนั้น Apigee Edge จะแสดงรหัสสถานะ 502 Bad Gateway ที่มี รหัสข้อผิดพลาด protocol.http.ResponseWithBody ไปยังไคลเอ็นต์ภายใต้ สถานการณ์:

รหัสสถานะจากเซิร์ฟเวอร์แบ็กเอนด์
การตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์ประกอบด้วย 204 ไม่มีเนื้อหา 205 รีเซ็ตเนื้อหา
เนื้อหาการตอบกลับ ข้อผิดพลาด ข้อผิดพลาด

ส่วนหัว Content-Length

(ตั้งค่าเป็นไม่ใช่ 0)

ข้อผิดพลาด ข้อผิดพลาด

Content-Encoding

(ตั้งค่าเป็น การเข้ารหัสที่รองรับใน Apigee Edge)

ข้อผิดพลาด ไม่มีข้อผิดพลาด
Transfer-Encoding ข้อผิดพลาด ข้อผิดพลาด

สาเหตุที่เป็นไปได้สำหรับข้อผิดพลาดนี้มีดังนี้

สาเหตุ คำอธิบาย วิธีการแก้ปัญหาสำหรับ
เนื้อหาการตอบกลับหรือส่วนหัวที่มีการตอบกลับ 204 จากเซิร์ฟเวอร์แบ็กเอนด์ เซิร์ฟเวอร์แบ็กเอนด์จะส่ง 204 No Content หรือ 205 Reset Content การตอบกลับที่มีเนื้อหาการตอบกลับและ/หรือส่วนหัว Content-Type อย่างน้อย 1 รายการ Content-Encoding หรือ Transfer-Encoding ผู้ใช้ Edge สาธารณะและ Private Cloud

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

ใช้เครื่องมือ/เทคนิคต่อไปนี้เพื่อวินิจฉัยข้อผิดพลาดนี้

การตรวจสอบ API

วิธีวินิจฉัยข้อผิดพลาดโดยใช้การตรวจสอบ API

  1. ลงชื่อเข้าใช้ Apigee Edge UI ในฐานะผู้ใช้ที่มี บทบาทที่เหมาะสม
  2. เปลี่ยนเป็นองค์กรที่ต้องการตรวจสอบปัญหา

  3. ไปที่ วิเคราะห์ > การตรวจสอบ API > หน้าตรวจสอบ
  4. เลือกกรอบเวลาที่คุณพบข้อผิดพลาด
  5. พล็อตรหัสข้อผิดพลาดเทียบกับเวลา
  6. เลือกเซลล์ที่มีรหัสข้อผิดพลาด protocol.http.ResponseWithBody เป็น แสดงอยู่ด้านล่าง

    ( ดูรูปภาพขนาดใหญ่ขึ้น)

  7. คุณจะเห็นข้อมูลเกี่ยวกับรหัสข้อผิดพลาด protocol.http.ResponseWithBody ตามที่แสดงด้านล่าง:

    ( ดูรูปภาพขนาดใหญ่ขึ้น)

  8. คลิก ดูบันทึก และขยายแถวสำหรับคำขอที่ล้มเหลว

    ( ดูรูปภาพขนาดใหญ่ขึ้น)

  9. จากหน้าต่าง Logs ให้จดรายละเอียดต่อไปนี้
    • รหัสสถานะ: 502
    • แหล่งที่มาของข้อผิดพลาด: target
    • รหัสข้อผิดพลาด: protocol.http.ResponseWithBody
  10. หากแหล่งที่มาของข้อผิดพลาดมีค่า target และข้อผิดพลาด Code มีค่า protocol.http.ResponseWithBody ซึ่งเท่ากับว่า ระบุว่าเกิดข้อผิดพลาดขึ้นเนื่องจากเซิร์ฟเวอร์แบ็กเอนด์ส่ง รหัสสถานะ 204 No Content หรือ 205 Reset Content กับ เนื้อหาการตอบกลับและ/หรือส่วนหัวอย่างใดอย่างหนึ่งที่กล่าวถึงใน สาเหตุที่เป็นไปได้

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

วิธีวินิจฉัยข้อผิดพลาดโดยใช้เครื่องมือติดตาม

  1. เปิดใช้เซสชันการติดตาม และเลือกระหว่าง
    1. รอให้เกิดข้อผิดพลาด 502 Bad Gateway หรือ
    2. หากคุณทำให้เกิดปัญหาซ้ำได้ ให้เรียก API และทำให้เกิดข้อผิดพลาด 502 Bad Gateway ซ้ำ
  2. ตรวจสอบว่าเปิดใช้แสดง FlowInfo ทั้งหมด แล้ว

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

    สถานการณ์ที่ 1

    สถานการณ์ที่ 1: เซิร์ฟเวอร์แบ็กเอนด์ตอบกลับด้วยรหัสสถานะ 204 No Content ที่มีเนื้อหาการตอบกลับและ/หรือส่วนหัวอย่างใดอย่างหนึ่งที่แสดงอยู่ใน สาเหตุที่เป็นไปได้

    สังเกตค่าต่อไปนี้จากการติดตาม

    • ข้อผิดพลาด: Received 204 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway

    สถานการณ์ที่ 2

    สถานการณ์ที่ 2: เซิร์ฟเวอร์แบ็กเอนด์ตอบกลับด้วยรหัสสถานะ 204 No Content ซึ่งมีเนื้อหาการตอบกลับและ/หรือหนึ่งใน ส่วนหัวที่ระบุไว้ในสาเหตุที่เป็นไปได้

    สังเกตค่าต่อไปนี้จากการติดตาม

    • ข้อผิดพลาด: Received 205 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway
  6. ไปยังช่วง AX (Analytics Data Recorded) ในการติดตาม แล้วคลิกที่ตัวเลือก
  7. เลื่อนลงไปที่ส่วนรายละเอียดระยะ ส่วนหัวของข้อผิดพลาด และ ระบุค่าของ X-Apigee-fault-code และ X-Apigee-fault-source ดังที่แสดงด้านล่าง

    ( ดูรูปภาพขนาดใหญ่ขึ้น)

  8. โปรดทราบว่าค่าของ X-Apigee-fault-code และ X-Apigee-fault-source are protocol.http.ResponseWithBody และ target ตามลำดับ ซึ่งหมายความว่าข้อผิดพลาดเกิดขึ้นเนื่องจากเซิร์ฟเวอร์แบ็กเอนด์ส่ง รหัสสถานะ 204 No Content หรือ 205 Reset Content ที่มี เนื้อหาการตอบกลับและ/หรือส่วนหัวอย่างใดอย่างหนึ่งที่กล่าวถึงในสาเหตุที่เป็นไปได้
    ข้อผิดพลาด ค่า
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

NGINX

วิธีวินิจฉัยข้อผิดพลาดโดยใช้บันทึกการเข้าถึง NGINX

  1. หากคุณเป็นผู้ใช้ Private Cloud คุณสามารถใช้บันทึกการเข้าถึง NGINX เพื่อ ระบุข้อมูลสำคัญเกี่ยวกับ HTTP 502 Bad Gateway
  2. ตรวจสอบบันทึกการเข้าถึง NGINX ดังต่อไปนี้

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    ที่ไหน: ระบบจะแทนที่ ORG, ENV และ PORT# ด้วยค่าจริง

  3. ค้นหาว่ามีข้อผิดพลาด 502 ที่มีรหัสข้อผิดพลาดไหม protocol.http.ResponseWithBody ในช่วงระยะเวลาหนึ่ง (หากเคยมีปัญหาเกิดขึ้นในอดีต) หรือหากมีคำขอที่ยังคงดำเนินการไม่สำเร็จ 502
  4. หากคุณพบข้อผิดพลาด 502 ที่มี X-Apigee-fault-code ตรงกับค่าของ protocol.http.ResponseWithBody แล้วหา ค่าของ X-Apigee-fault-source

    ตัวอย่างข้อผิดพลาด 502 จากบันทึกการเข้าถึง NGINX

    ตัวอย่างรายการข้างต้นจากบันทึกการเข้าถึง NGINX มีค่าต่อไปนี้สำหรับ X- Apigee-fault-code และ X-Apigee-fault-source ดังนี้

    ส่วนหัวการตอบกลับ ค่า
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target
  5. โปรดทราบว่าค่าของ X-Apigee-fault-code และ X-Apigee-fault-source คือ protocol.http.ResponseWithBody และ target ตามลำดับ ซึ่งหมายความว่าข้อผิดพลาดเกิดขึ้นเนื่องจากเซิร์ฟเวอร์แบ็กเอนด์ส่ง รหัสสถานะ 204 No Content หรือ 205 Reset Content ที่มี เนื้อหาการตอบกลับและ/หรือส่วนหัวอย่างใดอย่างหนึ่งที่กล่าวถึงในสาเหตุที่เป็นไปได้

สาเหตุ: เนื้อหาการตอบกลับหรือส่วนหัวที่มีการตอบกลับ 204 จากเซิร์ฟเวอร์แบ็กเอนด์

การวินิจฉัย

  1. กำหนดรหัสข้อผิดพลาดและแหล่งที่มาของข้อผิดพลาดสำหรับข้อผิดพลาดที่พบโดยใช้ API การตรวจสอบ เครื่องมือการติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวิเคราะห์ทั่วไป
  2. หาก Fault Code คือ protocol.http.ResponseWithBody และ แหล่งที่มาของข้อผิดพลาดมีค่า target ซึ่งจะบ่งบอกว่าแบ็กเอนด์ เซิร์ฟเวอร์ตอบกลับด้วยสถานะ 204 No Content หรือ 205 Reset Content ซึ่งมีเนื้อหาการตอบกลับและ/หรือส่วนหัวอย่างใดอย่างหนึ่งที่กล่าวถึงใน สาเหตุที่เป็นไปได้
  3. เพื่อตรวจสอบว่าเซิร์ฟเวอร์แบ็กเอนด์ได้ส่งเนื้อหาเพย์โหลดการตอบกลับจริงหรือไม่ และ/หรือ ส่วนหัวที่ระบุอยู่ในสาเหตุที่เป็นไปได้ขึ้นไป คุณสามารถ ให้ทำตามขั้นตอนต่อไปนี้

    1. หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะและสามารถส่งคำขอ API เดียวกันไปยัง เซิร์ฟเวอร์แบ็กเอนด์ได้โดยตรงจากระบบของคุณ

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

      ตัวอย่าง #1

      ตัวอย่างที่ 1: การตอบกลับของเซิร์ฟเวอร์แบ็กเอนด์ 204 ที่มีส่วนหัวการเข้ารหัสเนื้อหา

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Encoding: gzip
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      ในตัวอย่างนี้ เซิร์ฟเวอร์แบ็กเอนด์ตอบสนองด้วย รหัสสถานะ 204 No Content และ Content-Encoding: gzip

      ตัวอย่าง #2

      ตัวอย่างที่ 2: การตอบกลับของเซิร์ฟเวอร์แบ็กเอนด์ 204 ที่มีส่วนหัว Content-Length

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Length: 48
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      ในตัวอย่างนี้ เซิร์ฟเวอร์แบ็กเอนด์ตอบสนองด้วย รหัสสถานะ 204 No Content และ Content-Length: 48

      ตัวอย่าง #3

      ตัวอย่างที่ 3: การตอบกลับของเซิร์ฟเวอร์แบ็กเอนด์ 205 ที่มีเนื้อหาการตอบกลับ

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 205 Reset Content
      < Date: Sat, 31 Jul 2021 17:14:09 GMT
      < Content-Length: 12
      < Content-Type: text/plain; charset=utf-8
      <
      * Connection #0 to host X.X.X.X left intact
      This is a sample Response
      

      ในตัวอย่างนี้ เซิร์ฟเวอร์แบ็กเอนด์ตอบสนองด้วย รหัสสถานะ 205 Reset Content ที่มีเนื้อหาการตอบกลับ วันที่ This is a sample Response.

    4. ในตัวอย่างข้างต้นทั้งหมด เซิร์ฟเวอร์แบ็กเอนด์ได้ส่ง 204 No Content หรือ รหัสสถานะ 205 Reset Content ที่มีเนื้อหาการตอบกลับและ/หรือส่วนหัวอันใดอันหนึ่ง ที่กล่าวถึงในสาเหตุที่เป็นไปได้
    5. ดังนั้น Apigee Edge ได้ส่งรหัสสถานะ 502 Bad Gateway ที่มีรหัสข้อผิดพลาด protocol.http.ResponseWithBody

ความละเอียด

ตรวจสอบว่าเซิร์ฟเวอร์แบ็กเอนด์เป็นไปตาม Specification เสมอ RFC 7231 ส่วนที่ 6.3.6: 205 รีเซ็ตเนื้อหา เมื่อส่ง 204 No Content หรือ 205 Reset Content ตอบกลับ Apigee Edge กล่าวคือ เซิร์ฟเวอร์แบ็กเอนด์ ต้องไม่ส่งรายการต่อไปนี้เป็นส่วนหนึ่งของ 204 No Content หรือ 205 Reset Content คำตอบ:

  1. เนื้อหาเพย์โหลดการตอบกลับ
  2. และส่วนหัวต่อไปนี้
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

ข้อมูลจำเพาะ

Apigee Edge ตอบกลับด้วยรหัสสถานะ 502 Bad Gateway และรหัสข้อผิดพลาด protocol.http.ResponseWithBody หากเซิร์ฟเวอร์แบ็กเอนด์ส่ง คำตอบ 204 No Content หรือ 205 Reset Content แต่ ไม่เป็นไปตามข้อกำหนด RFC ต่อไปนี้

ข้อมูลจำเพาะ
RFC 7231 ส่วน 6.3.5: 204 ไม่มีเนื้อหา
RFC 7231 ส่วน 6.3.6: 205 รีเซ็ตเนื้อหา

สิ่งสำคัญที่ควรทราบ

วิธีแก้ไขที่แนะนำคือให้แก้ไขเซิร์ฟเวอร์แบ็กเอนด์เพื่อส่ง 204 No Content และรหัสสถานะ 205 Reset Content โดยไม่มีเนื้อหาการตอบกลับและ ส่วนหัว - Content-Length, Content-Encoding และ Transfer-Encoding และปฏิบัติตามข้อกำหนดเฉพาะ RFC 7231 ส่วน 6.3.5: 204 ไม่มีเนื้อหา และ RFC 7231, ส่วน 6.3.6: 205 รีเซ็ตเนื้อหา

หากยังต้องการความช่วยเหลือจากทีมสนับสนุนของ Apigee ให้ไปที่ ต้องรวบรวมข้อมูลการวินิจฉัย

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

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

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

  • ชื่อองค์กร
  • ชื่อสภาพแวดล้อม
  • ชื่อพร็อกซี API
  • ทำตามคำสั่ง curl ในการสร้างข้อผิดพลาด 502 ซ้ำ
  • ไฟล์การติดตามสำหรับคำขอ API

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

  • พบข้อความแสดงข้อผิดพลาดทั้งหมดสำหรับคำขอที่ล้มเหลว
  • ชื่อสภาพแวดล้อม
  • แพ็กเกจพร็อกซี API
  • ไฟล์การติดตามสำหรับคำขอ API
  • บันทึกการเข้าถึง NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    ที่ไหน: ORG, ENV และ PORT# จะถูกแทนที่ด้วย มูลค่าจริง

  • บันทึกระบบของผู้ประมวลผลข้อความ /opt/apigee/var/log/edge-message-processor/logs/system.log