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 khách sẽ nhận được mã trạng thái HTTP 414 Request-URI Too Long kèm theo 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 sẽ 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 cho phép cho 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 quy mô của dòng yêu cầu do ứng dụng gửi đến Apigee Edge một phần của yêu cầu HTTP lớn hơn giới hạn cho phép trong Apigee Edge.

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

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. ( Bộ tiêu đề HTTP )
  3. [ Nội dung ]

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

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

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

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

  1. Trong mẫu thảo luận ở trên, dòng bắt đầu (dòng đầu tiên) trong yêu cầu cũng đượ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ì miền này nằm trong giới hạn được 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 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 hiển thị ở trên, chứa "request line size exceeding 7,168". Điều này cho thấy rằng Dòng yêu cầu trong yêu cầu HTTP do máy khách đưa ra đã vượt quá 7.168 byte.

Dưới đâ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 URI yêu cầu do ứng dụng gửi đi như một phần của HTTP yêu cầu đối với Apigee Edge lớn hơn giới hạn được phép trong Apigee Edge. Người dùng Edge công khai và riêng tư

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à 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 đề này.

  3. Chuyển đến thẻ Analyze (Phân tích) > Giám sát API > Điều tra.
  4. Chọn khung thời gian cụ thể mà bạn phát hiệ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ư được hiển thị dưới đây:

    ( 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 chứa yêu cầu không thành công:

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

  9. Từ 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 có giá trị protocol.http.TooBigLineRequest-Length (Độ dài yêu cầu) lớn hơn 7 KB, cho biết yêu cầu HTTP từ máy khách 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ể 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

    Trong đó: ORG, ENVPORT# được thay thế bằng các 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 sự cố đã xảy ra trong quá khứ) hoặc nếu có bất kỳ yêu cầu nào vẫn không thành công với 414.
  4. Nếu bạn tìm thấy bất kỳ lỗi 414 nào với mã X-Apigee-fault-code khớp với giá trị của protocol.http.TooBigLine, sau đó xác định giá trị của X-Apigee-fault-source.

    Mục nhập mẫu ở trên từ nhật ký truy cập NGINX có các giá trị sau 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 ý: Thời lượng yêu cầu: 7244 (7,244KB > giới hạn cho phép)

Nguyên nhân: Yêu cầu kích thước tải trọng 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 độ dài yêu cầu cho đoạn mã phát hiện thấy lỗi khi sử dụng nhật ký Giám sát API, Công cụ theo dõi hoặc NGINX Access như giải thích trong 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ì phương thức này cho biết kích thước yêu cầu mà ứng dụng gửi tới Apigee lớn hơn Giới hạn được 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 cách sử dụ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 xem thông báo lỗi hoàn chỉnh nhận được từ Apigee Edge, thì tham khảo faultstring. faultstring cho biết 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.

    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 đưa ra, thì 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 rằng kích thước của URI lớn hơn giới hạn được phép trong Apigee Edge, tức 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à tệp này chứa hơn 7 K ký tự ASCII.

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

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

    Để xác thực bằng nhật ký Trình xử lý thư:

    Nếu là người dùng Đám mây riêng tư thì bạn có thể sử dụng nhật ký của 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 phép trong Apigee Edge.

    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ó bất kỳ Lỗi 414 nào trong một khoảng thời gian cụ thể hay không khoảng thời gian (nếu vấn đề đã xảy ra trong quá khứ) hoặc liệu có bất kỳ yêu cầu nào vẫn không thành công với 414. 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 rằng kích thước URI yêu cầu lớn hơn 7 KB. Do đó, Apigee Edge sẽ gửi trường hợp ngoại lệ com.apigee.errors.http.user.RequestURITooLong và trả lại hàng Mã trạng thái 414 có mã lỗi protocol.http.TooBigline cho ứng dụng khách.

Độ phân giải

Khắc phục 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 lớn hơn giới hạn cho phép như đã xác định trong mục Giới hạn.
  2. Nếu bạn không mong muốn, hãy sửa đổi ứng dụng của bạn để ứng dụng đó gửi URI yêu cầu kích thước 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 chuyển truy vấn dài tham số như một phần của nội dung/tải trọng yêu cầu thay vì truyền tham số đó như một phần của URL yêu cầu như được hiển thị dưới đây:

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

CwC

Lựa chọn 2 : Sử dụng thuộc tính CwC để tăng giới hạn dòng yêu cầu

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

Giới hạn

Apigee dự kiến rằng ứng dụng khách và máy chủ phụ trợ sẽ không gửi Yêu cầu/Dòng phản hồi có kích thước lớn hơn giới hạn cho phép như được ghi trong Giới hạn dòng yêu cầu/phản hồi trong Apigee EdgeGiới hạn.

  1. Nếu bạn là người dùng Cloud công khai, thì giới hạn tối đa đối với Yêu cầu và Kích thước Dòng phản hồi như được ghi trong tài liệu về kích thước Yêu cầu/Dòng phản hồi trong Các 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 mức tối đa mặc định cho kích thước Yêu cầu và Dòng phản hồi (mặc dù đây không phải là phương pháp nên dùng). 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 Cách kiểm tra hạn mức 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 thuộc tính HTTPRequest.line.limit có đã được cập nhật một giá trị mới trên Trình xử lý thư.

  1. Trên máy Xử lý thư, hãy tìm kiếm thuộc tính HTTPRequest.line.limit trong Thư mục /opt/apigee/edge-message-processor/conf và kiểm tra để hãy 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. 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ả của ví dụ ở trên, hãy lưu ý rằng thuộc tính HTTPRequest.line.limit đã được thiết lập với giá trị 7k trong http.properties.

    Giá trị này cho biết giới hạn về quy mô Dòng yêu cầu được thiết lập trong Apigee cho Riêng tư Đám mây có kích thước 7 KB.

Nếu bạn vẫn cần hỗ trợ từ Nhóm hỗ trợ Apigee, hãy truy cập vào 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 những thông tin chẩn đoán sau đây rồi liên hệ với Bộ phận hỗ trợ Apigee Edge:

Nếu bạn là người dùng Cloud Public, 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 hiện 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 các thông tin sau:

  • Đã nhậ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ực hiện được
  • 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 hiện lỗi 414
  • Nhật ký truy cập NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

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

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