您正在查看的是 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
根据
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 重置内容 |
响应正文 | 错误 | 错误 |
(设置为非零值) |
错误 | 错误 |
(设置为 Apigee Edge 中支持的编码) |
错误 | 无错误 |
Transfer-Encoding |
错误 | 错误 |
以下是导致此错误的可能原因:
原因 | 说明 | 适用的问题排查说明 |
---|---|---|
从后端服务器返回 204 响应的响应正文或标头 | 后端服务器发送包含响应正文和/或一个或多个标头 Content-Type 、Content-Encoding 或 Transfer-Encoding 的 204 No Content 或 205 Reset Content 响应。 |
Edge 公有云和私有云用户 |
常见诊断步骤
使用以下工具/技巧之一来诊断此错误:
API 监控
要使用 API Monitoring 诊断错误,请执行以下操作:
- 以拥有 适当角色的用户身份 登录 Apigee Edge 界面。
切换到您要调查问题的组织。
- 前往 Analyze > API Monitoring > Investigate 页面。
- 选择您发现错误的具体时间范围。
- 根据时间绘制故障代码。
选择具有错误代码
protocol.http.ResponseWithBody
的单元格,如下所示:( 查看大图)
您将看到有关错误代码
protocol.http.ResponseWithBody
的信息,如下所示:( 查看大图)
点击查看日志,然后展开失败请求所在的行。
( 查看大图)
- 在日志窗口中,请注意以下详细信息:
- 状态代码:
502
- 错误来源:
target
- 错误代码:
protocol.http.ResponseWithBody
。
- 状态代码:
- 如果故障来源的值为
target
且故障代码的值为protocol.http.ResponseWithBody
,则表示发生了错误,因为后端服务器发送了204 No Content
或205 Reset Content
状态代码以及可能的原因部分中提及的其中一个标头。
跟踪工具
如需使用跟踪工具诊断错误,请执行以下操作:
- 启用跟踪会话,并执行以下任一操作:
- 等待
502 Bad Gateway
错误发生。或者 - 如果您可以重现问题,请进行 API 调用并重现
502 Bad Gateway
错误。
- 等待
确保已启用 Show all FlowInfos:
- 选择其中一个失败的请求并检查跟踪记录。
- 浏览跟踪记录的不同阶段,并找到发生故障的位置。
通常,您可以在
flowinfo
Error 中的 Request sent to target server 阶段之后找到该错误,如下所示:情景 #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(已记录的 Analytics 数据)阶段并点击该阶段。
向下滚动到 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.ResponseWithBody
X-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
。 如果您确实发现 X-Apigee-fault-code 与
protocol.http.ResponseWithBody
的值匹配的任何502
错误,请确定 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 监控、Trace 工具或 NGINX 访问日志确定观察到的错误的故障代码和故障来源。
- 如果 Fault Code 为
protocol.http.ResponseWithBody
,并且 Fault Source 的值为target
,这表示后端服务器已使用204 No Content
或205 Reset Content
状态代码进行响应,并显示响应正文和/或可能的原因中提到的其中一个标头。 如需验证后端服务器是否确实发送了响应载荷正文和/或可能的原因中提到的一个或多个标头,您可以执行以下步骤:
如果您是公有云用户,并且可以直接从您的任何系统向后端服务器发出相同的 API 请求。
- 如果您是私有云用户,则可以直接从与观察到失败的特定组织和环境关联的某个消息处理器向后端服务器发出相同的 API 请求。
查看从后端服务器收到的响应,并验证它是否包含响应载荷正文和/或上述一个或多个标头。如果是,就是导致此错误的原因。
示例 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
。
分辨率
在向 Apigee Edge 发送 204 No Content
或 205 Reset Content
响应时,确保后端服务器始终遵循规范
RFC 7231 第 6.3.6 节:205 重置内容。也就是说,后端服务器不得将以下内容作为 204 No Content
或 205 Reset Content
响应的一部分发送:
- 响应载荷正文
- 以及以下任意标头:
Content-Length
Content-Encoding
Transfer-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 重置内容 |
需要注意的要点
建议的解决方案是修复后端服务器,以发送不含响应正文和任何标头(Content-Length
、Content-Encoding
和 Transfer-Encoding
)的 204 No Content
和 205 Reset Content
状态代码,并遵循
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