502 网关无效 - 解压缩失败响应

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

问题

客户端应用收到 HTTP 状态代码 502 Bad Gateway 和错误代码 使用 messaging.adaptors.http.flow.DecompressionFailureAtResponse 作为对 API 的响应 调用。

错误消息

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

HTTP/1.1 502 Bad Gateway

此外,您可能还会看到类似于如下所示的错误消息:

{
   "fault":{
      "faultstring":"Decompression failure at response",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
      }
   }
}

可能的原因

只有在以下情况下,才会发生此错误:

  • HTTP 响应(来自后端/目标服务器)标头中指定的编码 Content-Encoding 有效且 由 Apigee Edge 提供支持
  • 但是

  • 后端/目标服务器作为 HTTP 响应的一部分发送的载荷格式 不 匹配 Content-Encoding 标头中指定的编码格式

这是因为 Apigee Edge 无法使用指定编码解码载荷,因为 与 Content-Encoding 标头。

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

下面列举了一些受支持的 Content-Encoding值示例,以及 Apigee Edge 如何 预期载荷表示是在以下情况下:

场景 Content-Encoding 载荷表示法
单一编码 gzip

Unix gzip 格式。

请参阅 <ph type="x-smartling-placeholder"></ph> RFC1952 GZIP 格式

单一编码 缩小

此格式使用 zlib 结构和 deflate 压缩算法。

请参阅 RFC1950 和 <ph type="x-smartling-placeholder"></ph> RFC1951.

多重编码

多重编码

例如,如果编码进行了两次,则可能是:

  • gzip、deflate
  • gzip、gzip
  • deflate、gzip
  • deflate、deflate
按标头中显示的指定顺序对载荷应用多种编码。

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

