502 网关无效 - ResponseWithBody

<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 Content205 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 Content205 Reset Content。响应标头 例如 Content-LengthContent-EncodingTransfer-Encoding 表示响应载荷的大小、类型或格式。

因此,Apigee Edge 会返回 502 Bad Gateway 状态代码, 将错误代码 protocol.http.ResponseWithBody 传递到客户端,如下所示 情况:

来自后端服务器的状态代码
来自后端服务器的响应包含 204 No Content 205 重置内容
响应正文 错误 错误

Content-Length 标头

(设置为非零)

错误 错误

Content-Encoding

(设置为 <ph type="x-smartling-placeholder"></ph> Apigee Edge 中支持的编码

错误 没有错误
Transfer-Encoding 错误 错误
<ph type="x-smartling-placeholder">

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

原因 说明 适用的问题排查说明
来自后端服务器的响应正文或包含 204 响应的标头 后端服务器发送 204 No Content205 Reset Content 带有响应正文和/或一个或多个标头 Content-Type 的响应, Content-EncodingTransfer-Encoding Edge 公有云和私有云用户

常见诊断步骤

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

API 监控

<ph type="x-smartling-placeholder">

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

  1. <ph type="x-smartling-placeholder"></ph> 以拥有用户身份登录 Apigee Edge 界面 适当的角色。
  2. 切换到您要在其中调查问题的单位。

  3. 导航至分析 >API 监控 >调查页面。
  4. 选择您观察到错误的具体时间范围。
  5. 根据时间绘制错误代码。 <ph type="x-smartling-placeholder">
  6. 选择错误代码为protocol.http.ResponseWithBody的单元格 如下所示:

    ( 查看大图

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

    ( 查看大图

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

    ( 查看大图

  9. 日志窗口中,请注意以下详细信息: <ph type="x-smartling-placeholder">
      </ph>
    • 状态代码502
    • 故障来源target
    • 错误代码protocol.http.ResponseWithBody
  10. 如果 Fault Source 的值为 target,并且 Fault 代码的值为 protocol.http.ResponseWithBody,则代码 表示发生了错误,因为后端服务器发送了 204 No Content205 Reset Content 状态代码, 响应正文和/或 可能的原因部分。

跟踪工具

<ph type="x-smartling-placeholder">

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

  1. 启用跟踪会话 以及: <ph type="x-smartling-placeholder">
      </ph>
    1. 等待发生 502 Bad Gateway 错误。或
    2. 如果您可以重现问题,请进行 API 调用并重现 502 Bad Gateway 错误。
  2. 确保已启用 Show all FlowInfos

  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(记录的 Google Analytics 数据)阶段 然后点击它
  7. 向下滚动到阶段详情错误标头部分,然后 确定 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

<ph type="x-smartling-placeholder">

如需使用 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. 搜索是否存在任何带有错误代码的 502 错误 在特定时间段内protocol.http.ResponseWithBody (如果问题在过去发生过)或者是否还有任何请求仍失败, 502
  4. 如果您确实在 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
  5. 请注意,X-Apigee-fault-codeX-Apigee-fault-source 的值 分别为 protocol.http.ResponseWithBodytarget。 这表示发生了错误,因为后端服务器发送了 204 No Content205 Reset Content 状态代码, 响应正文和/或可能的原因中提到的某个标头。

原因:响应正文或标头收到后端服务器返回 204 响应

诊断

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

    1. 如果您是公有云用户,并且可以向 从任何系统直接运行后端服务器

      <ph type="x-smartling-placeholder">
    2. 如果您是私有云用户,则可以向 从与指定服务器关联的某个消息处理器中 发现故障的组织和环境。
    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 Content 或 带有响应正文和/或某个标头的 205 Reset Content 状态代码 请参阅可能的原因部分。
    5. 因此,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 Content205 Reset Content 响应:

  1. 响应载荷正文
  2. 以及以下任意标头: <ph type="x-smartling-placeholder">
      </ph>
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

规范

Apigee Edge 会返回 502 Bad Gateway 状态代码和错误代码 protocol.http.ResponseWithBody如果后端服务器发送了 204 No Content205 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 Content205 Reset Content 状态代码,但没有响应正文和任何 标头 - Content-LengthContent-EncodingTransfer-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

    其中ORGENVPORT# 替换为 实际值。

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