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

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

ลักษณะปัญหา

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

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

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

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

  1. บรรทัดคำขอ
  2. ( ชุดของส่วนหัว HTTP )
  3. [ เนื้อความ ]

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

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

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

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

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

  1. ในตัวอย่างที่ระบุไว้ข้างต้น บรรทัดเริ่มต้น (บรรทัดแรก) ในคำขอหรือที่เรียกว่าบรรทัดคำขอมีดังนี้
    GET /test/ HTTP/1.1
    

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

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

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

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

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

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

การตรวจสอบ API

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

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

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

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

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

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

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

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

  9. ดูรายละเอียดต่อไปนี้จากหน้าต่าง Logs

    • รหัสสถานะ: 414
    • แหล่งที่มาของข้อผิดพลาด: apigee
    • Fault Code: protocol.http.TooBigLine
    • ความยาวคำขอ(ไบต์): 7244 (> 7KB)
  10. หาก Fault Source มีค่า apigee หรือ MP แล้ว Fault Code จะมีค่า protocol.http.TooBigLine และ Request-Length มากกว่า 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 ตรงกับค่าของ X-Apigee-fault-code ให้ระบุค่าของ X-Apigee-fault-code

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

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

    หมายเหตุความยาวของคำขอ: 7244 (7.244KB > ขีดจำกัดที่อนุญาต)

สาเหตุ: ขนาดเปย์โหลดคำขอเกินขีดจำกัดที่อนุญาต

การวินิจฉัย

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

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

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

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

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

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

    คำขอจริง

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

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

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

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

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

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

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

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

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

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

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

      /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 ที่มีรหัสข้อผิดพลาด 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 ที่ช่วยให้เพิ่มขีดจำกัดขนาดบรรทัดคำขอได้ โปรดดูรายละเอียดที่ กำหนดขีดจำกัดบรรทัดคำขอในเครื่องมือประมวลผลข้อความ

ข้อจำกัด

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

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

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

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

  1. ในเครื่องเครื่องมือประมวลผลข้อความ ให้ค้นหาพร็อพเพอร์ตี้ 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

    ซึ่งระบุว่าขีดจำกัดสำหรับขนาดบรรทัดคำขอที่กำหนดค่าใน Apigee สำหรับ Private Cloud คือ 7 KB

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

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

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

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

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

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

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