原因 说明 适用的问题排查说明
<ph type="x-smartling-placeholder"></ph> 响应载荷格式与 Content-Encoding 不匹配 后端/目标服务器发送的响应载荷的格式是 未编码或未 与 Content-Encoding 标头中指定的编码匹配。 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. 选择错误代码为messaging.adaptors.http.flow.DecompressionFailureAtResponse的单元格 如下所示:

    ( 查看大图

  8. 有关错误代码的信息 messaging.adaptors.http.flow.DecompressionFailureAtResponse 如下所示:

    ( 查看大图

  9. 点击查看日志,然后展开显示 502 错误的行。

    ( 查看大图

  10. 日志窗口中,请注意以下详细信息: <ph type="x-smartling-placeholder">
      </ph>
    • 状态代码502
    • 故障来源target
    • 错误代码messaging.adaptors.http.flow.DecompressionFailureAtResponse
  11. 如果错误来源的值为 target,则表示 响应载荷格式与 后端服务器的响应标头中指定的受支持编码 Content-Encoding

跟踪工具

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

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

  1. 启用跟踪会话 以及: <ph type="x-smartling-placeholder">
      </ph>
    1. 等待发生 502 Bad Gateway 错误,或者
    2. 如果您可以重现问题,请进行 API 调用并重现问题 502 Bad Gateway
  2. 确保已启用 Show all FlowInfos

  3. 选择一个失败的响应并检查跟踪记录。
  4. 浏览跟踪记录的不同阶段并找到失败之处 错误。
  5. 通常,您会在流程中的 从目标服务器收到的响应阶段如下所示:

    ( 查看大图

  6. 请记下跟踪记录中的属性值:

    • Content-Encodinggzip
    • 响应内容正文{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. 仅在收到从目标服务器收到响应后,转到错误阶段 阶段:

    ( 查看大图

    请注意这些属性:

    • 错误Decompression failure at response
    • error.class:com.apigee.errors.http.server.BadGateway
    • error.cause:Not in GZIP format

      error.cause 指出响应载荷未采用 GZIP 格式。 这意味着 Apigee Edge 希望响应载荷采用 GZIP 格式, 在 Content-Encoding 标头中指定(在之前的 因此,Apigee Edge 无法使用 gzip 解压缩载荷,并返回 错误 Decompression failure at response

    请注意,在此示例中,来自目标/后端服务器的响应为 200 case;不过,客户端应用将收到 502 因为 Apigee Edge 会返回此错误。

  8. 进入跟踪记录中的 Response Sent to Client 阶段,然后点击该阶段。

    ( 查看大图

    请注意跟踪记录的以下详细信息:

    • 状态代码502 Bad Gateway
    • 错误内容{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. 进入跟踪记录中的 AX(记录的 Google Analytics 数据)阶段 然后点击它

  10. 向下滚动到阶段详情错误标头部分,然后 确定 X-Apigee-fault-codeX-Apigee-fault-source 的值 如下所示:

    ( 查看大图

  11. 您将看到 X-Apigee-fault-codeX-Apigee-fault-source 的值 以messaging.adaptors.http.flow.DecompressionFailureAtResponsetarget,这表示响应载荷格式与 Content-Encoding 标头中指定的任何一种编码。
    响应标头
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

NGINX

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

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

  1. 如果您是 Private Cloud 用户,则可以使用 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 错误 与messaging.adaptors.http.flow.DecompressionFailureAtResponse的值匹配, 然后确定 X-Apigee-fault-source.

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

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

    响应标头
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

原因:响应负载格式与 Content-Encoding 不匹配

默认情况下,如果有响应标头,Apigee Edge 始终会对载荷进行解压缩 Content-Encoding 包含有效的和 <ph type="x-smartling-placeholder"></ph> 支持的编码。因此,响应有效负载的格式 应匹配响应标头 Content-Encoding 中指定的编码。 如果存在不匹配,就会收到此错误。

诊断

  1. 确定使用 API 观察到的错误的错误代码错误来源 监控、跟踪工具或 NGINX 访问日志,如 常见的诊断步骤
  2. 如果错误代码messaging.adaptors.http.flow.DecompressionFailureAtResponse故障来源的值为 target,则此 表示后端/目标服务器发送的响应有效负载的格式与 <ph type="x-smartling-placeholder"></ph> 响应标头 Content-Encoding 中指定的受支持编码
  3. 您可以使用以下任一方法在 HTTP 响应中确定不匹配问题 方法:

    错误消息

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

    1. 如果您有权查看从 Apigee Edge 收到的完整错误消息,则: 请参阅 faultstring

      示例错误消息:

      "faultstring":"Decompression failure at response"
      
    2. 在上述错误消息中, "Decompression failure at response",这意味着响应 使用 Content-Encoding 标头。

    Trace

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

    1. 确定 Content-Typeerror.cause 使用 Trace常见诊断步骤中所述。
    2. 示例跟踪记录中的值如下所示:

      • Content-Encodinggzip
      • error.cause:Not in GZIP format

      响应标头 Content-Encoding 的值为 gzip; 但是,响应负载并非采用 GZIP 格式 (以 error.cause 表示)。因此,Apigee Edge 会以 502 Bad Gateway 和错误代码 messaging.adaptors.http.flow.DecompressionFailureAtResponse

    实际请求

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

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

    1. 如果您是公有云/私有云用户,请提交申请 从后端服务器本身直接发送到后端服务器 并从中向后端服务器发出请求。
    2. 如果您是 Private Cloud 用户,也可以提出申请 从其中一个消息处理器发送到后端服务器。
    3. 检查后端服务器发送的响应并确定值 传入响应标头 Content-Encoding.
    4. 确定随请求一起发送的载荷格式。
    5. 如果 Content-Encoding 标头的值在 <ph type="x-smartling-placeholder"></ph> 支持的编码,但响应负载的格式 与 Content-Encoding 标头中指定的编码不匹配, 那么这就是出现问题的原因

      示例

      curl -v https://HOSTALIAS/test
      

      ***trimmed***
      >
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Encoding: gzip
      < Date: Mon, 02 Aug 2021 08:17:35 GMT
      < Transfer-Encoding: chunked
      <
      < response_payload.zip Response Body(not in GZIP format)>
      

      上面的示例响应会将值 gzip 发送到 Content-Encoding 标头, <ph type="x-smartling-placeholder"></ph> 支持的编码。不过, response_payload.zip 以 ZIP 文件的形式发送。因此, 响应失败,并显示 502 Bad Gateway 错误,错误代码为: messaging.adaptors.http.flow.DecompressionFailureAtResponse

    消息处理器日志

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

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

    如果您是 Private Cloud 用户,可以使用消息处理器日志 以确定有关 HTTP 502 错误的关键信息。

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

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

    2. 搜索特定期间是否存在任何 502 错误 持续时间(如果问题在过去发生过)或是否有任何响应 仍然失败并显示 502。您可以使用以下搜索字符串:

      grep -ri "ZipException"
      
    3. 您会找到 system.log 中类似以下内容的行:

      情景 #1

      场景 1:当 API 响应包含 Content-Encoding: gzip 标头时

      2021-08-02 06:50:25,433  NIOThread@2 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:10.0.115.32:41298]@38140 useCount=1 bytesRead=0
      bytesWritten=203 age=469ms  lastIO=0ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: Not in GZIP format
      ---trimmed--
      2021-08-02 06:50:25,433  NIOThread@2 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details : host=null
      path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:50:25,434  NIOThread@2 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4806fdab, Not in GZIP format)
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: Not in GZIP format
      occurred while writing to channel null
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: Not in GZIP format
      

      上述错误消息中的 java.util.zip.ZipException: Not in GZIP format 行表示响应 虽然 Content-Encoding 和 以 gzip 格式指定因此,Apigee Edge 会抛出异常, 返回带有错误代码的 502 状态代码 messaging.adaptors.http.flow.DecompressionFailureAtResponse

      情景 #2

      场景 2:当 API 响应包含 Content-Encoding: deflate 标头时

      2021-08-02 06:35:21,215  NIOThread@0 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:192.168.194.140:35224]@36014 useCount=1 bytesRead=0
      bytesWritten=202 age=439ms  lastIO=2ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: incorrect header check
      ---trimmed----
      Caused by:
      java.util.zip.DataFormatException: incorrect header check
      ---trimmed---
      2021-08-02 06:35:21,215  NIOThread@0 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details :
      host=null path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:35:21,216  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@3966e277,
      incorrect header check)
      2021-08-02 06:35:21,216  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: incorrect header check occurred while writing to channel null
      2021-08-02 06:35:21,217  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: incorrect header check
      
      

      线条 java.util.zip.ZipException: incorrect header checkCaused by: java.util.zip.DataFormatException: incorrect header check 表示响应有效负载不是在 deflate 格式,并且它与 deflate 的 Content-Encoding 标头。因此,Apigee Edge 会抛出异常并返回 502 状态代码, 错误代码 messaging.adaptors.http.flow.DecompressionFailureAtResponse

分辨率

  1. 如果不需要在 Apigee Edge 的 API 代理流程中使用压缩的响应载荷 在后端服务器中,则不要传递标头 Content-Encoding。 如果需要压缩响应载荷,请转到第 2 步。
  2. 如果需要压缩响应载荷,请确保后端服务器 始终发送以下内容: <ph type="x-smartling-placeholder">
      </ph>
    • 以下任何一项: <ph type="x-smartling-placeholder"></ph> 支持的编码作为 Content-Encoding 标头的值, 条回复
    • Apigee Edge 支持的格式响应载荷与编码格式匹配, Content-Encoding 标头中指定的格式
  3. 在上面讨论的示例中,响应负载采用 ZIP 格式,但响应标头 指定 Content-Encoding: gzip。您可以通过发送回复来解决此问题 标头显示为 Content-Encoding: gzip,响应载荷位于 gzip 中 格式:
    curl -v https://HOSTALIAS/v1/test
    
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Encoding: gzip
    < Date: Mon, 02 Aug 2021 08:17:35 GMT
    < Transfer-Encoding: chunked
    <
    < response_payload.gz Response Body(in GZIP format)>
    
    <ph type="x-smartling-placeholder">

规范

Apigee Edge 返回状态代码 502 Bad Gateway 以及错误代码 messaging.adaptors.http.flow.DecompressionFailureAtResponse(根据以下 RFC) 规范:

规范
<ph type="x-smartling-placeholder"></ph> RFC 7231,第 6.5.1 节
<ph type="x-smartling-placeholder"></ph> RFC 7231,第 3.1.2.2 节

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

必须收集的诊断信息

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

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

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

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

  • 观察到针对失败响应的完整错误消息
  • 环境名称
  • API 代理软件包
  • API 响应的跟踪文件
  • NGINX 访问日志 /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中ORGENVPORT# 替换为 实际值。

  • 消息处理器系统日志 /opt/apigee/var/log/edge-message-processor/logs/system.log