<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
标头。
下面列举了一些受支持的 Content-Encoding
值示例,以及 Apigee Edge 如何
预期载荷表示是在以下情况下:
场景 | Content-Encoding | 载荷表示法 |
---|---|---|
单一编码 | gzip | Unix 请参阅 <ph type="x-smartling-placeholder"></ph> RFC1952 GZIP 格式。 |
单一编码 | 缩小 | 此格式使用 请参阅
RFC1950 和
<ph type="x-smartling-placeholder"></ph>
RFC1951 |
多重编码 | 多重编码 例如,如果编码进行了两次,则可能是:
|
按标头中显示的指定顺序对载荷应用多种编码。 |
导致此错误的可能原因如下:
原因 | 说明 | 适用的问题排查说明 |
---|---|---|
<ph type="x-smartling-placeholder"></ph> 响应载荷格式与 Content-Encoding 不匹配 | 后端/目标服务器发送的响应载荷的格式是
未编码或未
与 Content-Encoding 标头中指定的编码匹配。 |
Edge 公有云和私有云用户 |
常见诊断步骤
使用以下工具/技术之一来诊断此错误:
API 监控
<ph type="x-smartling-placeholder">如需使用 API Monitoring 诊断错误,请执行以下操作:
- <ph type="x-smartling-placeholder"></ph> 以拥有的用户身份登录 Apigee Edge 界面 适当的角色。
切换到您要在其中调查问题的单位。
- 导航至分析 >API 监控 >调查页面。
- 选择您观察到错误的具体时间范围。
- 确保将代理过滤器设置为全部。
- 根据时间绘制错误代码。
选择错误代码为
messaging.adaptors.http.flow.DecompressionFailureAtResponse
的单元格 如下所示:( 查看大图)
有关错误代码的信息
messaging.adaptors.http.flow.DecompressionFailureAtResponse
如下所示:( 查看大图)
点击查看日志,然后展开显示
502
错误的行。( 查看大图)
- 在日志窗口中,请注意以下详细信息:
<ph type="x-smartling-placeholder">
- </ph>
- 状态代码:
502
- 故障来源:
target
- 错误代码:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
。
- 状态代码:
- 如果错误来源的值为
target
,则表示 响应载荷格式与 后端服务器的响应标头中指定的受支持编码Content-Encoding
。
跟踪工具
<ph type="x-smartling-placeholder">如需使用跟踪工具诊断错误,请执行以下操作:
- 启用跟踪会话
以及:
<ph type="x-smartling-placeholder">
- </ph>
- 等待发生
502 Bad Gateway
错误,或者 - 如果您可以重现问题,请进行 API 调用并重现问题
502 Bad Gateway
。
- 等待发生
确保已启用 Show all FlowInfos:
- 选择一个失败的响应并检查跟踪记录。
- 浏览跟踪记录的不同阶段并找到失败之处 错误。
通常,您会在流程中的 从目标服务器收到的响应阶段如下所示:
( 查看大图)
-
请记下跟踪记录中的属性值:
- Content-Encoding:
gzip
- 响应内容正文:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Content-Encoding:
仅在收到从目标服务器收到响应后,转到错误阶段 阶段:
( 查看大图)
请注意这些属性:
- 错误:
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 会返回此错误。- 错误:
进入跟踪记录中的 Response Sent to Client 阶段,然后点击该阶段。
( 查看大图)
请注意跟踪记录的以下详细信息:
- 状态代码:
502 Bad Gateway
。 - 错误内容:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- 状态代码:
进入跟踪记录中的 AX(记录的 Google Analytics 数据)阶段 然后点击它
- 向下滚动到阶段详情、错误标头部分,然后
确定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值
如下所示:
( 查看大图)
- 您将看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值
以
messaging.adaptors.http.flow.DecompressionFailureAtResponse
和target
,这表示响应载荷格式与Content-Encoding
标头中指定的任何一种编码。响应标头 值 X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
X-Apigee-fault-source target
NGINX
<ph type="x-smartling-placeholder">如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是 Private Cloud 用户,则可以使用 NGINX 访问日志
确定有关 HTTP
502
错误的关键信息。 查看 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中:ORG、ENV 和 PORT# 替换为实际值。
- 搜索查看在特定时间段内是否存在任何
502
错误 (如果问题在过去发生过)或者返回失败的响应502
。 如果您确实在 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
中指定的编码。
如果存在不匹配,就会收到此错误。
诊断
- 确定使用 API 观察到的错误的错误代码和错误来源 监控、跟踪工具或 NGINX 访问日志,如 常见的诊断步骤。
- 如果错误代码是
messaging.adaptors.http.flow.DecompressionFailureAtResponse
和 故障来源的值为target
,则此 表示后端/目标服务器发送的响应有效负载的格式与 <ph type="x-smartling-placeholder"></ph> 响应标头Content-Encoding
中指定的受支持编码。 您可以使用以下任一方法在 HTTP 响应中确定不匹配问题 方法:
错误消息
如需使用错误消息进行验证,请执行以下操作:
-
如果您有权查看从 Apigee Edge 收到的完整错误消息,则: 请参阅
faultstring
。示例错误消息:
"faultstring":"Decompression failure at response"
- 在上述错误消息中,
"Decompression failure at response"
,这意味着响应 使用Content-Encoding
标头。
Trace
如需使用 Trace 进行验证,请执行以下操作:
实际请求
如需使用实际请求进行验证,请执行以下操作:
如果您有权访问发送到目标/后端服务器的实际请求 然后执行以下步骤:
- 如果您是公有云/私有云用户,请提交申请 从后端服务器本身直接发送到后端服务器 并从中向后端服务器发出请求。
- 如果您是 Private Cloud 用户,也可以提出申请 从其中一个消息处理器发送到后端服务器。
- 检查后端服务器发送的响应并确定值
传入响应标头
Content-Encoding.
- 确定随请求一起发送的载荷格式。
- 如果
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
错误的关键信息。检查消息处理器日志:
/opt/apigee/var/log/edge-message-processor/logs/system.log
搜索特定期间是否存在任何
502
错误 持续时间(如果问题在过去发生过)或是否有任何响应 仍然失败并显示502
。您可以使用以下搜索字符串:grep -ri "ZipException"
您会找到 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() : Exceptionjava.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 check
和Caused by: java.util.zip.DataFormatException: incorrect header check
表示响应有效负载不是在 deflate 格式,并且它与 deflate 的Content-Encoding
标头。因此,Apigee Edge 会抛出异常并返回502
状态代码, 错误代码messaging.adaptors.http.flow.DecompressionFailureAtResponse
。
-
分辨率
- 如果不需要在 Apigee Edge 的 API 代理流程中使用压缩的响应载荷
在后端服务器中,则不要传递标头
Content-Encoding
。 如果需要压缩响应载荷,请转到第 2 步。 - 如果需要压缩响应载荷,请确保后端服务器
始终发送以下内容:
<ph type="x-smartling-placeholder">
- </ph>
- 以下任何一项:
<ph type="x-smartling-placeholder"></ph>
支持的编码作为
Content-Encoding
标头的值, 条回复 - Apigee Edge 支持的格式响应载荷与编码格式匹配,
Content-Encoding
标头中指定的格式
- 以下任何一项:
<ph type="x-smartling-placeholder"></ph>
支持的编码作为
- 在上面讨论的示例中,响应负载采用 ZIP 格式,但响应标头
指定
Content-Encoding: gzip
。您可以通过发送回复来解决此问题 标头显示为Content-Encoding: gzip
,响应载荷位于gzip
中 格式:curl -v https://HOSTALIAS/v1/test
> < HTTP/1.1 200 OK < Accept-Ranges: bytes <
<ph type="x-smartling-placeholder">Content-Encoding: gzip
< Date: Mon, 02 Aug 2021 08:17:35 GMT < Transfer-Encoding: chunked < < response_payload.gz Response Body(in GZIP format)>
规范
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
其中:ORG、ENV 和 PORT# 替换为 实际值。
- 消息处理器系统日志
/opt/apigee/var/log/edge-message-processor/logs/system.log