414 请求 URI 过长 - TooBigLine

<ph type="x-smartling-placeholder"></ph> 您正在查看 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)。

可能的原因

如果客户端应用发送到 Apigee Edge 的请求行的大小不同,则会出现此错误 请求数量大于 Apigee Edge 中允许的限制

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

了解请求行

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

  1. <ph type="x-smartling-placeholder"></ph> 请求热线
  2. ( HTTP 标头集 )
  3. [正文 ]

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

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

当客户端应用向服务器发出 HTTP 请求时,转到 服务器包含上述Request-Line。接着是 标头和请求正文/载荷。

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

了解请求行大小

  1. 在上面讨论的示例中,请求中的 start 行(第一行)也 称为 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 的一部分发送的请求 URI 的大小 发送到 Apigee Edge 的请求超过了 Apigee Edge 中允许的限制 Edge 公有云和私有云用户

常见诊断步骤

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

API 监控

<ph type="x-smartling-placeholder">

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

  1. <ph type="x-smartling-placeholder"></ph> 以拥有用户身份登录 Apigee Edge 界面 适当的角色。
  2. 切换到您要在其中调查问题的单位。

  3. 导航至分析 >API 监控 >调查页面。
  4. 选择您观察到错误的具体时间范围。
  5. 根据时间绘制错误代码
  6. 选择错误代码为 protocol.http.TooBigLine 的单元格并 状态代码 414,如下所示:

    ( 查看大图

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

    ( 查看大图

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

    ( 查看大图

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

    • 状态代码414
    • 故障来源apigee
    • 错误代码protocol.http.TooBigLine
    • 请求长度(字节)7244 (> 7KB)
  10. 如果故障来源的值为 apigeeMP,则 错误代码的值为 protocol.http.TooBigLineRequest-Length 超过 7 KB,则表示 HTTP 请求 请求 URI 大于 允许的上限

跟踪工具

<ph type="x-smartling-placeholder">

NGINX

<ph type="x-smartling-placeholder">

如需使用 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 的 414 错误 protocol.http.TooBigLine 的值匹配,然后确定 X-Apigee-fault-source.

    以上 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,即包含超过 7000 个 ASCII 字符。

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

    消息处理器日志

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

    <ph type="x-smartling-placeholder">

    如果您是私有云用户,则可以使用消息处理器日志 验证请求行大小是否超过了 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 状态代码。

分辨率

<ph type="x-smartling-placeholder">

固定尺寸

方法 1 [推荐]:修复客户端应用,使其发送请求 URI 的大小不大于允许的限制

<ph type="x-smartling-placeholder">
  1. 分析特定客户端发送请求 URI 大小超过 限制中所定义的允许的限制。
  2. 如果您不希望这样,请修改您的客户端应用,使其可以发送请求 URI 大小小于允许的上限。

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

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

CwC

方法 2:使用 CwC 属性提高请求行限制

<ph type="x-smartling-placeholder">

Apigee 提供了一种 CwC 属性,以允许它提高请求行大小限制。 有关详情,请参阅 <ph type="x-smartling-placeholder"></ph> 为消息处理器设置请求行数限制

<ph type="x-smartling-placeholder">

限制

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

  1. 如果您是公有云用户,则请求和 响应行大小记录中请求/响应行大小Apigee Edge 限额
  2. 如果您是 Private Cloud 用户 ,则可能已经修改了默认上限 限制请求和响应行大小(尽管我们不推荐这样做)。 要确定请求行大小上限,请参阅 如何查看当前限制

如何查看当前限制?

<ph type="x-smartling-placeholder">

本部分介绍了如何验证属性 HTTPRequest.line.limit 已在消息处理器上使用新值进行更新。

  1. 在消息处理器计算机上,搜索属性 HTTPRequest.line.limit/opt/apigee/edge-message-processor/conf 目录,然后检查 如下所示:
    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