<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
问题
客户端应用收到包含错误的 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-Length
Content-Encoding
Transfer-Encoding
根据规范
<ph type="x-smartling-placeholder"></ph>
RFC 7231,第 6.3.5 节:204 无内容和
<ph type="x-smartling-placeholder"></ph>
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 重置内容 |
响应正文 | 错误 | 错误 |
(设置为非零) |
错误 | 错误 |
(设置为 <ph type="x-smartling-placeholder"></ph> Apigee Edge 中支持的编码) |
错误 | 没有错误 |
Transfer-Encoding |
错误 | 错误 |
<ph type="x-smartling-placeholder"> |
以下是导致此错误的可能原因:
原因 | 说明 | 适用的问题排查说明 |
---|---|---|
来自后端服务器的响应正文或包含 204 响应的标头 | 后端服务器发送 204 No Content 或 205 Reset Content
带有响应正文和/或一个或多个标头 Content-Type 的响应,
Content-Encoding 或 Transfer-Encoding 。 |
Edge 公有云和私有云用户 |
常见诊断步骤
使用以下工具/技术之一来诊断此错误:
API 监控
<ph type="x-smartling-placeholder">如需使用 API Monitoring 诊断错误,请执行以下操作:
- <ph type="x-smartling-placeholder"></ph> 以拥有的用户身份登录 Apigee Edge 界面 适当的角色。
切换到您要在其中调查问题的单位。
- 导航至分析 >API 监控 >调查页面。
- 选择您观察到错误的具体时间范围。
- 根据时间绘制错误代码。 <ph type="x-smartling-placeholder">
选择错误代码为
protocol.http.ResponseWithBody
的单元格 如下所示:( 查看大图)
您将看到有关错误代码的信息
protocol.http.ResponseWithBody
,如下所示:( 查看大图)
点击查看日志,然后展开失败请求对应的行。
( 查看大图)
- 在日志窗口中,请注意以下详细信息:
<ph type="x-smartling-placeholder">
- </ph>
- 状态代码:
502
- 故障来源:
target
- 错误代码:
protocol.http.ResponseWithBody
。
- 状态代码:
- 如果 Fault Source 的值为
target
,并且 Fault 代码的值为protocol.http.ResponseWithBody
,则代码 表示发生了错误,因为后端服务器发送了204 No Content
或205 Reset Content
状态代码, 响应正文和/或 可能的原因部分。
跟踪工具
<ph type="x-smartling-placeholder">如需使用跟踪工具诊断错误,请执行以下操作:
- 启用跟踪会话
以及:
<ph type="x-smartling-placeholder">
- </ph>
- 等待发生
502 Bad Gateway
错误。或 - 如果您可以重现问题,请进行 API 调用并重现
502 Bad Gateway
错误。
- 等待发生
确保已启用 Show all FlowInfos:
- 选择其中一个失败请求并检查跟踪记录。
- 浏览跟踪记录的不同阶段并找到失败之处 错误。
通常,您会在
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(记录的 Google Analytics 数据)阶段 然后点击它
向下滚动到阶段详情、错误标头部分,然后 确定 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.ResponseWithBody
X-Apigee-fault-source target
NGINX
<ph type="x-smartling-placeholder">如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是 Private Cloud 用户,则可以使用 NGINX 访问日志
确定有关 HTTP
502 Bad Gateway
的关键信息。 查看 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中:ORG、ENV 和 PORT# 替换为实际值。
- 搜索是否存在任何带有错误代码的
502
错误 在特定时间段内protocol.http.ResponseWithBody
(如果问题在过去发生过)或者是否还有任何请求仍失败,502
。 如果您确实在 X-Apigee-fault-code 中找到了任何
502
错误 匹配protocol.http.ResponseWithBody
值,然后确定 X-Apigee-fault-source 的值。NGINX 访问日志中的 502 错误示例:
以上 NGINX 访问日志中的示例条目包含 X- Apigee-fault-code 和 X-Apigee-fault-source:
响应标头 值 X-Apigee-fault-code protocol.http.ResponseWithBody
X-Apigee-fault-source target
- 请注意,X-Apigee-fault-code 和 X-Apigee-fault-source 的值
分别为
protocol.http.ResponseWithBody
和target
。 这表示发生了错误,因为后端服务器发送了204 No Content
或205 Reset Content
状态代码, 响应正文和/或可能的原因中提到的某个标头。
原因:响应正文或标头收到后端服务器返回 204 响应
诊断
- 确定使用 API 观察到的错误的错误代码和错误来源 监控、跟踪工具或 NGINX 访问日志,如 常见的诊断步骤。
- 如果错误代码为
protocol.http.ResponseWithBody
,并且 故障来源的值为target
,则表示后端 服务器以204 No Content
或205 Reset Content
状态做出响应 包含响应正文和/或 可能的原因。 验证后端服务器是否确实发送了响应载荷正文和/或 可能的原因中提到的一个或多个标头,您可以 请执行以下步骤:
如果您是公有云用户,并且可以向 从任何系统直接运行后端服务器
<ph type="x-smartling-placeholder">- 如果您是私有云用户,则可以向 从与指定服务器关联的某个消息处理器中 发现故障的组织和环境。
查看从后端服务器收到的响应,验证其是否包含 响应载荷正文和/或上述一个或多个标头。如果有,则 导致出现此错误的原因。
示例 1
示例 1:包含 Content-Encoding 标头的后端服务器响应 204
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:包含 Content-Length 标头的后端服务器响应 204
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
。
分辨率
确保后端服务器始终遵守规范
<ph type="x-smartling-placeholder"></ph>
发送 204 No Content
时,RFC 7231 第 6.3.6 节:205 重置内容
对 Apigee Edge 进行 205 Reset Content
响应。也就是说,后端服务器
不得将以下内容作为 204 No Content
或
205 Reset Content
响应:
- 响应载荷正文
- 以及以下任意标头:
<ph type="x-smartling-placeholder">
- </ph>
Content-Length
Content-Encoding
Transfer-Encoding
规范
Apigee Edge 会返回 502 Bad Gateway
状态代码和错误代码
protocol.http.ResponseWithBody
如果后端服务器发送了
204 No Content
或 205 Reset Content
响应,但是
不符合以下 RFC 规范:
规范 |
---|
<ph type="x-smartling-placeholder"></ph> RFC 7231,第 6.3.5 节:204 无内容 |
<ph type="x-smartling-placeholder"></ph> 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 支持团队:
如果您是公有云用户,请提供以下信息:
- 组织名称
- 环境名称
- 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