414 请求 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)。

可能的原因

如果客户端应用作为 HTTP 请求的一部分发送到 Apigee Edge 的 请求行 大小大于 Apigee Edge 中允许的 限制,则会发生此错误。

在了解此错误的可能原因之前,我们先了解一下请求行 的含义以及如何检查其大小。

了解 Request-Line

典型的 HTTP 请求由三部分组成:

  1. Request-Line
  2. (一组 HTTP 标头)
  3. [ 正文 ]

请求行由三部分组成,如下所示。

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

当客户端应用向服务器发出 HTTP 请求时,发送到 服务器的第一行包含上述 Request-Line。之后是 标头和请求正文/载荷。

以下示例屏幕截图显示了一个典型的 curl 请求、Request 部分(以及 Request-Line)和 Response 部分。

了解 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"。 这表示客户端发出的 HTTP 请求中的 Request-Line 超出了 7,168 字节。

以下是此错误的可能原因:

原因 说明 适用的问题排查说明
请求载荷大小大于允许的限制 客户端应用作为 HTTP 请求的一部分发送到 Apigee Edge 的 Request-URI 大小大于 Apigee Edge 中允许的 限制。 Edge Public 和 Private Cloud 用户

常见诊断步骤

使用以下工具/技术之一来诊断此错误:

API 监控

如需使用 API 监控诊断错误,请执行以下操作:

  1. 以具有 适当角色的用户身份登录 Apigee Edge 界面。
  2. 切换到您要调查问题的组织。

  3. 依次前往 Analyze > API Monitoring > Investigate 页面。
  4. 选择您观察到错误的具体时间范围。
  5. 绘制 Fault Code 与 Time 的关系图。
  6. 选择一个单元格,其中包含故障代码 protocol.http.TooBigLine 和 状态代码 414,如下所示:

    ( 查看放大图片)

  7. 您将看到有关故障代码 protocol.http.TooBigline 的信息,如下所示:

    ( 查看放大图片)

  8. 点击查看日志 ,然后展开失败请求的行:

    ( 查看放大图片)

  9. 在日志 窗口中,记下以下详细信息:

    • 状态代码: 414
    • 故障来源: apigee
    • 故障代码: protocol.http.TooBigLine。
    • 请求长度(字节): 7244 (> 7KB)
  10. 如果故障来源的值为apigee或MP, 故障代码的值为protocol.http.TooBigLine,并且 请求长度大于 7 KB,则表示来自客户端的 HTTP 请求的请求 URI 大于 Apigee 中允许的 限制。

Trace 工具

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.244KB > 允许的限制)

原因:请求载荷大小大于允许的限制

诊断

  1. 使用 API 监控、Trace 工具或 NGINX 访问日志确定观察到的错误的故障代码 、故障来源 和请求长度大小 ,如常见诊断步骤中所述。
  2. 如果 故障来源 的值为 apigee 或 MP,则表示客户端应用发送到 Apigee 的请求大小大于 Apigee Edge 中允许的限制。
  3. 您可以使用以下方法之一验证请求行大小是否超出了 7 KB 的允许限制:

    出错提示

    如需使用错误消息进行验证,请执行以下操作:

    如果您可以访问从 Apigee Edge 收到的完整错误消息,请 参阅 faultstring。faultstring 表示 Request-Line 大小超出了 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,也就是说,它包含超过 7 K 个 ASCII 字符。

      如果您使用的是其他客户端,可以查看客户端日志,并尝试找出发送到 Apigee Edge 的请求行的大小。

    消息处理器日志

    如需使用消息处理器日志进行验证,请执行以下操作:

    如果您是 Private Cloud 用户,则可以使用消息处理器日志来 验证 Request-Line 大小是否超出了 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 大小小于允许的限制。

    在上述示例中,您可以通过将长查询 参数作为请求正文/载荷的一部分传递,而不是将其作为请求网址的一部分传递来解决此问题,如下所示:

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. 如果可取,并且您想要发送的 URI 大于允许的限制,请转到下一个选项。

CwC

选项 2:使用板球世界杯属性来增加请求行限制

Apigee 提供了一个 板球世界杯 属性,允许其增加请求行大小限制。 如需了解详情,请参阅 在消息处理器上设置请求行限制

限制

Apigee 希望客户端应用和后端服务器不要发送大小大于 Apigee Edge 限制中请求/响应行限制 文档中允许的限制的请求/响应行。

  1. 如果您是 Public Cloud 用户 ,则请求和 响应行大小的上限与 Apigee Edge 限制中请求/响应行大小 文档中记录的上限相同。
  2. 如果您是 Private Cloud 用户 ,则可能已修改请求和响应行大小的默认上限(即使这不是推荐的做法)。您可以按照 如何查看当前限制中的说明确定请求行大小上限。

如何查看当前限制?

本部分介绍如何验证 HTTPRequest.line.limit 属性是否已在消息处理器上更新为新值。

  1. 在消息处理器机器上,在 /opt/apigee/edge-message-processor/conf 目录中搜索属性 HTTPRequest.line.limit,并查看已设置的值,如下所示:
    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 已在 http.properties 中设置为值 7k。

    这表示在 Apigee for Private Cloud 中配置的 Request-Line 大小限制为 7 KB。

如果您仍然需要 Apigee 支持团队的任何帮助,请参阅 必须收集诊断信息。

必须收集的诊断信息

收集以下诊断信息,然后与 Apigee Edge 支持团队联系:

如果您是 Public Cloud 用户,请提供以下信息:

  • 组织名称
  • 环境名称
  • API 代理名称
  • 用于重现 414 错误的完整 curl 命令
  • API 请求的跟踪文件

如果您是 Private Cloud 用户,请提供以下信息:

  • 针对失败请求观察到的完整错误消息
  • 组织名称
  • 环境名称
  • API 代理软件包
  • 失败的 API 请求的跟踪文件
  • 用于重现 414 错误的完整 curl 命令
  • 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