502 网关无效 - TooBigHeaders

您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
info

问题

客户端应用收到 HTTP 状态代码 502 Bad Gateway,错误代码为 protocol.http.TooBigHeaders ,以此响应 API 调用。

出错提示

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"response headers size exceeding 25,600",
      "detail":{
         "errorcode":"protocol.http.TooBigHeaders"
      }
   }
}

可能的原因

如果目标/后端 服务器作为 HTTP 响应的一部分发送到 Apigee Edge 的标头的总大小大于 Apigee Edge 中允许的 允许限制,则会发生此错误。

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

原因 说明 适用的问题排查说明
响应中的标头大小大于允许的限制 特定标头的标头大小或目标/后端服务器作为 HTTP 响应的一部分发送到 Apigee Edge 的所有标头的大小之和大于 Apigee Edge 中允许的限制 Edge Public 和 Private Cloud 用户

常见诊断步骤

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

API 监控

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

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

  3. 前往分析 > API 监控 > 调查 页面。
  4. 选择您观察到错误的具体时间范围。
  5. 您可以选择 Proxy 过滤条件来缩小故障代码的范围。
  6. 绘制 Fault CodeTime 的关系图。
  7. 选择一个单元格,其中包含故障代码 protocol.http.TooBigHeaders,如下所示:

    ( 查看大图)

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

    ( 查看大图)

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

    ( 查看大图)

  10. 日志 窗口中,记下以下详细信息:
    • 状态代码502
    • 故障来源target
    • 故障代码protocol.http.TooBigHeaders
  11. 如果故障来源 的值为 target,并且故障代码 的值为 protocol.http.TooBigHeaders,则表示来自目标/ 后端服务器的 HTTP 响应的标头大小大于 Apigee Edge 中允许的限制

