502 网关无效 - TooBigLine

您正在查看 Apigee Edge 文档。
前往 Apigee X 文档。
info

问题

客户端应用收到 HTTP 状态代码 502 Bad Gateway,错误代码为 protocol.http.TooBigLine ,以此响应 API 调用。

出错提示

客户端应用获取以下响应代码:

HTTP/1.1 502 Bad Gateway

此外,您可能会看到以下错误消息:

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

可能的原因

如果目标/后端服务器作为 HTTP 响应的一部分发送到 Apigee Edge 的 Response-Line 大小大于 Apigee Edge 中允许的最大 限制,则会发生此错误。

在我们了解此错误的可能原因之前,先了解 Response-Line 的含义以及如何检查其大小。

了解 Response-Line

典型的 HTTP 响应由三部分组成:

  1. 状态行(在 Apigee 中称为 Response-Line )
  2. (一组 HTTP 标头)
  3. [ 正文 ]

Response-Line 由三部分组成:协议版本 ,后跟数字 状态代码 及其关联的文本短语 ,如下所示:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

当目标/后端服务器应用发送 HTTP 响应时,发送的第一行表示如上所述的 Response-Line。接下来是 标头和响应正文/载荷。以下示例屏幕截图显示了一个典型的 curl 请求、请求 部分和响应 部分(以及 Response-Line)。

了解 Response-Line 大小

  1. 在上面讨论的示例中,响应中的起始行(第一行)也 称为Response-Line,如下所示:

    HTTP/1.1 200 OK

    此 Response-Line 的大小为 ~15 bytes,因为它包含 15 ASCII characters。由于此大小在 Apigee Edge 中 允许的限制范围内,因此 Apigee Edge 会将响应发送回客户端,而不会出现任何 错误。

  2. 同样,如果您查看上面显示的 错误消息中的 faultstring,它包含 "response line size exceeding 2,048"。这表示目标/后端服务器发送的 HTTP 响应中的 Response-Line 超过了 2,048 字节。

了解大型 Response-Line

根据 状态行(此处称为 Response-Line )的定义以及典型的 HTTP 请求和 响应,大小将远小于 Apigee Edge 中定义的默认限制 2 K, 因此我们可能不会 达到该限制。不过,在以下情况下,您可能会超出此限制:

  1. 目标/后端服务器不是 HTTP 系统。它可能会使用非 HTTP 响应进行响应。
  2. 目标/后端服务器存在问题,并发送一个较长的 Response-Line 作为 HTTP 响应的一部分。

如需了解详情,请参阅 获取错误 protocol.http.TooBigLine,“response line size exceeding 2,048”。

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

原因 说明 适用的问题排查说明
Response-Line 大小大于允许的限制 目标/后端服务器作为 HTTP 响应的一部分发送到 Apigee Edge 的 Response-Line 大小大于 Apigee Edge 中允许的限制 Edge Public 和 Private Cloud 用户

常见诊断步骤

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

API 监控

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

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

  3. 依次前往 Analyze > API Monitoring > Investigate 页面。
  4. 选择您观察到错误的具体时间范围。
  5. 您可以选择 Proxy 过滤条件来缩小故障代码的范围。
  6. 绘制 Fault Code 与 Time 的关系图。
  7. 选择包含故障代码 protocol.http.TooBigLine 的单元格,如下所示:

    ( 查看放大图片)

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

    ( 查看放大图片)

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

  10. 在 Logs 窗口中,记下以下详细信息:
    • 状态代码: 502
    • 故障来源: target
    • 故障代码: protocol.http.TooBigLine。
  11. 如果 Fault Source 的值为 target,且 Fault Code 的值为 protocol.http.TooBigLine,则表示来自目标/ 后端服务器的 HTTP 响应的 Response-Line 大小大于 Apigee Edge 中允许的最大 限制。

