431 ช่องส่วนหัวของคําขอใหญ่เกินไป - TooBigHeaders

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

ลักษณะปัญหา

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

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

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

HTTP/1.1 431 Request Header Fields Too Large

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

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

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

ข้อผิดพลาดนี้เกิดขึ้นหากขนาดรวมของส่วนหัวของคำขอทั้งหมดที่แอปพลิเคชันไคลเอ็นต์ส่งไปยัง Apigee Edge ซึ่งเป็นส่วนหนึ่งของคำขอ HTTP มีขนาดใหญ่กว่า ขีดจำกัดที่อนุญาตใน Apigee Edge ตาม RFC 6585, section 5: 431 Request Header Fields Too Large

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

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

ขั้นตอนการวินิจฉัยที่พบบ่อย

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

API Monitoring

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

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

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

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

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

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

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

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

  9. จากหน้าต่างบันทึก ให้จดรายละเอียดต่อไปนี้

    • รหัสสถานะ: 431
    • แหล่งที่มาของข้อผิดพลาด: apigee
    • Fault Code: protocol.http.TooBigHeaders
    • ความยาวของคำขอ(ไบต์): 32150 (> 25 KB)
  10. หากแหล่งที่มาของข้อผิดพลาด มีค่าเป็น apigee หรือ MP Fault Code มีค่าเป็น protocol.http.TooBigHeaders และความยาวของคำขอ มากกว่า 25 KB แสดงว่าขนาดรวมของส่วนหัวของคำขอทั้งหมดที่แอปพลิเคชันไคลเอ็นต์ส่งเป็นส่วนหนึ่งของคำขอ HTTP มีขนาดใหญ่กว่า ขีดจำกัดที่อนุญาตใน Apigee

เครื่องมือ Trace

NGINX

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

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

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

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

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

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

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

    โปรดทราบความยาวของคำขอ: 40159 (40 KB มากกว่า 25 KB, ขีดจำกัดที่อนุญาตสำหรับส่วนหัวของคำขอใน Apigee Edge)

    ในรายการบันทึกตัวอย่างข้างต้น X-Apigee-fault-source มีค่าเป็น apigee หรือ MP X-Apigee-fault-code มีค่าเป็น protocol.http.TooBigHeaders และ ความยาวของคำขอ คือ 40 KB ซึ่ง มากกว่าขีดจำกัดที่อนุญาตใน Apigee ซึ่งคือ 25 KB ซึ่งแสดงให้เห็นอย่างชัดเจนว่าขนาดรวมของส่วนหัวของคำขอทั้งหมดที่แอปพลิเคชันไคลเอ็นต์ส่งเป็นส่วนหนึ่งของคำขอ HTTP มีขนาดเกินขีดจำกัดที่อนุญาต 25 KB ใน Apigee Edge

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

