414 URI yêu cầu quá dài - TooBigLine

Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu Apigee X.
thông tin

Dấu hiệu

Ứng dụng khách nhận được mã trạng thái HTTP 414 Request-URI Too Long với mã lỗi protocol.http.TooBigLine làm phản hồi cho các lệnh gọi API.

Thông báo lỗi

Ứng dụng khách nhận được mã phản hồi sau:

HTTP/1.1 414 Request-URI Too Long

Ngoài ra, bạn có thể thấy thông báo lỗi sau:

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

Xin lưu ý rằng faultstring trong thông báo lỗi ở trên chứa giới hạn được phép cho dòng yêu cầu trong Apigee Edge, đó là 7168 bytes (7 KB).

Các nguyên nhân có thể

Lỗi này xảy ra nếu kích thước của dòng yêu cầu do ứng dụng khách gửi đến Apigee Edge trong yêu cầu HTTP lớn hơn hạn mức cho phép trong Apigee Edge.

Trước khi xem xét các nguyên nhân có thể gây ra lỗi này, hãy tìm hiểu ý nghĩa của dòng yêu cầu và cách kiểm tra kích thước của dòng yêu cầu.

Tìm hiểu về Request-Line

Một yêu cầu HTTP thông thường bao gồm 3 phần:

  1. Request-Line
  2. ( Tập hợp tiêu đề HTTP)
  3. [ Nội dung ]

Dòng yêu cầu bao gồm 3 phần như minh hoạ bên dưới.

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

Khi ứng dụng khách gửi một yêu cầu HTTP đến máy chủ, dòng đầu tiên gửi đến máy chủ sẽ chứa Request-Line như mô tả ở trên. Tiếp theo là tiêu đề và nội dung/tải trọng yêu cầu.

Ảnh chụp màn hình mẫu sau đây cho thấy một yêu cầu curl điển hình, phần Request (cùng với Request-Line) và phần Response.

Tìm hiểu về kích thước Request-Line

  1. Trong mẫu được thảo luận ở trên, dòng start (dòng đầu tiên) trong yêu cầu, còn được gọi là Request-Line, như sau:
    GET /test/ HTTP/1.1

    Kích thước của Request-Line là ~19 bytes vì nó chứa 19 ASCII characters. Vì nằm trong giới hạn cho phép trong Apigee Edge, nên yêu cầu này được xử lý mà không gặp lỗi và bạn nhận được phản hồi thành công.

  2. Tương tự, nếu bạn xem faultstring trong Thông báo lỗi xuất hiện ở trên, thì thông báo này có chứa "request line size exceeding 7,168". Điều này cho biết Request-Line trong yêu cầu HTTP do máy khách thực hiện đã vượt quá 7.168 byte.

Sau đây là những nguyên nhân có thể gây ra lỗi này:

Nguyên nhân Mô tả Hướng dẫn khắc phục sự cố áp dụng cho
Kích thước tải trọng yêu cầu lớn hơn giới hạn cho phép Kích thước của Request-URI do ứng dụng khách gửi trong yêu cầu HTTP đến Apigee Edge lớn hơn giới hạn cho phép trong Apigee Edge. Người dùng Edge Public Cloud và Private Cloud

Các bước chẩn đoán thường gặp

Hãy sử dụng một trong các công cụ/kỹ thuật sau để chẩn đoán lỗi này:

Giám sát API

Cách chẩn đoán lỗi bằng tính năng Giám sát API:

  1. Đăng nhập vào giao diện người dùng Apigee Edge với tư cách là người dùng có vai trò phù hợp.
  2. Chuyển sang tổ chức mà bạn muốn điều tra vấn đề.

  3. Chuyển đến trang Phân tích > Giám sát API > Điều tra.
  4. Chọn khung thời gian cụ thể mà bạn nhận thấy lỗi.
  5. Vẽ Mã lỗi theo Thời gian.
  6. Chọn một ô có mã lỗi protocol.http.TooBigLine và mã trạng thái 414 như minh hoạ bên dưới:

    ( xem hình ảnh lớn hơn)

  7. Bạn sẽ thấy thông tin về mã lỗi protocol.http.TooBigline như minh hoạ dưới đây:

    ( xem hình ảnh lớn hơn)

  8. Nhấp vào Xem nhật ký rồi mở rộng hàng của yêu cầu không thực hiện được:

    ( xem hình ảnh lớn hơn)

  9. Trong cửa sổ Nhật ký, hãy lưu ý những thông tin sau:

    • Mã trạng thái: 414
    • Nguồn lỗi: apigee
    • Mã lỗi: protocol.http.TooBigLine.
    • Độ dài yêu cầu(byte): 7244 (> 7KB)
  10. Nếu Nguồn lỗi có giá trị apigee hoặc MP, Mã lỗi có giá trị protocol.http.TooBigLine và Độ dài yêu cầu lớn hơn 7 KB, thì điều đó có nghĩa là yêu cầu HTTP từ máy khách có URI yêu cầu lớn hơn giới hạn cho phép trong Apigee.

