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"
      }
   }
}

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

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

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

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

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

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

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

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

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

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

  1. ในตัวอย่างที่กล่าวข้างต้น บรรทัดเริ่มต้น (บรรทัดแรก) ในการตอบกลับหรือที่เรียกว่า 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 ที่ส่งโดยเซิร์ฟเวอร์ target/backend มีขนาดเกิน 2,048 ไบต์

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

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

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

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

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

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

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

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

การตรวจสอบ API

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

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

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

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

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

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

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

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

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

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

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

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

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

  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
    เนื้อหาข้อผิดพลาด : Body {"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 ตรงกับค่าของ X-Apigee-fault-code ให้ระบุค่าของ X-Apigee-fault-code

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

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

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

การวินิจฉัย

  1. กำหนด Fault Code และ Fault Source สำหรับข้อผิดพลาดที่สังเกตโดยใช้ API Monitoring, เครื่องมือ Trace หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไป
  2. หาก Fault Source มีค่า target แสดงว่าขนาด Response-Line ที่แอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งไปยัง 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
      

      ในกรณีข้างต้น Response-Line 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. หากไม่เป็นที่ต้องการ ให้แก้ไขแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์เพื่อให้ส่ง Response-Line ขนาดต่ำกว่าขีดจำกัดที่อนุญาต
  3. หากคุณต้องการส่งบรรทัดการตอบกลับที่เกินขีดจำกัดที่อนุญาต ให้ไปที่ตัวเลือกถัดไป

CwC

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

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

ข้อจำกัด

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

  1. หากคุณเป็นผู้ใช้ Cloud สาธารณะ ขีดจำกัดสูงสุดสำหรับคำขอและขนาดของบรรทัดคำตอบจะบันทึกไว้สำหรับขนาดบรรทัดคำขอ/การตอบกลับในขีดจำกัดของ 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 Cloud คือ 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