414 Request-URI ยาวเกินไป - TooBigLine

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

ลักษณะปัญหา

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

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

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

HTTP/1.1 414 Request-URI Too Long

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

{
   "fault":{
      "faultstring":"request line size exceeding 7,168",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

โปรดทราบว่า faultstring ในข้อความแสดงข้อผิดพลาดข้างต้นมีขีดจำกัดที่อนุญาต สำหรับบรรทัดคำขอใน Apigee Edge ซึ่งคือ 7168 bytes (7 KB)

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

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

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

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

คำขอ HTTP ทั่วไปประกอบด้วย 3 ส่วน ได้แก่

  1. Request-Line
  2. ( ชุดส่วนหัว HTTP )
  3. [ Body ]

บรรทัดคำขอประกอบด้วย 3 ส่วนดังที่แสดงด้านล่าง

Request-Line = <Method> <Request-URI> <HTTP-Version>

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

ภาพหน้าจอตัวอย่างต่อไปนี้แสดงคำขอ curl ทั่วไป ส่วนคำขอ (พร้อม Request-Line) และส่วนการตอบกลับ

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

  1. ในตัวอย่างที่กล่าวถึงข้างต้น บรรทัด เริ่มต้น (บรรทัดแรก) ในคำขอ ซึ่งเรียกอีกอย่างว่า Request-Line มีลักษณะดังนี้
    GET /test/ HTTP/1.1

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

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

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

สาเหตุ คำอธิบาย วิธีการแก้ปัญหาที่ใช้ได้กับ
เพย์โหลดของคำขอมีขนาดใหญ่กว่าขีดจำกัดที่อนุญาต ขนาดของ Request-URI ที่แอปพลิเคชันไคลเอ็นต์ส่งไปยัง Apigee Edge ซึ่งเป็นส่วนหนึ่งของคำขอ HTTP มีขนาดใหญ่กว่าขีดจำกัดที่อนุญาตใน 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.TooBigLine และรหัสสถานะเป็น 414 ดังที่แสดงด้านล่าง

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

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

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

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

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

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

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

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

NGINX

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

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

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

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

  3. ค้นหาเพื่อดูว่ามีข้อผิดพลาด 414 เกิดขึ้นในช่วงเวลาที่เฉพาะเจาะจงหรือไม่ (หากปัญหาเกิดขึ้นในอดีต) หรือยังมีคำขอที่ล้มเหลวด้วยข้อผิดพลาด 414 อยู่หรือไม่
  4. หากพบข้อผิดพลาด 414 ที่มี 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 policy

    โปรดทราบความยาวคำขอ: 7244 (7.244 KB > ขีดจำกัดที่อนุญาต)

สาเหตุ: เพย์โหลดของคำขอมีขนาดใหญ่กว่าขีดจำกัดที่อนุญาต

การวินิจฉัย

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

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

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

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

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

    "faultstring":"request line size exceeding 7,168"

    คำขอจริง

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

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

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

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

      curl http://<hostalias>/testtoobigline?_qparam=000000000000000000……..000000<trimmed> -k -X POST
      

      ในกรณีข้างต้น ค่าของพารามิเตอร์การค้นหา qparam มีขนาดใหญ่กว่า 7 KB นั่นคือมีอักขระ ASCII มากกว่า 7,000 ตัว

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

    บันทึกของ Message Processor

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

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

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

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

    2. ค้นหาเพื่อดูว่ามีข้อผิดพลาด 414 เกิดขึ้นในช่วงเวลาที่เฉพาะเจาะจงหรือไม่ (หากปัญหาเกิดขึ้นในอดีต) หรือยังมีคำขอที่ล้มเหลวด้วยข้อผิดพลาด 414 อยู่หรือไม่ คุณอาจใช้สตริงการค้นหาต่อไปนี้
      grep -ri "exceeding"
      
      grep -ri "RequestURITooLong"
      
    3. คุณจะเห็นบรรทัดจาก system.log ที่มีลักษณะคล้ายกับบรรทัดต่อไปนี้
      2021-07-12 08:53:31,461  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() : Request:null, uri:null,
      message Id:null, exception:com.apigee.errors.http.user.RequestURITooLong{
      code = protocol.http.TooBigLine, message = request line size exceeding 7,168,
      associated contexts = []}, context:Context@366f4217
      input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.195.90:8443
      Local:192.168.67.23:34256]@301912 useCount=1 bytesRead=0 bytesWritten=45849
      age=2254670ms lastIO=0ms isOpen=true)

      ข้อความ message = request line size exceeding 7,168 ในข้อความแสดงข้อผิดพลาดข้างต้นบ่งชี้ว่า URI ของคำขอมีขนาดใหญ่กว่า 7 KB ดังนั้น Apigee Edge จะแสดงข้อยกเว้น com.apigee.errors.http.user.RequestURITooLong และแสดง 414 รหัสสถานะพร้อม Fault Code protocol.http.TooBigline ไปยังแอปพลิเคชันไคลเอ็นต์

ความละเอียด

แก้ไขขนาด

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

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

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

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. หากต้องการและต้องการส่ง URI ที่มีขนาดใหญ่กว่าขีดจำกัดที่อนุญาต ให้ไปที่ ตัวเลือกถัดไป

CwC

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

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

จำกัดสูงสุด

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

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

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

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

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

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

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

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

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

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

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

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

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