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

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

ลักษณะปัญหา

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

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

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

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

ข้อผิดพลาดนี้เกิดขึ้นหากขนาด Response-Line ที่เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งไปยัง Apigee Edge เป็นส่วนหนึ่งของการตอบกลับ HTTP มีขนาดใหญ่กว่า ขีดจำกัดสูงสุดที่อนุญาตใน Apigee Edge

ก่อนที่จะดูสาเหตุที่เป็นไปได้ของข้อผิดพลาดนี้ เรามาทำความเข้าใจความหมายของ Response-Line และวิธีตรวจสอบขนาดกันก่อน

ทำความเข้าใจ Response-Line

การตอบกลับ HTTP โดยทั่วไปประกอบด้วย 3 ส่วน ได้แก่

  1. Status-Line (เรียกว่า Response-Line ใน Apigee)
  2. ( ชุดส่วนหัว HTTP )
  3. [ เนื้อความ ]

Response-Line ประกอบด้วย 3 ส่วน ได้แก่ เวอร์ชันโปรโตคอล ตามด้วยรหัสสถานะ ที่เป็นตัวเลข และวลีที่เป็นข้อความที่เกี่ยวข้อง ดังที่แสดงด้านล่าง

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

เมื่อแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งการตอบกลับ HTTP บรรทัดแรกที่ ส่งจะแสดงResponse-Lineตามที่อธิบายไว้ข้างต้น ตามด้วยส่วนหัวและเนื้อความ/เพย์โหลดของการตอบกลับ ภาพหน้าจอตัวอย่างต่อไปนี้แสดงคำขอ curl ทั่วไป ส่วนคำขอ และส่วนการตอบกลับ (พร้อมด้วย Response-Line)

ทำความเข้าใจขนาด Response-Line

  1. ในตัวอย่างที่กล่าวถึงข้างต้น บรรทัด เริ่มต้น (บรรทัดแรก) ในการตอบกลับซึ่งเรียกอีกอย่างว่า Response-Line มีลักษณะดังนี้

    HTTP/1.1 200 OK

    Response-Line นี้มีขนาด ~15 bytes เนื่องจากมี 15 ASCII characters เนื่องจากขนาดนี้อยู่ใน ขีดจำกัดที่อนุญาตใน Apigee Edge การตอบกลับจึงถูกส่งกลับไปยังไคลเอ็นต์โดยไม่มี ข้อผิดพลาดจาก Apigee Edge

  2. ในทำนองเดียวกัน หากคุณดู faultstring ใน ข้อความแสดงข้อผิดพลาด ที่แสดงข้างต้น จะมีข้อความ "response line size exceeding 2,048" ซึ่งบ่งชี้ว่า Response-Line ในการตอบกลับ HTTP ที่เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งมีขนาดเกิน 2,048 ไบต์

ทำความเข้าใจ Response-Line ขนาดใหญ่

ตามคำจำกัดความของ Status-Line (เรียกว่า Response-Line ในที่นี้) และคำขอและการตอบกลับ HTTP ทั่วไป ขนาดจะเล็กกว่าขีดจำกัดเริ่มต้นที่กำหนดไว้ที่ 2 KB ใน Apigee Edge, ดังนั้นเราจึงอาจไม่ เกินขีดจำกัด อย่างไรก็ตาม นี่คือสถานการณ์ที่เป็นไปได้บางส่วนที่คุณอาจเกินขีดจำกัดนี้

  1. เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ไม่ใช่ระบบ HTTP จึงอาจตอบกลับด้วยการตอบกลับที่ไม่ใช่ HTTP ตอบกลับ
  2. เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์มีปัญหาและส่ง Response-Line ที่ยาวเป็นส่วนหนึ่งของการตอบกลับ HTTP

อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่ หัวข้อการได้รับข้อผิดพลาด protocol.http.TooBigLine, "response line size exceeding 2,048

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

สาเหตุ คำอธิบาย วิธีการแก้ปัญหาที่ใช้ได้กับ
ขนาด Response-Line ใหญ่กว่าขีดจำกัดที่อนุญาต ขนาด Response-Line ที่เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งเป็นส่วนหนึ่งของการตอบกลับ HTTP ไปยัง Apigee Edge มีขนาดใหญ่กว่า ขีดจำกัดที่อนุญาตใน Apigee Edge ผู้ใช้ Edge Public และ Private Cloud

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

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

