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

(ตั้งค่าเป็นไม่ใช่ศูนย์)

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

Content-Encoding

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

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

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

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

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

ใช้เครื่องมือ/เทคนิคอย่างใดอย่างหนึ่งต่อไปนี้เพื่อวิเคราะห์ข้อผิดพลาดนี้

การตรวจสอบ API

วิธีวินิจฉัยข้อผิดพลาดโดยใช้ API Monitoring

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

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

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

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

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

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

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

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

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

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

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

  3. เลือกคำขอที่ล้มเหลว 1 รายการและตรวจสอบการติดตาม
  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) ในการติดตาม แล้วคลิกตัวเลือกนั้น
  7. เลื่อนลงไปที่ส่วน Phase Details, Error Headers และระบุค่าของ 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. กำหนด Fault Code และ Fault Source สำหรับข้อผิดพลาดที่พบโดยใช้ API Monitoring, เครื่องมือติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในขั้นตอนการวิเคราะห์ทั่วไป
  2. หาก Fault Code คือ protocol.http.ResponseWithBody และ Fault Source มีค่า target แสดงว่าเซิร์ฟเวอร์แบ็กเอนด์ตอบกลับด้วยรหัสสถานะ 204 No Content หรือ 205 Reset Content พร้อมเนื้อหาการตอบกลับและ/หรือหนึ่งในส่วนหัวที่กล่าวถึงในสาเหตุที่เป็นไปได้
  3. หากต้องการตรวจสอบว่าเซิร์ฟเวอร์แบ็กเอนด์ได้ส่งเนื้อหาเพย์โหลดการตอบกลับและ/หรือส่วนหัวอย่างน้อย 1 รายการที่กล่าวถึงในสาเหตุที่เป็นไปได้จริงหรือไม่ ให้ทําตามขั้นตอนต่อไปนี้

    1. หากคุณเป็นผู้ใช้ Cloud สาธารณะและคุณสามารถส่งคำขอ 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 ของเซิร์ฟเวอร์แบ็กเอนด์ที่มีส่วนหัวความยาวของเนื้อหา

      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

ความละเอียด

ตรวจสอบว่าเซิร์ฟเวอร์แบ็กเอนด์ปฏิบัติตามข้อกําหนด 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