502 网关无效 - TooBigHeaders

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

问题

客户端应用收到 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"
      }
   }
}

可能的原因

如果目标/后端发送的标头的总大小为 0,则会出现此错误 服务器到 Apigee Edge 的响应数量超过允许的 Apigee Edge 中允许的限制

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

原因 说明 适用的问题排查说明
响应中的标头大小超过允许的上限 特定标头的标头大小,或所有标头大小的总和 作为 HTTP 响应的一部分由目标/后端服务器发送的标头 超出了 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. 根据时间绘制错误代码
  7. 选择错误代码为protocol.http.TooBigHeaders的单元格 如下所示:

    ( 查看大图

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

    ( 查看大图

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

    ( 查看大图

  10. 日志窗口中,请注意以下详细信息: <ph type="x-smartling-placeholder">
      </ph>
    • 状态代码502
    • 故障来源target
    • 错误代码protocol.http.TooBigHeaders
  11. 如果 Fault Source 的值为 target,并且 Fault 代码的值为 protocol.http.TooBigHeaders, 来自目标/ 后端服务器的 HTTP 响应的标头大小更大 超过 Apigee Edge 中允许的限制

跟踪工具

<ph type="x-smartling-placeholder">
  1. 启用跟踪会话 以及: <ph type="x-smartling-placeholder">
      </ph>
    1. 等待发生 502 Bad Gateway 错误,或者
    2. 如果您可以重现问题,请进行 API 调用并重现 502 Bad Gateway 错误。
  2. 选择其中一个失败请求并检查跟踪记录。
  3. 浏览跟踪记录的不同阶段并找到失败之处 错误。
  4. 通常,您会在名为 Error 的流程中看到此错误,紧跟在 请求发送到目标服务器阶段,如下所示:

    ( 查看大图

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

    • 错误response headers size exceeding 25,600
    • error.classcom.apigee.errors.http.server.BadGateway

    这表示 Apigee Edge(消息处理器组件)会像 在收到后端服务器的响应后立即启动,因为标头大小 超出允许的上限。

  5. 您会在 Response Sent to Client 中看到失败。 错误响应,如下所示:

    ( 查看大图

  6. 请记下跟踪记录中的错误值。上面的跟踪示例显示了以下内容: <ph type="x-smartling-placeholder">
      </ph>
    • 错误502 Bad Gateway
    • 错误内容{"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
  7. 进入跟踪记录中的 AX(记录的 Google Analytics 数据)阶段 然后点击该图标即可查看相关详情

    ( 查看大图

    请注意以下项的值:

    错误标头
    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

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

如需使用 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. 如果您发现任何包含 X-Apigee-fault-code 的 502 错误 protocol.http.TooBigHeaders 的值匹配,然后确定 X-Apigee-fault-source.

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

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

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

原因:响应中的标头大小超过允许的上限

诊断

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

    错误消息

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

    如果您有权查看从 Apigee Edge 收到的完整错误消息,则: 请参阅 faultstringfaultstring 表示 响应标头大小超过允许的限制。

    示例错误消息:

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

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

    实际请求

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

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

    1. 如果您是公有云/私有云用户,请提交申请 从后端服务器本身直接发送到后端服务器 从这里向后端发出请求 服务器。
    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

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

    消息处理器日志

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

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

    如果您是私有云用户,则可以使用消息处理器日志 验证响应标头大小是否超过了 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,并且 Apigee 在大小开始超过 25 KB 的限制时抛出错误,并提供错误代码 名称:protocol.http.TooBigHeaders

分辨率

固定尺寸

方法 1 [推荐]:修复目标服务器应用,使其不发送标头大小 超过 Apigee 限额

<ph type="x-smartling-placeholder">
  1. 分析特定目标服务器发送更多响应标头的原因 超过限制中定义的允许限制。
  2. 如果您不希望这样,请修改您的后端服务器应用,使其只发送 大小小于允许的上限 Apigee Edge
  3. 检查是否可以将标头信息作为响应正文的一部分发送。
  4. 如果可以,请发送您计划作为内容的一部分发送的大量信息 响应正文中的标头。这样可以确保您不会超出 标头限制。
。 <ph type="x-smartling-placeholder">

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

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

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

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

  • 组织名称
  • 环境名称
  • 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