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

可能的原因

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

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

了解请求行

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

  1. 请求行
  2. (一组 HTTP 标头)
  3. [正文 ]

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

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

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

以下示例屏幕截图显示了典型的 curl 请求、请求部分(以及请求行)和响应部分。

了解请求行大小

  1. 在上述示例中,请求中的起始行(第一行,也称为请求行)如下所示:
    GET /test/ HTTP/1.1
    

    请求行的大小为 ~19 bytes,因为它包含 19 ASCII characters。由于这未超出 Apigee Edge 中的允许限制,因此请求会得到处理,而不会出现任何错误,并且您会收到成功响应。

  2. 同样,如果您查看上面显示的 错误消息中的 faultstring,会发现它包含 "request line size exceeding 7,168"。这表示客户端发出的 HTTP 请求中的请求行超出了 7168 字节。

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

原因 说明 适用的问题排查说明
请求的载荷大小超出允许的上限 客户端应用在向 Apigee Edge 发出的 HTTP 请求中发送的请求 URI 的大小超过 Apigee Edge 中允许的限制 Edge 公有云和私有云用户

常见诊断步骤

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

API 监控

要使用 API Monitoring 诊断错误,请执行以下操作:

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

  3. 前往 Analyze > API Monitoring > Investigate 页面。
  4. 选择您发现错误的具体时间范围。
  5. 根据时间绘制故障代码
  6. 选择一个包含错误代码 protocol.http.TooBigLine 和状态代码 414 的单元格,如下所示:

    查看大图

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

    查看大图

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

    查看大图

  9. Logs 窗口中,请注意以下详细信息:

    • 状态代码414
    • 错误来源apigee
    • 错误代码protocol.http.TooBigLine
    • 请求长度(字节)7244 (> 7KB)
  10. 如果故障来源的值为 apigeeMP故障代码的值为 protocol.http.TooBigLine请求长度大于 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

    其中:将 ORGENVPORT# 替换为实际值。

  3. 搜索以查看在特定持续时间内是否存在任何 414 错误(如果问题是在过去发生的),或者是否有任何请求仍然失败并显示 414
  4. 如果您确实发现 X-Apigee-fault-code X-Apigee-fault-code 的值匹配的任何 414 错误,则确定 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. 按照常见诊断步骤中所述,确定使用 API 监控、跟踪工具或 NGINX 访问日志观察到的错误的故障代码故障来源请求长度大小
  2. 如果故障来源的值为 apigeeMP,则表示客户端应用向 Apigee 发送的请求大小大于 Apigee Edge 中允许的限制
  3. 您可以使用以下任一方法验证请求行大小是否已超过允许的 7 KB 限制:

    错误消息

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

    如果您有权访问从 Apigee Edge 收到的完整错误消息,请参阅 faultstringfaultstring 表示请求行大小超过允许的 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 异常并将带有错误代码 protocol.http.TooBigline 414 状态代码返回给客户端应用。

分辨率

修正尺寸

方法 1 [推荐]:解决客户端应用发送的请求 URI 大小超出允许限制的问题

  1. 分析特定客户端发送请求 URI 大小超过限制中定义的允许限制的原因。
  2. 如果您不希望这样,请修改您的客户端应用,使其发送的请求 URI 大小小于允许的上限。

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

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. 如果需要,并且想要发送的 URI 数量超出允许的上限,请转到下一个选项。

CwC

方法 2:使用 CwC 媒体资源提高请求行数量上限

Apigee 提供了 CwC 属性,可用于提高请求行大小限制。如需了解详情,请参阅 在消息处理器上设置请求行数上限

限制

Apigee 要求客户端应用和后端服务器不会发送大小超过 Apigee Edge 限制请求/响应行限制中规定的允许限制的请求/响应行。

  1. 如果您是公有云用户,则请求和响应行大小的上限如 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 中配置的请求行大小限制为 7 KB

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

必须收集的诊断信息

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

如果您是公有云用户,请提供以下信息:

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

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

  • 观察到失败请求的完整错误消息
  • 组织名称
  • 环境名称
  • API 代理软件包
  • 失败 API 请求的跟踪文件
  • 完成用于重现 414 错误的 curl 命令
  • NGINX 访问日志 /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中:将 ORGENVPORT# 替换为实际值。

  • 消息处理器系统日志 /opt/apigee/var/log/edge-message-processor/logs/system.log