431 请求标头字段过大 - TooBigHeaders

您正在查看 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"
      }
   }
}

可能的原因

如果客户端应用作为 HTTP 请求的一部分发送到 Apigee Edge 的所有请求标头的总大小大于 Apigee Edge 中允许的限制,则会发生此错误,如 RFC 6585 第 5 节:431 请求标头字段过大中所述。

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

原因 说明 适用的问题排查说明
请求标头大小超出允许的限额 客户端应用作为 HTTP 请求的一部分发送到 Apigee Edge 的所有标头的总大小大于 Apigee Edge 中允许的限制 Edge Public 和 Private Cloud 用户

常见诊断步骤

您可以使用以下工具/方法来诊断此错误:

API 监控

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

  1. 以具有 适当角色的用户身份 登录 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 请求的一部分发送的所有请求标头的总大小大于 Apigee 中允许的限制

Trace 工具

NGINX

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

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

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

    其中ORGENVPORT# 会替换为实际值。

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

    上述 NGINX 访问日志中的示例条目具有以下 X-Apigee-fault-codeX-Apigee-fault-source 值:

    响应标头
    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.TooBigHeadersRequest Length 为 40 KB,大于 Apigee 中允许的限制 (25 KB)。这清楚地表明,客户端应用作为 HTTP 请求的一部分发送的所有请求标头的总大小已超过 Apigee Edge 中允许的 25 KB 限制。

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

诊断

  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>"
      

      在上述情况下,标头 header0header1header2header3 的总大小超过 25 KB,也就是说,其中包含的 ASCII 字符(字节)超过 25 K。

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

    消息处理器日志

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

    如果您是私有云用户,则可以使用消息处理器日志来验证请求标头大小是否已超出 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 异常,并向客户端应用返回 431 状态代码和故障代码 protocol.http.TooBigHeaders

分辨率

修正尺寸

选项 1 [推荐]:修复客户端应用,使其不会发送总大小超出允许限制的请求标头

  1. 分析特定客户端发送的请求标头大小过大的原因,这会导致标头总大小超过限制中定义的允许限值。
  2. 如果不希望出现这种情况,请修改客户端应用,使其发送的请求标头大小小于允许的限制。

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

    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 属性来提高请求行限制

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

限制

Apigee 希望客户端应用和后端服务器不会发送大小超出允许限制的请求/响应标头,如 Apigee Edge 限制中针对请求/响应标头大小限制所记录的那样。

  1. 如果您是公共云用户,那么请求和响应标头大小的上限与 Apigee Edge 限制请求/响应标头大小的文档中所述的上限相同。
  2. 如果您是私有云用户 ,则可能修改了请求和响应标头大小的默认上限(即使不建议这样做)。您可以按照如何查看当前限制中的说明确定请求标头大小上限。

如何查看当前限额?

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

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

规范
RFC 6585 第 5 节:431 请求标头字段过大

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

必须收集的诊断信息

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

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

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

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

  • 失败请求的完整错误消息
  • 组织名称
  • 环境名称
  • 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