您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 info
问题
客户端应用收到 HTTP 状态代码 502 Bad Gateway,并返回错误
代码 protocol.http.ResponseWithBody 作为 API 调用的响应。
出错提示
客户端应用获取以下响应代码:
HTTP/1.1 502 Bad Gateway
此外,您可能会看到以下某条错误消息:
{
"fault":{
"faultstring":"Received 204 Response with message body",
"detail":{
"errorcode":"protocol.http.ResponseWithBody"
}
}
}{
"fault":{
"faultstring":"Received 205 Response with message body",
"detail":{
"errorcode":"protocol.http.ResponseWithBody"
}
}
}可能的原因
如果从后端服务器到 Apigee Edge 的 HTTP 响应是
204 No Content 或 205 Reset Content,但它包含响应
正文 和/或以下一个或多个标头,则会发生此错误:
Content-LengthContent-EncodingTransfer-Encoding
根据规范
RFC 7231 第 6.3.5 节:204 无内容 和
RFC 7231 第 6.3.6 节:205 重置内容,源服务器不应将任何其他内容
作为响应载荷正文的一部分发送,并返回状态代码 204 No
Content 或 205 Reset Content。响应标头
(例如 Content-Length、Content-Encoding 或
Transfer-Encoding)表示响应载荷的大小、类型或格式。
因此,在以下情况下,Apigee Edge 会向客户端返回 502 Bad Gateway 状态代码,并返回错误代码 protocol.http.ResponseWithBody:
| 后端服务器返回的状态代码 | ||
|---|---|---|
| 后端服务器返回的响应包含 | 204 No Content | 205 Reset Content |
| 响应正文 | 错误 | 错误 |
(设置为非零值) |
错误 | 错误 |
(设置为 Apigee Edge 中支持的编码) |
错误 | 无错误 |
Transfer-Encoding |
错误 | 错误 |
以下是造成此错误的可能原因:
| 原因 | 说明 | 适用的问题排查说明 |
|---|---|---|
| 后端服务器返回的 204 响应包含响应正文或标头 | 后端服务器发送 204 No Content 或 205 Reset Content
响应,其中包含响应正文和/或一个或多个标头 Content-Type、
Content-Encoding 或 Transfer-Encoding。 |
Edge Public 和 Private Cloud 用户 |
常见诊断步骤
请使用以下工具/方法之一来诊断此错误:
API 监控
如需使用 API 监控诊断错误,请执行以下操作:
- 以具有 适当角色的用户身份登录 Apigee Edge 界面。
切换到您要调查问题的组织。
- 依次前往 Analyze > API Monitoring > Investigate 页面。
- 选择您观察到错误的具体时间范围。
- 绘制故障代码 与时间 的关系图。
选择包含故障代码
protocol.http.ResponseWithBody的单元格,如下所示:( 查看放大图片)
您将看到有关故障代码
protocol.http.ResponseWithBody的信息,如下所示:( 查看放大图片)
点击 View logs ,然后展开失败请求对应的行。
( 查看放大图片)
- 在 Logs 窗口中,记下以下详细信息:
- 状态代码 :
502 - 故障来源 :
target - 故障代码 :
protocol.http.ResponseWithBody。
- 状态代码 :
- 如果故障来源 的值为
target,且故障代码 的值为protocol.http.ResponseWithBody,则表示发生错误的原因是后端服务器发送了204 No Content或205 Reset Content状态代码,其中包含响应正文和/或“可能的原因”部分中提及的某个标头。
Trace 工具
如需使用 Trace 工具诊断错误,请执行以下操作:
- 启用跟踪会话
然后执行以下任一操作:
- 等待
502 Bad Gateway错误发生。或 - 如果您可以重现此问题,请进行 API 调用并重现
502 Bad Gateway错误。
- 等待
确保已启用显示所有 FlowInfo :
- 选择一个失败的请求,然后检查跟踪记录。
- 浏览跟踪记录的不同阶段,找到发生失败的位置 。
您通常会在
flowinfo错误 之后找到 发送到目标服务器的请求 阶段,如下所示:情景 #1
情景 #1:后端服务器返回状态代码
204 No Content其中包含响应正文和/或“可能的原因”中列出的某个标头。
记下跟踪记录中的以下值:
- 错误:
Received 204 Response with message body - error.class::
com.apigee.rest.framework.BadGateway
情景 #2
情景 #2:后端服务器返回状态代码
204 No Content,其中包含响应正文和/或“可能的原因”中列出的某个标头。
记下跟踪记录中的以下值:
- 错误:
Received 205 Response with message body - error.class::
com.apigee.rest.framework.BadGateway
- 错误:
- 在跟踪记录中前往 AX (记录的分析数据)阶段 然后点击该阶段。
向下滚动到 Phase Details(阶段详细信息)、Error Headers(错误标头)部分,然后 确定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值,如下所示:
( 查看放大图片)
- 请注意,X-Apigee-fault-code 和 X-Apigee-fault-source
的值分别为
are protocol.http.ResponseWithBody和target。 这表示发生错误的原因是后端服务器发送了204 No Content或205 Reset Content状态代码,其中包含 响应正文和/或“可能的原因”中提及的某个标头。错误 值 X-Apigee-fault-code protocol.http.ResponseWithBodyX-Apigee-fault-source target
NGINX
如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是 Private Cloud 用户,则可以使用 NGINX 访问日志来
确定有关 HTTP
502 Bad Gateway的关键信息。 检查 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log其中: ORG、ENV 和 PORT# 将替换为实际值。
- 搜索以查看在特定时间段内(如果问题过去发生过)是否存在任何错误代码为
protocol.http.ResponseWithBody的502错误,或者是否存在任何请求仍然失败并返回502。 如果您确实发现任何
502错误,且 X-Apigee-fault-code 与protocol.http.ResponseWithBody的值匹配,请确定 X-Apigee-fault-source 的值。NGINX 访问日志中的 502 错误示例:
NGINX 访问日志中的上述示例条目的 X- Apigee-fault-code 和 X-Apigee-fault-source具有以下值:
响应标头 值 X-Apigee-fault-code protocol.http.ResponseWithBodyX-Apigee-fault-source target- 请注意,X-Apigee-fault-code 和 X-Apigee-fault-source
的值分别为
protocol.http.ResponseWithBody和target。 这表示发生错误的原因是后端服务器发送了204 No Content或205 Reset Content状态代码,其中包含 响应正文和/或“可能的原因”中提及的某个标头。
原因:后端服务器返回的 204 响应包含响应正文或标头
诊断
- 使用 API 监控、Trace 工具或 NGINX 访问日志确定观察到的错误的故障代码 和故障来源 ,如常见诊断步骤中所述。
- 如果故障代码 为
protocol.http.ResponseWithBody,且 故障来源 的值为target,则表示后端 服务器返回了204 No Content或205 Reset Content状态 代码,其中包含响应正文和/或“可能的原因”中提及的某个标头。 如需验证后端服务器是否确实发送了响应载荷正文和/或一个 或多个“可能的原因”中提及的标头,您可以 执行以下步骤:
如果您是 Public Cloud 用户,并且可以直接从任何系统向 后端服务器发出相同的 API 请求。
- 如果您是 Private Cloud 用户,则可以直接从与观察到失败的特定 组织和环境关联的某个消息处理器向 后端服务器发出相同的 API 请求。
查看从后端服务器收到的响应,并验证该响应是否包含一个 响应载荷正文和/或上述一个或多个标头。如果是,则会导致此错误。
示例 1
示例 1:后端服务器返回 204 响应,其中包含 Content-Encoding 标头
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 204 No Content
< Content-Encoding: gzip< Date: Tue, 31 Jul 2021 21:41:13 GMT < Connection: keep-alive在此示例中,后端服务器返回了
204 No Content状态代码和Content-Encoding: gzip示例 2
示例 2:后端服务器返回 204 响应,其中包含 Content-Length 标头
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 204 No Content
< Content-Length: 48< Date: Tue, 31 Jul 2021 21:41:13 GMT < Connection: keep-alive在此示例中,后端服务器返回了
204 No Content状态代码和Content-Length: 48示例 3
示例 3:后端服务器返回 205 响应,其中包含响应正文
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 205 Reset Content < Date: Sat, 31 Jul 2021 17:14:09 GMT < Content-Length: 12 < Content-Type: text/plain; charset=utf-8 < * Connection #0 to host X.X.X.X left intact
This is a sample Response在此示例中,后端服务器返回了
205 Reset Content状态代码,其中包含响应正文This is a sample Response.- 在上述所有示例中,后端服务器发送了
204 No Content或205 Reset Content状态代码,其中包含响应正文和/或“可能的原因”中提及的某个标头。 - 因此,Apigee Edge 发送了
502 Bad Gateway状态代码,并返回错误代码protocol.http.ResponseWithBody。
分辨率
确保后端服务器在向 Apigee Edge 发送 204 No Content
或 205 Reset Content 响应时,始终遵循规范
RFC 7231 第 6.3.6 节:205 重置内容。也就是说,后端服务器
不得 将以下内容作为 204 No Content 或
205 Reset Content 响应的一部分发送:
- 响应载荷正文
- 以及以下任何标头:
Content-LengthContent-EncodingTransfer-Encoding
规范
如果后端服务器发送 204 No Content 或 205 Reset Content 响应,但不遵循以下 RFC 规范,Apigee Edge 会返回 502 Bad Gateway 状态代码,并返回错误代码
protocol.http.ResponseWithBody:
| 规范 |
|---|
| RFC 7231 第 6.3.5 节:204 无内容 |
| RFC 7231 第 6.3.6 节:205 重置内容 |
需要注意的要点
建议的解决方案是修复后端服务器,使其发送 204 No Content
和 205 Reset Content 状态代码,而不包含响应正文和任何
标头(Content-Length、Content-Encoding 和
Transfer-Encoding),并遵循规范
RFC 7231 第 6.3.5 节:204 无内容 和
RFC 7231 第 6.3.6 节:205 重置内容。
如果您仍然需要 Apigee 支持团队的任何帮助,请前往 必须收集诊断信息。
必须收集的诊断信息
收集以下诊断信息,然后与 Apigee Edge 支持团队联系:
如果您是 Public Cloud 用户,请提供以下信息:
- 组织名称
- 环境名称
- 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