431 请求标头字段过大 - TooBigHeaders

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

问题

客户端应用收到 HTTP 状态代码 431 Request Header Fields Too Large 以及错误代码 protocol.http.TooBigHeaders 作为对 API 的响应 调用。

错误消息

客户端应用将获得以下响应代码:

HTTP/1.1 431 Request Header Fields Too Large

此外,您可能还会看到以下错误消息:

{
   "fault":{
      "faultstring":"request headers size exceeding 25,600",
      "detail":{
         "errorcode":"protocol.http.TooBigHeaders"
      }
   }
}
<ph type="x-smartling-placeholder">

可能的原因

如果客户端应用发送到 的所有请求标头的总大小 作为 HTTP 请求的一部分,Apigee Edge 的长度大于 Apigee Edge 中允许的限制,请参阅 <ph type="x-smartling-placeholder"></ph> RFC 6585,第 5 部分:431 请求标头字段过大

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

原因 说明 适用的问题排查说明
请求标头大小超过允许的限制 客户端应用程序作为 HTTP 请求的一部分发送的所有标头的总大小 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.TooBigHeaders 的单元格并 状态代码 431,如下所示:

    ( 查看大图

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

    ( 查看大图

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

    ( 查看大图

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

    • 状态代码431
    • 故障来源apigee
    • 错误代码protocol.http.TooBigHeaders
    • 请求长度(字节)32150 (> 25 KB)
  10. 如果故障来源的值为 apigeeMP,则 错误代码的值为 protocol.http.TooBigHeaders请求长度超过 25 KB,则表示 由客户端应用作为 HTTP 请求的一部分发送的所有请求标头 相较于 允许的上限。 <ph type="x-smartling-placeholder">

跟踪工具

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

NGINX

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

如需使用 NGINX 访问日志诊断错误,请执行以下操作:

  1. 如果您是 Private Cloud 用户,则可以使用 NGINX 访问日志 确定有关 HTTP 431 错误的关键信息。
  2. 查看 NGINX 访问日志:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中ORGENVPORT# 替换为实际值。

  3. 搜索查看在特定时间段内是否存在任何 431 错误 (如果问题在过去发生过)或者是否还有任何请求仍失败, 431
  4. 如果您发现任何包含 X-Apigee-fault-code 的 431 错误 protocol.http.TooBigHeaders 的值匹配,然后确定 X-Apigee-fault-source.

    以上 NGINX 访问日志中的示例条目包含以下值: X-Apigee-fault-code X-Apigee-fault-code

    响应标头
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source MP

    请注意请求长度40159(40 KB 大于 25 KB, Apigee Edge 中请求标头允许的限制)

    在上面的示例日志条目中,X-Apigee-fault-source 的值为 apigeeMPX-Apigee-fault-code 的值为 protocol.http.TooBigHeaders请求长度为 40 KB, 超过 Apigee 中允许的限制 - 25 KB。这清楚地表明 客户端应用作为 HTTP 的一部分发送的所有请求标头的总大小 请求超出了 Apigee Edge 中允许的 25 KB 的限制。

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

原因:请求标头大小超过允许的上限

诊断

  1. 确定错误代码错误来源请求长度大小 使用 API Monitoring 或 NGINX 访问日志观察到错误,如 常见的诊断步骤
  2. 如果故障来源的值为 apigeeMP错误代码 的值为 protocol.http.TooBigHeaders请求长度超过 25 KB,则此 表示客户端应用发送到 Apigee 的请求大小大于 Apigee Edge 中允许的限制
  3. 您可以使用以下任一方法验证请求标头大小是否已超过允许的 25 KB 限制: 以下方法:

    错误消息

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

    如果您有权查看从 Apigee Edge 收到的完整错误消息,则: 请参阅 faultstringfaultstring 表示 请求标头的总大小已超出允许的 25 KB 的上限。

    示例错误消息:

    "faultstring":"request headers size exceeding 25,600"
    

    实际请求

    如需使用实际请求进行验证,请执行以下操作:

    如果您有权访问客户端应用发出的实际请求, 然后执行以下步骤:

    1. 验证请求中传递的标头的大小。
    2. 如果您发现标题的总大小超过了 Apigee Edge 中允许的限制,则也就是说 问题发生的原因。

      示例请求

      curl -v https://HOSTALIAS/test -H "header0: 000000000000000000……..000000<trimmed>" -H "header1: 111111111111111111……..111111<trimmed>" -H "header2: 222222222222222222……..222222<trimmed>"-H "header3: 333333333333333333……..333333<trimmed>"
      

      在上例中,标头的总大小 header0header1header2、 且 header3 大于 25 KB,即包含 超过 25 K ASCII 字符(字节)。

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

    消息处理器日志

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

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

    如果您是私有云用户,则可以使用消息处理器日志 验证请求标头大小是否超过了 Apigee Edge 中允许的限制

    1. 检查消息处理器日志:

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

    2. 搜索特定期间是否存在任何 431 错误 持续时间(如果问题在过去发生过)或者是否有任何请求, 仍然失败并显示 431。您可以使用以下搜索字符串。
      grep -ri "exceeding"
      
      grep -ri "RequestHeadersTooLarge"
      
    3. 您会找到 system.log 中类似于以下内容的行:
      2021-07-27 08:30:28,419  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() :
      Request:GET, uri:/test/, message Id:null,
      exception:com.apigee.errors.http.user.RequestHeadersTooLarge{
      code = protocol.http.TooBigHeaders, message = request headers size
      exceeding 25,600, associated contexts = []}, context:Context@9c5903
      input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.205.251:8443 Local:192.168.67.23:22188]@25130
      useCount=1 bytesRead=0 bytesWritten=15367 age=667062ms  lastIO=0ms
      isOpen=true)
      

      文本 message = request headers size exceeding 25,600 中的 上述错误消息表明请求标头的总大小超过了 25 KB。因此,Apigee Edge 会引发异常 com.apigee.errors.http.user.RequestHeadersTooLarge 并返回 向客户端应用发送带有错误代码 protocol.http.TooBigHeaders 431 状态代码。

分辨率

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

固定尺寸

方法 1 [推荐]:修复客户端应用不通过 总大小超过允许的上限

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

    在上面讨论的示例中,您可以通过传递长标头来解决此问题 values 参数作为请求正文/载荷的一部分:

    curl -v https://HOSTALIAS/test -d '{ "header0: 000000000000000000……..000000<trimmed>" , "header1: 111111111111111111……..111111<ttrimmed>" , "header2: 222222222222222222……..222222<ttrimmed>", "header3: 333333333333333333……..333333<ttrimmed>" }'
    
  3. 如果需要,并且您希望发送的标头超过允许的上限,请转到 下一个选项。

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.headers.limit 已在消息处理器上使用新值进行更新。

  1. 在消息处理器计算机上,搜索属性 HTTPRequest.headers.limit/opt/apigee/edge-message-processor/conf 目录,然后检查 如下所示:
    grep -ri "HTTPRequest.headers.limit" /opt/apigee/edge-message-processor/conf
    
  2. 上述命令的示例结果如下所示:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.headers.limit=25k
    
  3. 在上面的示例输出中,请注意属性 HTTPRequest.headers.limit 已在 http.properties 中使用值 25k 设置。

    这表示在 Apigee for Private 中配置的请求标头大小 Cloud 存储空间为 25 KB

规范

Apigee Edge 要求客户端应用在 请求。如果请求包含总大小超过指定限制的标头, Apigee 根据以下 RFC 抛出 431 Request Header Fields Too Large 规范:

规范
<ph type="x-smartling-placeholder"></ph> RFC 6585,第 5 部分:431 请求标头字段过大

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

必须收集的诊断信息

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

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

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

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

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