Công cụ theo dõi

NGINX

Cách chẩn đoán lỗi bằng nhật ký truy cập NGINX:

  1. Nếu là người dùng Đám mây riêng, bạn có thể sử dụng nhật ký truy cập NGINX để xác định thông tin chính về lỗi HTTP 414.
  2. Kiểm tra nhật ký truy cập NGINX:

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

    Vị trí: ORG, ENV và PORT# được thay thế bằng các giá trị thực tế.

  3. Tìm kiếm để xem có lỗi 414 nào xảy ra trong một khoảng thời gian cụ thể hay không (nếu vấn đề xảy ra trong quá khứ) hoặc xem có yêu cầu nào vẫn không thành công với 414 hay không.
  4. Nếu bạn thấy bất kỳ lỗi 414 nào có X-Apigee-fault-code khớp với giá trị của protocol.http.TooBigLine, hãy xác định giá trị của X-Apigee-fault-source.

    Mục nhập mẫu ở trên trong nhật ký truy cập NGINX có các giá trị sau cho X-Apigee-fault-code và X-Apigee-fault-source:

    Tiêu đề phản hồi Giá trị
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source policy

    Lưu ý về độ dài yêu cầu: 7244 (7.244 KB > giới hạn cho phép)

Nguyên nhân: Kích thước tải trọng yêu cầu lớn hơn giới hạn cho phép

Chẩn đoán

  1. Xác định Mã lỗi, Nguồn lỗi và Kích thước Request-Length cho lỗi quan sát được bằng cách sử dụng tính năng Giám sát API, Công cụ theo dõi hoặc nhật ký truy cập NGINX như được giải thích trong phần Các bước chẩn đoán thường gặp.
  2. Nếu Nguồn lỗi có giá trị apigee hoặc MP, thì điều này cho biết rằng kích thước yêu cầu do ứng dụng khách gửi đến Apigee lớn hơn giới hạn cho phép trong Apigee Edge.
  3. Bạn có thể xác thực rằng kích thước dòng yêu cầu đã vượt quá giới hạn cho phép là 7 KB bằng một trong các phương thức sau:

    Thông báo lỗi

    Cách xác thực bằng thông báo lỗi:

    Nếu bạn có quyền truy cập vào thông báo lỗi hoàn chỉnh nhận được từ Apigee Edge, hãy tham khảo faultstring. faultstring cho biết kích thước Request-Line đã vượt quá giới hạn cho phép là 7 KB.

    Thông báo lỗi mẫu:

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

    Yêu cầu thực tế

    Cách xác thực bằng yêu cầu thực tế:

    Nếu bạn có quyền truy cập vào yêu cầu thực tế do ứng dụng khách đưa ra, hãy thực hiện các bước sau:

    1. Xác minh kích thước của URI được truyền trong yêu cầu.
    2. Nếu bạn thấy kích thước của URI lớn hơn giới hạn cho phép trong Apigee Edge, thì đó là nguyên nhân gây ra vấn đề.

      Yêu cầu mẫu:

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

      Trong trường hợp trên, giá trị của tham số truy vấn qparam lớn hơn 7 KB, tức là chứa hơn 7 K ký tự ASCII.

      Nếu đang sử dụng một ứng dụng khác, bạn có thể xem xét nhật ký ứng dụng và cố gắng tìm ra kích thước của dòng yêu cầu được gửi đến Apigee Edge.

    Nhật ký Trình xử lý tin nhắn

    Cách xác thực bằng nhật ký Message Processor:

    Nếu là người dùng Đám mây riêng, bạn có thể sử dụng nhật ký Trình xử lý thông báo để xác thực xem kích thước Request-Line có vượt quá giới hạn cho phép trong Apigee Edge hay không.

    1. Kiểm tra nhật ký của Trình xử lý thư:

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

    2. Tìm kiếm để xem có 414 Lỗi nào trong một khoảng thời gian cụ thể hay không (nếu vấn đề xảy ra trong quá khứ) hoặc xem có yêu cầu nào vẫn không thành công với 414 hay không. Bạn có thể sử dụng các chuỗi tìm kiếm sau.
      grep -ri "exceeding"
      
      grep -ri "RequestURITooLong"
      
    3. Bạn sẽ thấy các dòng từ system.log tương tự như sau:
      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)

      Văn bản message = request line size exceeding 7,168 trong thông báo lỗi ở trên cho biết kích thước URI yêu cầu lớn hơn 7 KB. Do đó, Apigee Edge sẽ gửi ngoại lệ com.apigee.errors.http.user.RequestURITooLong và trả về mã trạng thái 414 với mã lỗi protocol.http.TooBigline cho các ứng dụng khách.

