502 网关无效 - ResponseWithBody

您正在查看的是 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 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 重置内容
响应正文 错误 错误

Content-Length 标头

(设置为非零值)

错误 错误

Content-Encoding

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

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

以下是导致此错误的可能原因:

原因 说明 适用的问题排查说明
从后端服务器返回 204 响应的响应正文或标头 后端服务器发送包含响应正文和/或一个或多个标头 Content-TypeContent-EncodingTransfer-Encoding204 No Content205 Reset Content 响应。 Edge 公有云和私有云用户

常见诊断步骤

使用以下工具/技巧之一来诊断此错误:

API 监控

要使用 API Monitoring 诊断错误,请执行以下操作:

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

  3. 前往 Analyze > API Monitoring > Investigate 页面。
  4. 选择您发现错误的具体时间范围。
  5. 根据时间绘制故障代码
  6. 选择具有错误代码 protocol.http.ResponseWithBody 的单元格,如下所示:

    查看大图

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

    查看大图

  8. 点击查看日志,然后展开失败请求所在的行。

    查看大图

  9. 日志窗口中,请注意以下详细信息:
    • 状态代码502
    • 错误来源target
    • 错误代码protocol.http.ResponseWithBody
  10. 如果故障来源的值为 target故障代码的值为 protocol.http.ResponseWithBody,则表示发生了错误,因为后端服务器发送了 204 No Content205 Reset Content 状态代码以及可能的原因部分中提及的其中一个标头。

跟踪工具

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

  1. 启用跟踪会话,并执行以下任一操作:
    1. 等待 502 Bad Gateway 错误发生。或者
    2. 如果您可以重现问题,请进行 API 调用并重现 502 Bad Gateway 错误。
  2. 确保已启用 Show all FlowInfos

  3. 选择其中一个失败的请求并检查跟踪记录。
  4. 浏览跟踪记录的不同阶段,并找到发生故障的位置。
  5. 通常,您可以在 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
  6. 进入跟踪记录中的 AX(已记录的 Analytics 数据)阶段并点击该阶段。
  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. 如果您确实发现 X-Apigee-fault-codeprotocol.http.ResponseWithBody 的值匹配的任何 502 错误,请确定 X-Apigee-fault-source 的值。

    NGINX 访问日志中的 502 错误示例

    NGINX 访问日志中的上述示例条目具有 X- Apigee-fault-codeX-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. 如果 Fault Codeprotocol.http.ResponseWithBody,并且 Fault Source 的值为 target,这表示后端服务器已使用 204 No Content205 Reset Content 状态代码进行响应,并显示响应正文和/或可能的原因中提到的其中一个标头。
  3. 如需验证后端服务器是否确实发送了响应载荷正文和/或可能的原因中提到的一个或多个标头,您可以执行以下步骤:

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

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

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

    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 重置内容

需要注意的要点

建议的解决方案是修复后端服务器,以发送不含响应正文和任何标头(Content-LengthContent-EncodingTransfer-Encoding)的 204 No Content205 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

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

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