502 网关无效 - ResponseWithBody

您正在查看 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 Content205 Reset Content,但它包含响应 正文 和/或以下一个或多个标头,则会发生此错误:

  • Content-Length
  • Content-Encoding
  • Transfer-Encoding

根据规范 RFC 7231 第 6.3.5 节:204 无内容 RFC 7231 第 6.3.6 节:205 重置内容,源服务器不应将任何其他内容 作为响应载荷正文的一部分发送,并返回状态代码 204 No Content205 Reset Content。响应标头 (例如 Content-LengthContent-EncodingTransfer-Encoding)表示响应载荷的大小、类型或格式。

因此,在以下情况下,Apigee Edge 会向客户端返回 502 Bad Gateway 状态代码,并返回错误代码 protocol.http.ResponseWithBody

后端服务器返回的状态代码
后端服务器返回的响应包含 204 No Content 205 Reset Content
响应正文 错误 错误

Content-Length 标头

(设置为非零值)

错误 错误

Content-Encoding

(设置为 Apigee Edge 中支持的编码

错误 无错误
Transfer-Encoding 错误 错误

以下是造成此错误的可能原因:

原因 说明 适用的问题排查说明
后端服务器返回的 204 响应包含响应正文或标头 后端服务器发送 204 No Content205 Reset Content 响应,其中包含响应正文和/或一个或多个标头 Content-TypeContent-EncodingTransfer-Encoding Edge Public 和 Private Cloud 用户

常见诊断步骤

请使用以下工具/方法之一来诊断此错误:

API 监控

如需使用 API 监控诊断错误,请执行以下操作:

  1. 以具有 适当角色的用户身份登录 Apigee Edge 界面。
  2. 切换到您要调查问题的组织。

  3. 依次前往 Analyze > API Monitoring > Investigate 页面。
  4. 选择您观察到错误的具体时间范围。
  5. 绘制故障代码时间 的关系图。
  6. 选择包含故障代码 protocol.http.ResponseWithBody 的单元格,如下所示:

    查看放大图片

  7. 您将看到有关故障代码 protocol.http.ResponseWithBody 的信息,如下所示:

    查看放大图片

  8. 点击 View logs ,然后展开失败请求对应的行。

    ( 查看放大图片)

  9. Logs 窗口中,记下以下详细信息:
    • 状态代码502
    • 故障来源target
    • 故障代码protocol.http.ResponseWithBody
  10. 如果故障来源 的值为 target,且故障代码 的值为 protocol.http.ResponseWithBody,则表示发生错误的原因是后端服务器发送了 204 No Content205 Reset Content 状态代码,其中包含响应正文和/或“可能的原因”部分中提及的某个标头。

Trace 工具

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

  1. 启用跟踪会话 然后执行以下任一操作:
    1. 等待 502 Bad Gateway 错误发生。或
    2. 如果您可以重现此问题,请进行 API 调用并重现 502 Bad Gateway 错误。
  2. 确保已启用显示所有 FlowInfo

  3. 选择一个失败的请求,然后检查跟踪记录。
  4. 浏览跟踪记录的不同阶段,找到发生失败的位置 。
  5. 您通常会在 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
  6. 在跟踪记录中前往 AX (记录的分析数据)阶段 然后点击该阶段。
  7. 向下滚动到 Phase Details(阶段详细信息)、Error Headers(错误标头)部分,然后 确定 X-Apigee-fault-codeX-Apigee-fault-source 的值,如下所示:

    查看放大图片

  8. 请注意,X-Apigee-fault-codeX-Apigee-fault-source 的值分别为 are protocol.http.ResponseWithBodytarget。 这表示发生错误的原因是后端服务器发送了 204 No Content205 Reset Content 状态代码,其中包含 响应正文和/或“可能的原因”中提及的某个标头。
    错误
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

NGINX

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

  1. 如果您是 Private Cloud 用户,则可以使用 NGINX 访问日志来 确定有关 HTTP 502 Bad Gateway 的关键信息。
  2. 检查 NGINX 访问日志:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中ORGENVPORT# 将替换为实际值。

  3. 搜索以查看在特定时间段内(如果问题过去发生过)是否存在任何错误代码为 protocol.http.ResponseWithBody502 错误,或者是否存在任何请求仍然失败并返回 502
  4. 如果您确实发现任何 502 错误,且 X-Apigee-fault-codeprotocol.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
  5. 请注意,X-Apigee-fault-codeX-Apigee-fault-source 的值分别为 protocol.http.ResponseWithBodytarget。 这表示发生错误的原因是后端服务器发送了 204 No Content205 Reset Content 状态代码,其中包含 响应正文和/或“可能的原因”中提及的某个标头。

原因:后端服务器返回的 204 响应包含响应正文或标头

诊断

  1. 使用 API 监控、Trace 工具或 NGINX 访问日志确定观察到的错误的故障代码故障来源 ,如常见诊断步骤中所述。
  2. 如果故障代码protocol.http.ResponseWithBody,且 故障来源 的值为 target,则表示后端 服务器返回了 204 No Content205 Reset Content 状态 代码,其中包含响应正文和/或“可能的原因”中提及的某个标头。
  3. 如需验证后端服务器是否确实发送了响应载荷正文和/或一个 或多个“可能的原因”中提及的标头,您可以 执行以下步骤:

    1. 如果您是 Public Cloud 用户,并且可以直接从任何系统向 后端服务器发出相同的 API 请求。

    2. 如果您是 Private Cloud 用户,则可以直接从与观察到失败的特定 组织和环境关联的某个消息处理器向 后端服务器发出相同的 API 请求。
    3. 查看从后端服务器收到的响应,并验证该响应是否包含一个 响应载荷正文和/或上述一个或多个标头。如果是,则会导致此错误。

      示例 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.

    4. 在上述所有示例中,后端服务器发送了 204 No Content205 Reset Content 状态代码,其中包含响应正文和/或“可能的原因”中提及的某个标头。
    5. 因此,Apigee Edge 发送了 502 Bad Gateway 状态代码,并返回错误代码 protocol.http.ResponseWithBody

分辨率

确保后端服务器在向 Apigee Edge 发送 204 No Content205 Reset Content 响应时,始终遵循规范 RFC 7231 第 6.3.6 节:205 重置内容。也就是说,后端服务器 不得 将以下内容作为 204 No Content205 Reset Content 响应的一部分发送:

  1. 响应载荷正文
  2. 以及以下任何标头:
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

规范

如果后端服务器发送 204 No Content205 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 Content205 Reset Content 状态代码,而不包含响应正文和任何 标头(Content-LengthContent-EncodingTransfer-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

    其中ORGENVPORT# 将替换为 实际值。

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