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

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

ลักษณะปัญหา

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

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

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

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

ทำความเข้าใจบรรทัดตอบกลับ

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

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

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

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

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

ทำความเข้าใจเกี่ยวกับขนาดของบรรทัดการตอบกลับ

  1. ในตัวอย่างที่พูดถึงข้างต้น บรรทัด start (บรรทัดแรก) ในคำตอบยัง ซึ่งเรียกว่า Response-Line ดังนี้

    HTTP/1.1 200 OK
    

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

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

ทำความเข้าใจบรรทัดตอบกลับขนาดใหญ่

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

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

อ่านเพิ่มเติมเกี่ยวกับสิ่งนี้ใน ได้รับข้อผิดพลาด Protocol.http.TooBigLine "บรรทัดการตอบกลับมีขนาดเกิน 2,048

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

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

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

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

การตรวจสอบ API

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

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

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

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

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

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

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

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

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

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

    บันทึกค่าของข้อผิดพลาดจากการติดตามดังนี้

    • ข้อผิดพลาด: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

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

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

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

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

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

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

    ส่วนหัวของคำขอ ค่า
    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

สาเหตุ: บรรทัดการตอบกลับมีขนาดเกินขีดจํากัดที่อนุญาต

การวินิจฉัย

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

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

    หากต้องการตรวจสอบโดยใช้ข้อความแสดงข้อผิดพลาด ให้ทำดังนี้

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

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

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

    faultstring ด้านบนหมายความว่าขนาดบรรทัดการตอบกลับเกินค่าที่อนุญาต ที่ 2 KB

    คำขอจริง

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

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

    1. ยืนยันขนาดของบรรทัดการตอบกลับ
    2. หากคุณพบว่า URI มีขนาดเกิน ขีดจำกัดที่อนุญาตใน Apigee Edge นั่นเป็นสาเหตุของ ถึงปัญหา

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

      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
      

      ในกรณีข้างต้น บรรทัดการตอบกลับ HTTP/1.1 200 1111…<trimmed>...11111111 มีขนาดใหญ่กว่า 2 KB ซึ่งหมายความว่ามี อักขระ ASCII มากกว่า 2 K

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

    บันทึกของผู้ประมวลผลข้อความ

    วิธีตรวจสอบโดยใช้บันทึกของโปรแกรมประมวลผลข้อความ

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

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

      /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 ข้างต้น ข้อความแสดงข้อผิดพลาดระบุว่าบรรทัดการตอบกลับมีขนาดเกิน 2 KB ดังนั้น Apigee Edge จะแสดงข้อยกเว้นและแสดงผลรหัสสถานะ 502 ด้วย รหัสข้อผิดพลาดprotocol.http.TooBigline ในแอปพลิเคชันไคลเอ็นต์

ความละเอียด

แก้ไขขนาด

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

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

CwC

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

Apigee จะมอบ CwC ซึ่งทำให้เพิ่มขีดจำกัดขนาดบรรทัดการตอบกลับได้ โปรดดูรายละเอียดที่หัวข้อ ตั้งค่าขีดจำกัดบรรทัดตอบกลับในตัวประมวลผลข้อความ

จำกัดสูงสุด

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

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

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

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

  1. ค้นหาคุณสมบัติในเครื่องประมวลผลข้อความ 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

    ซึ่งเป็นการระบุว่าขีดจำกัดสำหรับขนาดบรรทัดการตอบกลับที่กำหนดค่าใน Apigee สำหรับ Private ระบบคลาวด์มีขนาด 2 KB

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

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

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

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

  • ชื่อองค์กร
  • ชื่อสภาพแวดล้อม
  • ชื่อพร็อกซี 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# จะถูกแทนที่ด้วย มูลค่าจริง

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