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

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

ลักษณะปัญหา

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

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

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"response headers size exceeding 25,600",
      "detail":{
         "errorcode":"protocol.http.TooBigHeaders"
      }
   }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • ข้อผิดพลาด: response headers size exceeding 25,600
    • error.class: com.apigee.errors.http.server.BadGateway

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

  5. คุณจะเห็นความล้มเหลวในการตอบกลับข้อผิดพลาด Response Sent to Client ที่ส่งโดย Apigee Edge ตามที่แสดงด้านล่าง

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

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

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

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

    ส่วนหัวที่ผิดพลาด ค่า
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source target
    เนื้อหาข้อผิดพลาด: เนื้อความ {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}

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.TooBigHeaders ในช่วงเวลาที่ระบุหรือไม่ (หากปัญหาเกิดขึ้นในอดีต) หรือมีคำขอใดที่ยังคงดำเนินการไม่สำเร็จเมื่อใช้ 502
  4. หากพบข้อผิดพลาด 502 ที่มี X-Apigee-fault-code ตรงกับค่าของ X-Apigee-fault-code ให้ระบุค่าของ X-Apigee-fault-code

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

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

    ส่วนหัวที่ผิดพลาด ค่า
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source target

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

การวินิจฉัย

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

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

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

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

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

    "faultstring":"response headers size exceeding 25,600"
    

    ในข้อความแสดงข้อผิดพลาดข้างต้น โปรดทราบในfaultstringว่าการตอบกลับมีส่วนหัวที่มีขนาดโดยรวมเกินขีดจํากัดที่อนุญาต

    คำขอจริง

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

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

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

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

      curl -v https://TARGET_SERVER_HOST/test
      
      * About to connect() to 10.1.0.10 port 9000 (#0)
      *   Trying 10.1.0.10...
      * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0)
      > GET /test HTTP/1.1
      > User-Agent: curl/7.29.0
      > Host: 10.1.0.10:9000
      > Accept: */*
      <
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Length: 0
      < Content-Type: text/plain; charset=utf-8
      < Last-Modified: Tue, 20 Jul 2021 09:23:56 GMT
      < Testheader1: XVlBzgba—-<snipped>---THctcuAx
      < Testheader2: hxKQFDaFpLSj—-<snipped>---FbcXoEFfRsWxP
      < Date: Fri, 23 Jul 2021 09:51:22 GMT
      <
      * Connection #0 to host 10.1.0.10 left intact
      

      ในตัวอย่างข้างต้น Testheader1 และ Testheader2 มีขนาดสูงกว่า ซึ่งเป็นสาเหตุของข้อผิดพลาดนี้เนื่องจากเกินขีดจํากัดที่อนุญาตใน Apigee Edge

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

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

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

    1. ตรวจสอบบันทึกของตัวประมวลผลข้อความดังนี้

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

    2. ค้นหาเพื่อดูว่ามีข้อผิดพลาด 502 ใดๆ ในช่วงเวลาที่ระบุหรือไม่ (หากเกิดปัญหาในอดีต) หรือมีคำขอใดที่ยังคงดำเนินการไม่สำเร็จเมื่อใช้ 502 คุณอาจใช้สตริงค้นหาต่อไปนี้ได้
      grep -ri "response headers size exceeding"
      
    3. คุณจะเห็นเส้นทางจาก system.log ที่คล้ายกับเส้นทางต่อไปนี้ ขนาดของส่วนหัวการตอบกลับอาจแตกต่างกันไปในกรณีดังนี้
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1
      messageid:r23ijb1b-1  NIOThread@1 ERROR HTTP.CLIENT -
      HTTPClient$Context$3.onException() :  ClientChannel[Connected:
      Remote:3.7.1.1:9000 Local:192.168.2.1:56098]@8414 useCount=1
      bytesRead=0 bytesWritten=207 age=640ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response headers size exceeding 25,600
      
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest
      rev:1 messageid:r23ijb1b-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@31f3ef88, response headers size exceeding 25,600)
      
    4. ทันทีที่ผู้ประมวลผลข้อความได้รับการตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์/เป้าหมาย และพบว่าขนาดส่วนหัวทั้งหมดใหญ่กว่า 25 KB โปรแกรมจะหยุดและแสดงข้อผิดพลาด

      response headers size exceeding 25,600

      หมายความว่าขนาดส่วนหัวทั้งหมดมีขนาดใหญ่กว่า 25 KB และ Apigee จะแสดงข้อผิดพลาดเมื่อขนาดเริ่มเกินขีดจำกัด 25 KB โดยมีโค้ดข้อผิดพลาดเป็น protocol.http.TooBigHeaders

ความละเอียด

ขนาดคงที่

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

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

CwC

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

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

ข้อจำกัด

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

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

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

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

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

    ซึ่งระบุว่าขีดจำกัดสำหรับขนาดเปย์โหลดการตอบกลับที่กำหนดค่าใน Apigee สำหรับ Private Cloud คือ 25 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