502 网关无效 - TooBigBody

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

问题

客户端应用收到 HTTP 状态代码 502 Bad Gateway 和错误代码 protocol.http.TooBigBody 作为 API 调用的响应。

错误消息

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"Body buffer overflow",
      "detail":{
         "errorcode":"protocol.http.TooBigBody"
      }
   }
}

可能的原因

如果目标/后端服务器将载荷大小作为一部分发送到 Apigee Edge,就会出现此错误 HTTP 响应数超过 Apigee Edge 中允许的限额

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

原因 说明 适用的问题排查说明
响应载荷大小大于允许的上限 作为对 Apigee 的 HTTP 响应的一部分,目标/后端服务器发送的载荷大小为 超过 Apigee 中允许的限制。 Edge 公有云和私有云用户
响应的有效负载量超过允许的上限后, 解压缩 目标/后端服务器作为 HTTP 的一部分以压缩格式发送的载荷大小 由 Apigee 解压缩后,对 Apigee 的响应数量会超过允许的限值。 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.TooBigBody的单元格 如下所示:

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

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

  10. 在“日志”窗口中,请注意以下详细信息: <ph type="x-smartling-placeholder">
      </ph>
    • 状态代码502
    • 故障来源target
    • 错误代码protocol.http.TooBigBody
  11. 如果故障来源的值为 target故障代码 值为 protocol.http.TooBigBody,则表示 HTTP 来自目标/ 后端服务器的响应的响应载荷大小大于 Apigee Edge 中允许的限制

Trace

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

