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

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về Apigee X.
thông tin

Triệu chứng

Ứng dụng sẽ 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 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 đây:

HTTP/1.1 414 Request-URI Too Long

Ngoài ra, bạn có thể nhận 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 đối với dòng yêu cầu trong Apigee Edge, tức 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 mà ứng dụng khách gửi đến Apigee Edge trong yêu cầu HTTP lớn hơn giới hạn đượ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 đó.

Tìm hiểu dòng yêu cầu

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

  1. Dòng yêu cầu
  2. ( Nhóm tiêu đề HTTP )
  3. [ Nội dung ]

Dòng yêu cầu bao gồm ba phần như được hiển thị dưới đây.

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

Khi ứng dụng gửi yêu cầu HTTP tới máy chủ, dòng đầu tiên chuyển tới máy chủ sẽ chứa Dòng yêu cầu được mô tả ở trên. Tiếp theo là các tiêu đề và nội dung/trọng tải 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 thông thường, phần Request (Yêu cầu) (cùng với Dòng yêu cầu) và phần Response (Phản hồi).

Tìm hiểu kích thước dòng yêu cầu

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

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

  2. Tương tự như vậy, nếu bạn xem faultstring trong Thông báo lỗi hiển thị ở trên, nó có chứa "request line size exceeding 7,168". Điều này cho biết rằng Dòng yêu cầu trong yêu cầu HTTP do ứng dụng thực hiện đã vượt quá 7.168 byte.

Dưới đây là một số nguyên nhân có thể gây ra lỗi này:

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

Các bước chẩn đoán phổ biến

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à một người dùng có vai trò thích 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 quan sát thấy lỗi.
  5. Vẽ Mã lỗi dựa trên 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ư 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 cho yêu cầu không thành công:

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

  9. Trong cửa sổ Logs (Nhật ký), hãy lưu ý những thông tin chi tiết 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, thì Mã lỗi sẽ có giá trị protocol.http.TooBigLineRequest-Length (Độ dài yêu cầu) lớn hơn 7 KB, tức là yêu cầu HTTP từ ứng dụng có URI yêu cầu lớn hơn giới hạn được 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 tư, bạn có thể 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

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

  3. Tìm kiếm xem có lỗi 414 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 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 tìm thấy bất kỳ lỗi 414 nào trong đó X-Apigee-fault-code khớp với giá trị của X-Apigee-fault-code , thì hãy xác định giá trị của X-Apigee-fault-code

    Mục mẫu ở trên từ nhật ký truy cập NGINX có các giá trị sau đây cho X-Apigee-fault-code X-Apigee-fault-code

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

    Lưu ý rằng độ 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 của 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ỗiKích thước chiều dài yêu cầu cho lỗi quan sát được bằ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ư giải thích trong phần Các bước chẩn đoán phổ biến.
  2. Nếu Nguồn lỗi có giá trị apigee hoặc MP, thì tức là kích thước yêu cầu mà ứng dụng khách gửi đến Apigee lớn hơn giới hạn được 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 đầy đủ mà Apigee nhận được từ Apigee, hãy tham khảo faultstring. faultstring cho biết kích thước Dòng yêu cầu vượt quá giới hạn cho phép là 7 KB.

    Mẫu thông báo lỗi:

    "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 đư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 nhận thấy kích thước của URI vượt quá giới hạn cho phép trong Apigee Edge, thì đó chính là nguyên nhân của 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à giá trị này chứa hơn 7 K ký tự ASCII.

      Nếu đang dùng một ứng dụng khác, bạn có thể kiểm tra 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 đang được gửi đến Apigee Edge.

    Nhật ký Trình xử lý thư

    Cách xác thực bằng nhật ký Trình xử lý thông báo:

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

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

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

    2. Tìm kiếm xem có Lỗi 414 nào trong một khoảng thời gian cụ thể (nếu vấn đề đã xảy ra trong quá khứ) hay không hoặc 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 trong system.log có dạng 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 có mã lỗi protocol.http.TooBigline cho các ứng dụng khách.

Độ phân giải

Cố định kích thước

Lựa chọn 1 [Nên dùng]: Khắc phục lỗi ứng dụng 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 ứng dụ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ư xác định trong phần Giới hạn.
  2. Nếu điều này là không mong muốn, hãy sửa đổi ứng dụng khách của bạn để ứ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ụ thảo luận ở trên, bạn có thể khắc phục vấn đề này bằng cách truyền tham số truy vấn dài như một phần của nội dung/tải trọng của yêu cầu thay vì truyền tham số đó dưới dạng một phần của URL yêu cầu như minh hoạ dưới đây:

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. Nếu điều này là mong muốn và bạn muốn gửi một URI nhiều hơn giới hạn cho phép, hãy chuyển đến các tuỳ chọn tiếp theo.

CwC

Lựa chọn 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 bài viết Thiết lập giới hạn dòng yêu cầu trên Bộ xử lý thư

Các giới hạn

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

  1. Nếu bạn là người dùng Cloud công khai, 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 sẽ được ghi trong tài liệu về Kích thước dòng yêu cầu/phản hồi trong phần Giới hạn của API Pixel.
  2. Nếu là người dùng Đám mây riêng tư , thì có thể bạn đã sửa đổi giới hạn tối đa mặc định về kích thước Dòng yêu cầu và dòng phản hồi (mặc dù bạn không nên áp dụng phương pháp này). Bạn có thể xác định giới hạn kích thước tối đa của Dòng yêu cầu bằng cách làm theo các hướng dẫn trong bài viết 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 với một giá trị mới trên Bộ xử lý thông báo.

  1. Trên máy xử lý thư, hãy tìm thuộc tính HTTPRequest.line.limit trong thư mục /opt/apigee/edge-message-processor/conf rồi kiểm tra xem bạn đã thiết lập giá trị nào như đoạn mã bên dưới:
    grep -ri "HTTPRequest.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. Kết quả mẫu từ lệnh trên như sau:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.line.limit=7k
    
  3. Trong kết quả ví dụ ở trên, hãy lưu ý rằng thuộc tính HTTPRequest.line.limit đã được thiết lập bằng giá trị 7k trong http.properties.

    Điều này cho biết giới hạn về kích thước Dòng yêu cầu được định cấu hình trong Apigee dành cho đám mây riêng tư là 7 KB.

Nếu bạn vẫn cần Nhóm hỗ trợ Apigee hỗ trợ, hãy truy cập trang Phải thu thập thông tin chẩn đoán.

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

Thu thập thông tin chẩn đoán sau đây, sau đó liên hệ với Bộ phận hỗ trợ API Apigee:

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

  • Tên tổ chức
  • Tên môi trường
  • Tên proxy API
  • Hoàn tất lệnh curl 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 tư, hãy cung cấp những thông tin sau:

  • Đã phát hiện thấy thông báo lỗi hoàn chỉnh đối với 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 Proxy API
  • Tệp theo dõi cho các yêu cầu API không thành công
  • Hoàn tất lệnh curl 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, ENVPORT# được thay thế bằng giá trị thực tế.

  • Nhật ký hệ thống của Bộ xử lý thư /opt/apigee/var/log/edge-message-processor/logs/system.log