Độ phân giải

Kích thước cố định

Lựa chọn 1 [Nên dùng]: Sửa ứng dụng khách để không gửi kích thước URI yêu cầu lớn hơn giới hạn cho phép

  1. Phân tích lý do khiến khách hàng cụ thể gửi kích thước URI yêu cầu vượt quá giới hạn cho phép như được xác định trong phần Giới hạn.
  2. Nếu không mong muốn, hãy sửa đổi ứng dụng khách để ứng dụng gửi kích thước URI yêu cầu nhỏ hơn giới hạn cho phép.

    Trong ví dụ được thảo luận ở trên, bạn có thể khắc phục vấn đề bằng cách truyền tham số truy vấn dài trong phần nội dung/tải trọng của yêu cầu thay vì truyền tham số đó trong phần URL yêu cầu như minh hoạ bên dưới:

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. Nếu bạn muốn gửi một URI vượt quá hạn mức cho phép, hãy chuyển sang các lựa chọn tiếp theo.

CwC

Cách 2 : Sử dụng thuộc tính CwC để tăng hạn mức dòng yêu cầu

Apigee cung cấp một thuộc tính CwC cho phép tăng giới hạn kích thước dòng yêu cầu. Để biết thông tin chi tiết, hãy xem phần Đặt giới hạn dòng yêu cầu trên Trình xử lý thông báo

Giới hạn

Apigee dự kiến ứng dụng khách và máy chủ phụ trợ sẽ không gửi Request/Response-Lines có kích thước lớn hơn giới hạn cho phép như được ghi lại cho Request/Response Line Limit (Giới hạn dòng yêu cầu/phản hồi) trong Apigee Edge Limits (Giới hạn Apigee Edge).

  1. Nếu bạn là người dùng Đám mây công cộng, thì giới hạn tối đa cho kích thước Dòng yêu cầu và Dòng phản hồi là theo tài liệu về kích thước Dòng yêu cầu/phản hồi trong Giới hạn của Apigee Edge.
  2. Nếu là người dùng Đám mây riêng tư, thì bạn có thể đã sửa đổi giới hạn tối đa mặc định cho kích thước Dòng yêu cầu và phản hồi (mặc dù đây không phải là cách nên làm). Bạn có thể xác định giới hạn kích thước tối đa của Request-Line bằng cách làm theo hướng dẫn trong phần Cách kiểm tra giới hạn hiện tại.

Cách kiểm tra hạn mức hiện tại

Phần này giải thích cách xác minh rằng thuộc tính HTTPRequest.line.limit đã được cập nhật bằng một giá trị mới trên Message Processors.

  1. Trên máy Message Processor, hãy tìm thuộc tính HTTPRequest.line.limit trong thư mục /opt/apigee/edge-message-processor/conf và kiểm tra để xem giá trị nào đã được đặt như minh hoạ bên dưới:
    grep -ri "HTTPRequest.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. Sau đây là kết quả mẫu của lệnh trên:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.line.limit=7k
  3. Trong ví dụ về đầu ra ở trên, hãy lưu ý rằng thuộc tính HTTPRequest.line.limit đã được đặt với giá trị 7k trong http.properties.

    Điều này cho thấy giới hạn kích thước Request-Line được định cấu hình trong Apigee cho Private Cloud là 7 KB.

Nếu bạn vẫn cần được Nhóm hỗ trợ Apigee trợ giúp, hãy truy cập vào phần Thông tin chẩn đoán bắt buộc phải thu thập.

Phải thu thập thông tin chẩn đoán

Thu thập thông tin chẩn đoán sau đây, rồi liên hệ với Nhóm hỗ trợ Apigee Edge:

Nếu bạn là người dùng Đám mây công cộng, hãy cung cấp những thông tin sau:

  • Tên tổ chức
  • Tên môi trường
  • Tên API Proxy
  • Lệnh curl hoàn tất được dùng để tái tạo lỗi 414
  • Tệp theo dõi cho các yêu cầu API

Nếu bạn là người dùng Đám mây riêng, hãy cung cấp những thông tin sau:

  • Thông báo lỗi hoàn chỉnh được ghi nhận cho các yêu cầu không thành công
  • Tên tổ chức
  • Tên môi trường
  • Gói API Proxy
  • Tệp theo dõi cho các yêu cầu API không thành công
  • Lệnh curl hoàn tất được dùng để tái tạo lỗi 414
  • Nhật ký truy cập NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Trong đó: ORG, ENV và PORT# được thay thế bằng các giá trị thực tế.

  • Nhật ký hệ thống của Trình xử lý tin nhắn /opt/apigee/var/log/edge-message-processor/logs/system.log