Trace 工具

  1. 启用跟踪会话 然后执行以下任一操作:
    1. 等待 502 Bad Gateway 错误发生。或
    2. 如果您可以重现问题,请进行 API 调用并重现 502 Bad Gateway 错误。
  2. 选择一个失败的请求,然后检查跟踪记录。
  3. 浏览跟踪记录的不同阶段,找到发生失败的位置 。
  4. 您通常会在 flowinfo Error 之后的 Request sent to target server 阶段中找到错误,如下所示:

    记下跟踪记录中的错误值:

    • 错误: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

    这表示 Apigee Edge(消息处理器组件)在收到后端服务器的响应后立即抛出错误,原因是 Response-Line 大小超出了允许的限制。

  5. 您会在 Response Sent to Client 阶段看到发送给客户端的错误消息,如下所示:

    ( 查看放大图片)

  6. 记下跟踪记录中的错误值:
    • 错误: 502 Bad Gateway。
    • 错误内容: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. 您还可以前往跟踪记录中的 AX (记录的分析数据)阶段 然后点击该阶段以查看错误详情。

    ( 查看放大图片)

    记下以下值:

    请求标头 值
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    错误内容:正文 {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

NGINX

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

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

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

    其中: ORG、ENV 和 PORT# 将替换为实际值。

  3. 搜索以查看在特定时间段内(如果问题发生在过去)是否存在任何 502 错误,或者是否存在任何请求仍然失败并返回 502。
  4. 如果您确实发现任何 502 错误,且 X-Apigee-fault-code 与 protocol.http.TooBigLine的值匹配,请确定 X-Apigee-fault-source的值。

    NGINX 访问日志中的上述示例条目具有以下 X- Apigee-fault-code 和 X-Apigee-fault-source: 值:

    响应标头 值
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target

原因:Response-Line 大小大于允许的限制

诊断

  1. 使用 API 监控、Trace 工具或 NGINX 访问日志确定观察到的错误的 Fault Code 和 Fault Source ,如常见诊断步骤中所述。
  2. 如果 Fault Source 的值为 target,则表示目标/后端服务器应用发送到 Apigee 的 Response-Line 大小大于 Apigee Edge 中允许的限制。
  3. 您可以使用以下方法之一验证 Response-Line 大小是否超过了 2 KB 的允许限制:

    出错提示

    如需使用错误消息进行验证,请执行以下操作:

    如果您有权访问从 Apigee Edge 收到的完整错误消息,请参阅 faultstring。

    示例错误消息:

    "faultstring":"response line size exceeding 2,048"

    上面的 faultstring 表示 Response-Line 大小超出了 2 KB 的允许限制。

    实际请求

    如需使用实际请求进行验证,请执行以下操作:

    如果您有权访问向目标/后端服务器 应用发出的实际请求,请执行以下步骤:

    1. 验证 Response-Line 的大小
    2. 如果您发现 URI 的大小超过了 Apigee Edge 中允许的限制,则这是导致问题的原因。

      来自目标/后端服务器的示例响应:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0

      在上述情况下,Response-Line HTTP/1.1 200 1111…<trimmed>...11111111 大于 2 KB,也就是说,它包含 超过 2 K 个 ASCII 字符。

      如果您使用的是其他客户端,可以查看客户端日志,并尝试 找出发送到 Apigee Edge 的 Response-Line 的大小。

    消息处理器日志

    如需使用消息处理器日志进行验证,请执行以下操作:

    如果您是 Private Cloud 用户,则可以使用消息处理器日志来 验证 Response-Line 大小是否超出了 Apigee Edge 中允许的限制。

    1. 使用 API 监控、Trace 工具、 或 NGINX 访问日志确定失败请求的消息 ID,如常见诊断步骤中所述。
    2. 在消息处理器日志中搜索消息 ID:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. 您会找到类似于以下内容的 system.log 中的行:

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)

      上述错误消息中的文本 message = response line size exceeding 2,048 表示 Response-Line 大小超过 2 KB。因此,Apigee Edge 会抛出异常,并向客户端应用返回 502 状态代码,故障代码为 protocol.http.TooBigline 。

分辨率

修复大小

选项 1 [推荐]:修复目标/后端服务器应用,使其不发送 大小大于允许限制的 Response-Line

  1. 分析特定客户端发送大小超过 限制中所定义允许限制的 Response-Line 的原因。
  2. 如果不需要,请修改目标/后端服务器应用,使其 发送大小小于允许限制的 Response-Line。
  3. 如果需要,并且您想要发送大小超过 允许限制的 Response-Line,请转到下一个选项。

CwC

选项 2:使用 CwC 属性来增加 Response-Line 限制

Apigee 提供了一个 CwC 属性,允许其增加 Response-Line 大小限制。 如需了解详情,请参阅 在消息处理器上设置 Response-Line 限制。

限制

Apigee 希望客户端应用和后端服务器不要发送大小大于 Apigee Edge 限制中请求/响应行限制 中记录的允许限制的请求/响应行。

  1. 如果您是 Public Cloud 用户 ,则请求和响应行大小的最大限制如 Apigee Edge 限制 中请求/响应行大小 中记录的那样。
  2. 如果您是 Private Cloud 用户, 则可能已修改请求和响应行大小的默认最大 限制(即使这不是推荐的做法)。 您可以按照 如何查看当前限制中的说明确定 Response-Line 大小的最大限制。

如何查看当前限制?

本部分介绍如何验证 HTTPResponse.line.limit 属性是否已在消息处理器上更新为新值。

  1. 在消息处理器机器上,在 /opt/apigee/edge-message-processor/conf 目录中搜索属性 HTTPResponse.line.limit,并检查已设置的值,如下所示:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. 上述命令的示例结果如下所示:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
  3. 在上面的示例输出中,请注意 http.properties 中已将 HTTPResponse.line.limit 属性设置为值 2k。

    这表示为 Apigee for Private Cloud 配置的 Response-Line 大小限制为 2 KB。

如果您仍然需要 Apigee 支持团队的任何帮助,请参阅 必须收集诊断信息。

必须收集的诊断信息

收集以下诊断信息,然后与 Apigee Edge 支持团队联系:

如果您是 Public Cloud 用户,请提供以下信息:

  • 组织名称
  • 环境名称
  • API 代理名称
  • 用于重现 502 错误的完整 curl 命令
  • API 请求的跟踪文件

如果您是 Private Cloud 用户,请提供以下信息:

  • 针对失败请求观察到的完整错误消息
  • 组织名称
  • 环境名称
  • API 代理软件包
  • 失败的 API 请求的跟踪文件
  • 用于重现 502 错误的完整 curl 命令
  • 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