การตรวจสอบ API

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

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

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

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

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

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

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

  10. จากหน้าต่างบันทึก ให้จดรายละเอียดต่อไปนี้
    • รหัสสถานะ: 502
    • แหล่งที่มาของข้อผิดพลาด: target
    • รหัสข้อผิดพลาด: protocol.http.TooBigLine
  11. หากแหล่งที่มาของข้อผิดพลาด มีค่าเป็น target และรหัสข้อผิดพลาด มีค่าเป็น protocol.http.TooBigLine แสดงว่าการตอบกลับ HTTP จากเซิร์ฟเวอร์เป้าหมาย/ แบ็กเอนด์มีขนาด Response-Line ใหญ่กว่าขีดจำกัดสูงสุดที่อนุญาตใน Apigee Edge

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

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

    จดค่าข้อผิดพลาดจากการติดตาม

    • error: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

    ซึ่งบ่งชี้ว่า Apigee Edge (คอมโพเนนต์ Message Processor) แสดงข้อผิดพลาดทันทีที่ได้รับคำตอบจากเซิร์ฟเวอร์แบ็กเอนด์เนื่องจากขนาด Response-Line เกินขีดจำกัดที่อนุญาต

  5. คุณจะเห็นข้อความแสดงข้อผิดพลาดที่ส่งไปยังไคลเอ็นต์ในขั้นตอนการตอบกลับที่ส่งไปยัง ไคลเอ็นต์ ดังที่แสดงด้านล่าง

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

  6. จดค่าข้อผิดพลาดจากการติดตาม
    • Error: 502 Bad Gateway
    • เนื้อหาข้อผิดพลาด: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. นอกจากนี้ คุณยังไปที่ขั้นตอน AX (บันทึกข้อมูลวิเคราะห์) ในการติดตาม และคลิกเพื่อดูรายละเอียดข้อผิดพลาดได้ด้วย

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

    จดค่าต่อไปนี้

    ส่วนหัวของคำขอ ค่า
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    เนื้อหาข้อผิดพลาด : เนื้อความ {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

NGINX

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

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

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

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

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

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

    ส่วนหัวการตอบกลับ ค่า
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target

สาเหตุ: ขนาด Response-Line ใหญ่กว่าขีดจำกัดที่อนุญาต

การวินิจฉัย

  1. กำหนดรหัสข้อผิดพลาด และแหล่งที่มาของข้อผิดพลาด สำหรับข้อผิดพลาดที่พบโดยใช้การตรวจสอบ API เครื่องมือติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยทั่วไป
  2. หากแหล่งที่มาของข้อผิดพลาด มีค่าเป็น target แสดงว่าขนาด Response-Line ที่แอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งไปยัง Apigee มีขนาดใหญ่กว่าขีดจำกัดที่อนุญาตใน Apigee Edge
  3. คุณสามารถตรวจสอบว่าขนาด Response-Line เกินขีดจำกัดที่อนุญาต 2 KB โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้

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

    วิธีตรวจสอบโดยใช้ข้อความแสดงข้อผิดพลาด

    หากคุณมีสิทธิ์เข้าถึงข้อความแสดงข้อผิดพลาดทั้งหมดที่ได้รับจาก Apigee Edge ให้ดูที่ faultstring

    ตัวอย่างข้อความแสดงข้อผิดพลาด:

    "faultstring":"response line size exceeding 2,048"

    faultstring ข้างต้นบ่งชี้ว่าขนาด Response-Line เกินขีดจำกัดที่อนุญาต 2 KB

    คำขอจริง

    วิธีตรวจสอบโดยใช้คำขอจริง

    หากคุณมีสิทธิ์เข้าถึงคำขอจริงที่ส่งไปยังแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ ให้ทำตามขั้นตอนต่อไปนี้

    1. ตรวจสอบขนาด Response-Line
    2. หากพบว่าขนาด URI ใหญ่กว่า ขีดจำกัดที่อนุญาตใน Apigee Edge แสดงว่าขนาด URI เป็นสาเหตุของปัญหา

      ตัวอย่างการตอบกลับจากเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0

      ในกรณีข้างต้น Response-Line HTTP/1.1 200 1111…<trimmed>...11111111 มีขนาดใหญ่กว่า 2 KB นั่นคือมีอักขระ ASCII มากกว่า 2,000 ตัว

      หากคุณใช้ไคลเอ็นต์อื่น ให้ตรวจสอบบันทึกของไคลเอ็นต์และลอง ดูขนาด Response-Line ที่ส่งไปยัง Apigee Edge

    บันทึกของ Message Processor

    วิธีตรวจสอบโดยใช้บันทึกของ Message Processor

    หากคุณเป็นผู้ใช้ Private Cloud คุณสามารถใช้บันทึกของ Message Processor เพื่อ ตรวจสอบว่าขนาด Response-Line เกิน ขีดจำกัดที่อนุญาตใน Apigee Edge หรือไม่

    1. กำหนดรหัสข้อความของคำขอที่ไม่สำเร็จโดยใช้การตรวจสอบ API, เครื่องมือติดตาม, หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยทั่วไป
    2. ค้นหารหัสข้อความในบันทึกของ Message Processor

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. คุณจะเห็นบรรทัดจาก system.log ที่มีลักษณะคล้ายกับบรรทัดต่อไปนี้

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)

      ข้อความ message = response line size exceeding 2,048 ในข้อความแสดงข้อผิดพลาดข้างต้นบ่งชี้ว่าขนาด Response-Line มีขนาดมากกว่า 2 KB ดังนั้น Apigee Edge จึงแสดงข้อยกเว้นและแสดงรหัสสถานะ 502 พร้อมรหัสข้อผิดพลาด protocol.http.TooBigline ไปยังแอปพลิเคชันไคลเอ็นต์