การวินิจฉัย

  1. กำหนด Fault Code แหล่งที่มาของข้อผิดพลาด และขนาดความยาวของคำขอ สำหรับ ข้อผิดพลาดที่พบโดยใช้ API Monitoring หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยที่พบบ่อย
  2. หากแหล่งที่มาของข้อผิดพลาด มีค่าเป็น apigee หรือ MP, Fault Code มีค่าเป็น protocol.http.TooBigHeaders, และความยาวของคำขอ มากกว่า 25 KB แสดงว่า ขนาดคำขอที่แอปพลิเคชันไคลเอ็นต์ส่งไปยัง Apigee มีขนาดใหญ่กว่า ขีดจำกัดที่อนุญาตใน Apigee Edge
  3. คุณสามารถตรวจสอบว่าขนาดส่วนหัวของคำขอเกินขีดจำกัดที่อนุญาต 25 KB โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้

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

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

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

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

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

    คำขอจริง

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

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

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

      ตัวอย่างคำขอ:

      curl -v https://HOSTALIAS/test -H "header0: 000000000000000000……..000000<trimmed>" -H "header1: 111111111111111111……..111111<trimmed>" -H "header2: 222222222222222222……..222222<trimmed>"-H "header3: 333333333333333333……..333333<trimmed>"
      

      ในกรณีข้างต้น ขนาดรวมของส่วนหัว header0, header1, header2, และ header3 มีขนาดใหญ่กว่า 25 KB ซึ่งหมายความว่ามี อักขระ ASCII (ไบต์) มากกว่า 25,000 ตัว

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

    บันทึกของ Message Processor

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

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

    1. ตรวจสอบบันทึกของ Message Processor

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

    2. ค้นหาเพื่อดูว่ามีข้อผิดพลาด 431 เกิดขึ้นในช่วงเวลาที่เฉพาะเจาะจง หรือไม่ (หากปัญหาเกิดขึ้นในอดีต) หรือยังมีคำขอ ที่ล้มเหลวด้วยข้อผิดพลาด 431 อยู่หรือไม่ คุณอาจใช้สตริงการค้นหาต่อไปนี้
      grep -ri "exceeding"
      
      grep -ri "RequestHeadersTooLarge"
      
    3. คุณจะเห็นบรรทัดจาก system.log ที่คล้ายกับบรรทัดต่อไปนี้
      2021-07-27 08:30:28,419  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() :
      Request:GET, uri:/test/, message Id:null,
      exception:com.apigee.errors.http.user.RequestHeadersTooLarge{
      code = protocol.http.TooBigHeaders, message = request headers size
      exceeding 25,600, associated contexts = []}, context:Context@9c5903
      input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.205.251:8443 Local:192.168.67.23:22188]@25130
      useCount=1 bytesRead=0 bytesWritten=15367 age=667062ms  lastIO=0ms
      isOpen=true)

      ข้อความ message = request headers size exceeding 25,600 ในข้อความแสดงข้อผิดพลาดข้างต้นระบุว่าขนาดรวมของส่วนหัวของคำขอมีขนาดมากกว่า 25 KB ดังนั้น Apigee Edge จะแสดงข้อยกเว้น com.apigee.errors.http.user.RequestHeadersTooLarge และแสดงรหัสสถานะ 431 พร้อม Fault Code protocol.http.TooBigHeaders ไปยังแอปพลิเคชันไคลเอ็นต์

ความละเอียด

แก้ไขขนาด

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

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

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

    curl -v https://HOSTALIAS/test -d '{ "header0: 000000000000000000……..000000<trimmed>" , "header1: 111111111111111111……..111111<ttrimmed>" , "header2: 222222222222222222……..222222<ttrimmed>", "header3: 333333333333333333……..333333<ttrimmed>" }'
    
  3. หากต้องการและต้องการส่งส่วนหัวที่มีขนาดใหญ่กว่าขีดจำกัดที่อนุญาต ให้ไปที่ ตัวเลือกถัดไป

CwC

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

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

จำกัดสูงสุด

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

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

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

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

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

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

ข้อมูลจำเพาะ

Apigee Edge คาดหวังว่าแอปพลิเคชันไคลเอ็นต์จะไม่ส่งส่วนหัวที่มีขนาดใหญ่เป็นส่วนหนึ่งของ คำขอ ในกรณีที่คำขอมีส่วนหัวที่มีขนาดรวมมากกว่าขีดจำกัดที่ระบุ Apigee จะแสดง 431 Request Header Fields Too Large ตามข้อกำหนด RFC ต่อไปนี้

ข้อมูลจำเพาะ
RFC 6585, section 5: 431 Request Header Fields Too Large

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

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

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

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

  • ชื่อองค์กร
  • ชื่อสภาพแวดล้อม
  • ชื่อพร็อกซี API
  • คำสั่ง curl ที่สมบูรณ์ซึ่งใช้ในการจำลองข้อผิดพลาด 431
  • ไฟล์ Trace สำหรับคำขอ API

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

  • ข้อความแสดงข้อผิดพลาดทั้งหมดที่พบสำหรับคำขอที่ล้มเหลว
  • ชื่อองค์กร
  • ชื่อสภาพแวดล้อม
  • App Bundle ของพร็อกซี API
  • ไฟล์ Trace สำหรับคำขอ API ที่ล้มเหลว
  • คำสั่ง curl ที่สมบูรณ์ซึ่งใช้ในการจำลองข้อผิดพลาด 431
  • บันทึกการเข้าถึง 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