Trace 工具

  1. 启用跟踪会话 然后执行以下任一操作:
    1. 等待 502 Bad Gateway 错误发生,或
    2. 如果您可以重现该问题,请进行 API 调用并重现 502 Bad Gateway 错误。
  2. 选择一个失败的请求,然后检查跟踪记录。
  3. 浏览跟踪记录的不同阶段,找到发生失败的位置 。
  4. 通常,您会在名为 Error 的流中看到此错误,就在 Request sent to target server 阶段之后,如下所示:

    ( 查看大图)

    记下跟踪记录中的错误值:

    • errorresponse headers size exceeding 25,600
    • error.class: com.apigee.errors.http.server.BadGateway

    这表示 Apigee Edge(消息处理器组件)在收到后端服务器的响应后立即抛出错误,原因是标头大小超出了允许的限制。

  5. 您会在 Apigee Edge 发送的 发送给客户端的响应 错误响应中看到失败,如下所示:

    ( 查看大图)

  6. 记下跟踪记录中的错误值。上面的示例跟踪记录显示:
    • 错误502 Bad Gateway
    • 错误内容 {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
  7. 在跟踪记录中前往 AX (记录的数据分析数据)阶段 然后点击该阶段以查看相关详细信息。

    ( 查看大图)

    记下以下值:

    错误标头
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source target
    错误内容:正文 {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}

NGINX

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

  1. 如果您是 Private Cloud 用户,则可以使用 NGINX 访问日志来 确定有关 HTTP 502 Bad Gateway 的关键信息。
  2. 检查 NGINX 访问日志:

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

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

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

    NGINX 访问日志中的 502 错误示例

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

    错误标头
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source target

原因:响应中的标头大小大于允许的限制

诊断

  1. 使用 API 监控、Trace 工具或 NGINX 访问日志确定观察到的错误的故障代码故障来源响应载荷大小 ,如常见诊断步骤中所述。
  2. 如果故障来源 的值为 target,则表示 目标/后端服务器发送给 Apigee 的响应的标头大小大于 Apigee Edge 中允许的限制
  3. 您可以使用以下方法之一验证目标/后端服务器的响应是否包含大小大于允许限制的标头:

    出错提示

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

    如果您有权访问从 Apigee Edge 收到的完整错误消息,请 参阅 faultstring。The faultstring indicates that the response header size has exceeded the allowed limit.

    错误消息示例

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

    在上面的错误消息中,请注意 faultstring 中的响应包含的标头的总大小超出了 允许的限制

    实际请求

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

    如果您有权访问向目标/后端服务器发出的实际请求, 请执行以下步骤:

    1. 如果您是 Public Cloud/Private Cloud 用户,请直接从后端服务器本身或您有权向后端服务器发出请求的任何其他机器向后端服务器发出请求。
    2. 如果您是 Private Cloud 用户,还可以从其中一个消息处理器向 后端服务器发出请求。
    3. 检查从后端服务器收到的响应,并专门 计算和验证响应中传递的标头的总大小。
    4. 如果您发现响应载荷中的标头大小 超出了 Apigee Edge 中允许的限制 ,则这是导致问题的原因。

      来自目标服务器的响应示例

      curl -v https://TARGET_SERVER_HOST/test
      
      * About to connect() to 10.1.0.10 port 9000 (#0)
      *   Trying 10.1.0.10...
      * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0)
      > GET /test HTTP/1.1
      > User-Agent: curl/7.29.0
      > Host: 10.1.0.10:9000
      > Accept: */*
      <
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Length: 0
      < Content-Type: text/plain; charset=utf-8
      < Last-Modified: Tue, 20 Jul 2021 09:23:56 GMT
      < Testheader1: XVlBzgba—-<snipped>---THctcuAx
      < Testheader2: hxKQFDaFpLSj—-<snipped>---FbcXoEFfRsWxP
      < Date: Fri, 23 Jul 2021 09:51:22 GMT
      <
      * Connection #0 to host 10.1.0.10 left intact
      

      在上面的示例中,Testheader1Testheader2 的大小较大,这是导致此错误的原因,因为它超出了 Apigee Edge 中允许的限制。

    消息处理器日志

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

    如果您是 Private Cloud 用户,则可以使用消息处理器日志来 验证响应标头大小是否超出了 Apigee Edge 中允许的限制

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

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

    2. 搜索以查看在特定 持续时间(如果问题发生在过去)是否存在任何 502 错误,或者是否存在任何请求 仍然失败并显示 502。您可以使用以下搜索字符串:
      grep -ri "response headers size exceeding"
      
    3. 您会找到类似于以下内容的 system.log 中的行。 在您的情况下,响应标头大小可能会有所不同:
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1
      messageid:r23ijb1b-1  NIOThread@1 ERROR HTTP.CLIENT -
      HTTPClient$Context$3.onException() :  ClientChannel[Connected:
      Remote:3.7.1.1:9000 Local:192.168.2.1:56098]@8414 useCount=1
      bytesRead=0 bytesWritten=207 age=640ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response headers size exceeding 25,600
      
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest
      rev:1 messageid:r23ijb1b-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@31f3ef88, response headers size exceeding 25,600)
    4. 消息处理器从后端/目标 服务器收到响应后,如果发现标头的总大小大于 25 KB, 则会停止并抛出错误:

      response headers size exceeding 25,600

      这意味着 标头总大小 大于 25 KB,并且当大小开始超出限制 25 KB 时,Apigee 抛出错误,故障代码 为 protocol.http.TooBigHeaders

分辨率

修复大小

选项 1 [推荐]:修复目标服务器应用,使其不发送超出 Apigee 限制的标头大小

  1. 分析特定目标服务器发送的响应标头大小超出 限制中所定义的允许限制的原因。
  2. 如果不需要,请修改后端服务器应用,使其发送 的响应标头大小小于 Apigee Edge 中允许的限制。
  3. 检查标头信息是否可以作为响应正文的一部分发送。
  4. 如果可行,请在响应正文中发送您计划作为标头一部分发送的任何大型信息。这将确保您不会超出响应 标头限制。

CwC

选项 2:使用 CwC 属性来增加响应标头大小限制

Apigee 提供了一个 CwC 属性,该属性允许增加响应标头大小限制。 如需了解详情,请参阅 为消息处理器配置限制

限制

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

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

如何查看当前限制?

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

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

    这表示在 Apigee for Private Cloud 中配置的响应载荷大小限制为 25 KB。

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

必须收集的诊断信息

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

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

  • 组织名称
  • 环境名称
  • API 代理名称
  • 用于重现 502 错误的完整 curl 命令
  • API 请求的跟踪文件
  • 来自目标/后端服务器的响应的完整输出以及标头的大小

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

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