ความละเอียด

แก้ไขขนาด

ตัวเลือกที่ 1 [แนะนำ]: แก้ไขแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ไม่ให้ส่ง Response-Line ที่มีขนาดใหญ่กว่าขีดจำกัดที่อนุญาต

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

CwC

ตัวเลือกที่ 2: ใช้พร็อพเพอร์ตี้ CwC เพื่อเพิ่มขีดจำกัด Response-Line

Apigee มีพร็อพเพอร์ตี้ CwC ซึ่งช่วยให้เพิ่มขีดจำกัดขนาด Response-Line ได้ ดูรายละเอียดได้ที่ หัวข้อตั้งค่าขีดจำกัด Response-Line ใน Message Processor

จำกัดสูงสุด

Apigee คาดหวังว่าแอปพลิเคชันไคลเอ็นต์และเซิร์ฟเวอร์แบ็กเอนด์จะไม่ส่ง Request/Response-Lines ที่มีขนาดใหญ่กว่าขีดจำกัดที่อนุญาตตามที่ระบุไว้ในเอกสารประกอบสำหรับ ขีดจำกัด Request/Response-Line ใน ขีดจำกัดของ Apigee Edge

  1. หากคุณเป็นผู้ใช้ Public Cloud ขีดจำกัดสูงสุดสำหรับขนาด Request และ Response-Line จะเป็นไปตามที่ระบุไว้ในเอกสารประกอบสำหรับขนาด Request/Response-Line ใน ขีดจำกัดของ Apigee Edge
  2. หากคุณเป็นผู้ใช้ Private Cloud คุณอาจแก้ไขขีดจำกัดสูงสุดเริ่มต้นสำหรับขนาด Request และ Response-Line (แม้ว่าจะไม่ใช่วิธีที่แนะนำ) คุณสามารถกำหนดขีดจำกัดขนาด Response-Line สูงสุดได้โดยทำตามวิธีการใน หัวข้อวิธีตรวจสอบขีดจำกัดปัจจุบัน

วิธีตรวจสอบขีดจำกัดปัจจุบัน

ส่วนนี้อธิบายวิธีตรวจสอบว่าพร็อพเพอร์ตี้ HTTPResponse.line.limit ได้รับการอัปเดตด้วยค่าใหม่ใน Message Processor แล้ว

  1. ในเครื่อง Message Processor ให้ค้นหาพร็อพเพอร์ตี้ HTTPResponse.line.limit ในไดเรกทอรี /opt/apigee/edge-message-processor/conf และตรวจสอบว่ามีการตั้งค่าค่าใดไว้ ดังที่แสดงด้านล่าง
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. ผลลัพธ์ตัวอย่างจากคำสั่งข้างต้นมีดังนี้
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
  3. ในเอาต์พุตตัวอย่างข้างต้น ให้สังเกตว่าพร็อพเพอร์ตี้ HTTPResponse.line.limit ได้รับการตั้งค่าด้วยค่า 2k ใน http.properties

    ซึ่งบ่งชี้ว่าขีดจำกัดสำหรับขนาด Response-Line ที่กำหนดค่าไว้ใน Apigee สำหรับ Private Cloud คือ 2 KB

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

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

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

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

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

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

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

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

  • บันทึกของระบบ Message Processor /opt/apigee/var/log/edge-message-processor/logs/system.log