如需使用跟踪工具诊断错误,请执行以下操作:

  1. 启用跟踪会话并执行以下操作之一: <ph type="x-smartling-placeholder">
      </ph>
    • 等待发生 502 Bad Gateway 错误,或者
    • 如果您可以重现问题,请进行 API 调用并重现问题 502 Bad Gateway 个错误。
  2. 选择其中一个失败请求并检查跟踪记录。
  3. 浏览跟踪记录的不同阶段,并找到失败的位置。
  4. 跳至 Response received from target(从目标接收到的响应)后的阶段 Error(错误) 服务器阶段,如下所示:

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

    • 错误Body buffer overflow
    • error.classcom.apigee.errors.http.server.BadGateway

    这表示 Apigee Edge(消息处理器组件)会在 由于载荷大小超过允许的 上限。

  5. 您将在响应已发送至客户端阶段看到失败情况,如下所示:

  6. 请记下跟踪记录中的错误值。上面的跟踪示例显示了以下内容: <ph type="x-smartling-placeholder">
      </ph>
    • 错误502 Bad Gateway
    • 错误内容{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  7. 请根据不同的情况进入从目标服务器收到的响应阶段(如下所示):

    未压缩

    场景 1:以未压缩形式发送的响应载荷

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

    • 从目标服务器收到的响应200 OK
    • Content-Length(来自响应标头部分):约 11MB

    压缩后

    场景 2:以压缩格式发送请求载荷

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

    • 从目标服务器收到的响应200 OK
    • Content-Encoding:如果您在响应标头中看到此标头 部分中,记下其值。例如,在此示例中,该值为 gzip
  8. 请注意 Response Content 部分下的 Body

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
    <ph type="x-smartling-placeholder">
  9. 进入跟踪记录中的 AX(分析的数据记录的)阶段,然后点击该阶段 查看相关详情。

  10. 阶段详情中,向下滚动到变量读取部分,并确定 target.received.content.length 的值,这表明:
    • 以未压缩格式发送的响应负载和
    • Apigee 解压缩后的响应载荷的大小(当载荷为 以压缩格式发送。该值始终与允许的 上限 (10 MB)。
    。 <ph type="x-smartling-placeholder">

    未压缩

    场景 1:以未压缩形式发送的响应载荷

    请记下 target.received.content.length 的值:

    请求标头
    target.received.content.length 约 11 MB

    压缩后

    场景 2:以压缩格式发送请求载荷

    请记下 target.received.content.length 的值:

    请求标头
    target.received.content.length 约 10 MB
  11. 下表说明了 Apigee 为何会在下方返回 502 错误 两种情形(根据 target.received.content.length 的值):

    场景 target.received.content.length 的值 失败原因
    未压缩格式的响应载荷 约 11 MB 大小 >允许的上限为 10 MB
    压缩格式的响应载荷 约 10 MB

    解压缩时超出大小限制

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

NGINX

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

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

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

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

    其中ORGENVPORT# 替换为实际值。

  3. 搜索以查看在特定时间段内是否存在任何 502 错误(如果 问题是否发生过),或者是否有任何请求仍失败, 502
  4. 如果您确实在 X-Apigee-fault-code 匹配项中找到了任何 502 错误, 求 protocol.http.TooBigBody 的值,然后确定 X-Apigee-fault-source.

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

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

    响应标头
    X-Apigee-fault-code protocol.http.TooBigBody
    X-Apigee-fault-source target

原因:响应载荷大小超过允许的限制

诊断

  1. 确定应用的故障代码故障来源响应载荷大小 使用 API 监控、跟踪工具或 NGINX 访问日志观察到的错误,如 常见诊断步骤(情景 1)。
  2. 如果故障来源的值为 target,则表示响应 目标/后端服务器发送到 Apigee 的载荷大小大于 Apigee Edge 中允许的限制
  3. 验证第 1 步确定的响应载荷大小
  4. 验证响应载荷大小确实是 >通过查看 进行实际响应: <ph type="x-smartling-placeholder">
      </ph>
    1. 如果您无权访问向目标/后端服务器发出的实际请求, 然后找到分辨率
    2. 如果您可以访问对目标/后端服务器发出的实际请求,那么 请执行以下步骤: <ph type="x-smartling-placeholder">
        </ph>
      1. 如果您是公有云/私有云用户,请直接向 从后端服务器本身访问后端服务器, 可以向后端服务器发出请求。
      2. 如果您是 Private Cloud 用户,也可以向 从某个消息处理器中返回后端服务器。
      3. 通过检查 Content-Length 标头
      4. 如果您发现有效负载的大小 Apigee Edge 中允许的限制,则这就是导致 问题。

    来自后端服务器的示例响应

    curl -v https://BACKENDSERVER-HOSTNAME/testfile
    
    * About to connect() to 10.14.0.10 port 9000 (#0)
    *   Trying 10.14.0.10...
    * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0)
    > GET /testfile HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: 10.14.0.10:9000
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Length: 11534336
    < Content-Type: application/octet-stream
    < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
    < Date: Wed, 30 Jun 2021 09:22:41 GMT
    <
    ----snipped----
    <Response Body>
    

    在上面的示例中,您可以看到 Content-Length: 11534336 (which is ~11 MB) 是导致此错误的原因,因为它超出了 Apigee Edge 中允许的限制

分辨率

请参阅解决方法

原因:响应负载大小超出允许的限值 解压缩

如果响应载荷以压缩格式和响应标头发送 Content-Encoding 设置为 gzip, Apigee 解压缩响应 载荷。在解压缩过程中,如果 Apigee 发现负载较大 超过 Apigee Edge 中允许的限制,则进一步停止 解压缩并立即响应 (代码为 502 Bad Gateway 且错误代码为 protocol.http.TooBigBody)。

诊断

  1. 确定应用的故障代码故障来源响应载荷大小 使用 API 监控、跟踪工具或 NGINX 访问日志观察到的错误,如 常见诊断步骤(适用于情景 2)。
  2. 如果故障来源的值为 target,则表示 目标/后端应用发送到 Apigee 的响应载荷大小大于 Apigee Edge 中允许的限制。
  3. 验证第 1 步确定的响应载荷大小
    • 如果载荷大小 >允许的上限是 10 MB,则这就是导致错误的原因。
    • 如果载荷大小允许的上限约 10 MB,则响应载荷可能会 以压缩格式传递。在本例中,请检查压缩包的未压缩大小 响应载荷。
  4. 您可以验证来自目标/后端的响应是否以压缩格式发送, 使用以下某一条件,未压缩的大小超出了允许的限值 方法:

    Trace

    使用跟踪工具

    1. 如果您已捕获失败请求的跟踪记录,请参阅 Trace 和 <ph type="x-smartling-placeholder">
        </ph>
      1. 确定 target.received.content.length 的值
      2. 验证来自客户端的请求是否包含 Content-Encoding: gzip 标头
    2. 如果 target.received.content.length 的值在允许的 10 MB 左右 限制和响应标头 Content-Encoding: gzip ,也就是 导致出现此错误的原因。

    实际请求

    使用实际请求

    1. 如果您无权访问向目标/后端服务器发出的实际请求, 然后找到分辨率
    2. 如果您可以访问对目标/后端服务器发出的实际请求,那么 请执行以下步骤: <ph type="x-smartling-placeholder">
        </ph>
      1. 验证响应中传递的有效负载的大小,以及 响应中发送的 Content-Encoding 标头。
      2. 如果您发现响应标头 Content-Encoding 设置为 gzip,并且载荷的未压缩大小超过了 Apigee Edge 中允许的上限,则会导致 出错。

        从后端服务器收到的响应示例

        curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
        
        * 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 /testzippedfile.gz 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-Encoding: gzip
        < Content-Type: application/x-gzip
        < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
        < Testheader: test
        < Date: Wed, 07 Jul 2021 10:14:16 GMT
        < Transfer-Encoding: chunked
        <
        ----snipped----
        <Response Body>
        

        在上述情况下,系统会发送标头 Content-Encoding: gzip, 响应中文件 testzippedfile.gz 的大小小于 未超过上限,但是未压缩文件 testzippedfile 的大小为 约 15 MB。

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

    消息处理器日志

    使用消息处理器日志

    <ph type="x-smartling-placeholder">
    1. 如果您是 Private Cloud 用户,可以使用消息处理器日志 确定有关 HTTP 502 错误的关键信息。
    2. 检查消息处理器日志

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

    3. 搜索查看在特定时间段内是否存在任何 502 错误 (如果问题在过去发生过)或者是否还有任何请求仍失败, 502。您可以使用以下搜索字符串:

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. 您会找到 system.log 中与以下内容类似的行 (TotalReadchunkCount 可能会因您的情况而异):
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.SERVICE -
      TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large.
      TotalRead 10489856 chunkCount 2571
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :
      ClientInputChannel(ClientChannel[Connected:
      Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155
      useCount=1 bytesRead=0 bytesWritten=182 age=23ms  lastIO=0ms
      isOpen=true).onExceptionRead exception: {}
      com.apigee.errors.http.server.BadGateway: Body buffer overflow
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR
      ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() :
      AbstractResponseListener.onError(HTTPResponse@77cbd7c4,
      Body buffer overflow)
      
    5. 在解压缩过程中,一旦消息处理器确定 总读取字节数为 >10 MB,它会停止运行并输出以下行:

      Message is too large. TotalRead 10489856 chunkCount 2571

      这表示响应载荷大小超过 10 MB,且 Apigee 会在大小开始超过 10 MB 限值时抛出错误,错误代码为 protocol.http.TooBigBody

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

分辨率

固定尺寸

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

<ph type="x-smartling-placeholder">
  1. 分析特定目标服务器发送响应的原因 / 载荷大小 超过了 中定义的允许的上限 限制
  2. 如果您不希望这样,请修改目标服务器应用,使其只发送 响应 / 载荷大小小于允许的上限。
  3. 如果需要,并且您希望发送的响应/载荷超过允许的数量, 限制,请转到下一个选项。

签名网址格式

选项 2 [推荐]:在 Apigee JavaCallout 中使用签名网址格式

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

对于超过 10 MB 的载荷,Apigee 建议在 如示例中的 <ph type="x-smartling-placeholder"></ph> GitHub 上的 Edge Callout: Signed 网址 Generator 示例。

流式

方法 3:使用流式传输

如果您的 API 代理需要处理非常大的请求和/或响应,那么您可以 在 Apigee 中启用流式传输

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

CwC

选项 4:使用 CwC 属性提高缓冲区限制

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

仅当您不能使用任何推荐选项时,才应使用 如果增大默认大小,则可能会出现性能问题。

Apigee 提供了 <ph type="x-smartling-placeholder"></ph> CwC 属性,以允许它增加请求和响应载荷大小 上限。如需了解详情,请参阅 <ph type="x-smartling-placeholder"></ph> 在路由器或消息处理器上设置邮件大小限制

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

限制

Apigee 要求客户端应用和后端服务器发送的载荷大小不得超过 针对 Request/response size 的允许限制,具体请参阅 Apigee Edge 限额

  1. 如果您是公有云用户,则请求和响应的数量上限 载荷大小如以下文档中有关 Request/response size 的说明: Apigee Edge 限额
  2. 如果您是 Private Cloud 用户 ,则可能已经修改了默认上限 限制请求和响应载荷大小(尽管不建议这样做)。 您可以按照 如何查看当前限制

如何查看当前限制?

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

本部分介绍了如何验证 “HTTPResponse.body.buffer.limit”已更新为消息中的新值 处理器。

  1. 在消息处理器计算机上,搜索属性 HTTPResponse.body.buffer.limit(位于 /opt/apigee/edge-message- processor/conf 目录中),然后检查已设置的值,如下所示:

    grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. 上述命令的示例结果如下所示:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
    
  3. 在上面的示例输出中,请注意属性 已在HTTPResponse.body.buffer.limit10m http.properties

    这表示 Apigee 中针对 私有云的大小为 10 MB

如果您仍然需要 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