502 网关无效 - TooBigLine

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

问题

客户端应用收到 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 的响应行大小超过 Apigee Edge 中允许的最大限制,就会发生此错误。

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

了解响应行

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

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

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

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

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

了解响应行大小

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

    HTTP/1.1 200 OK
    

    此响应行大小为 ~15 bytes,因为它包含 15 ASCII characters。由于这未超出 Apigee Edge 允许的限制,因此 Apigee Edge 会将响应发回给客户端,而不会出现任何错误。

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

了解大型响应行

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

  1. 目标/后端服务器不是 HTTP 系统。它可能以非 HTTP 响应的形式做出响应。
  2. 目标/后端服务器出现问题,并在 HTTP 响应中发送较长的响应行。

如需了解详情,请参阅 获取错误协议 http.TooBigLine, "response line size than 2,048

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

原因 说明 适用的问题排查说明
响应行大小超出允许的上限 目标/后端服务器在向 Apigee Edge 发出的 HTTP 响应中发送的 Response-Line 大小超过 Apigee Edge 中允许的限制 Edge 公有云和私有云用户

常见诊断步骤

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

API 监控

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

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

  3. 前往 Analyze > API Monitoring > Investigate 页面。
  4. 选择您发现错误的具体时间范围。
  5. 您可以选择 Proxy(代理)过滤器以缩小错误代码的范围。
  6. 根据时间绘制故障代码
  7. 选择具有错误代码 protocol.http.TooBigLine 的单元格,如下所示:

    查看大图

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

    查看大图

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

  10. 日志窗口中,请注意以下详细信息:
    • 状态代码502
    • 错误来源target
    • 错误代码protocol.http.TooBigLine
  11. 如果故障来源的值为 target故障代码的值为 protocol.http.TooBigLine,则表示来自目标/ 后端服务器的 HTTP 响应的响应行大小大于 Apigee Edge 中允许的最大限制

跟踪工具

  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.classcom.apigee.errors.http.server.BadGateway

    这表示 Apigee Edge(消息处理器组件)会在收到来自后端服务器的响应后立即因响应行大小超出允许的限制而抛出错误。

  5. 您会在响应发送到客户端阶段看到发送到客户端的错误消息,如下所示:

    查看大图

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

    查看大图

    请注意以下值:

    请求标头
    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

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

  3. 搜索以查看在特定持续时间内是否存在任何 502 错误(如果问题是在过去发生的),或者是否有任何请求仍然失败并显示 502
  4. 如果您确实发现 X-Apigee-fault-code X-Apigee-fault-code 的值匹配的任何 502 错误,则确定 X-Apigee-fault-code 的值。

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

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

原因:响应行大小超出允许的上限

诊断

  1. 按照常见诊断步骤中所述,使用 API 监控、Trace 工具或 NGINX 访问日志确定观察到的错误的故障代码故障来源
  2. 如果故障来源的值为 target,则表示目标/后端服务器应用发送到 Apigee 的响应行大小超过 Apigee Edge 中允许的限制
  3. 您可以使用以下方法之一验证响应行大小是否已超过允许的 2 KB 限制:

    错误消息

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

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

    示例错误消息:

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

    上述 faultstring 表示响应行大小超过允许的 2 KB 限制。

    实际请求

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

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

    1. 验证响应行的大小
    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
      

      在上例中,响应行 HTTP/1.1 200 1111…<trimmed>...11111111 大于 2 KB,即包含超过 2 K 的 ASCII 字符。

      如果您使用的是其他客户端,则可以查看客户端日志并尝试确定发送到 Apigee Edge 的响应行的大小。

    消息处理器日志

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

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

    1. 使用 API 监控、跟踪工具或 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 表示响应行大小超过 2 KB。因此,Apigee Edge 会抛出异常,并向客户端应用返回包含错误代码 protocol.http.TooBigline 502 状态代码。

分辨率

修正尺寸

方法 1 [推荐]:修复目标/后端服务器应用,使其不发送大小超过允许限制的响应行

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

CwC

方法 2:使用 CwC 属性提高响应行限制

Apigee 提供了 CwC 属性,可用于提高响应行大小限制。如需了解详情,请参阅 在消息处理器上设置响应行限制

限制

Apigee 要求客户端应用和后端服务器不会发送大小超过 Apigee Edge 限制请求/响应行限制中规定的允许限制的请求/响应行。

  1. 如果您是公有云用户,则请求和响应行大小的上限如 Apigee Edge 限制请求/响应行大小中所述。
  2. 如果您是 Private Cloud 用户 ,则可能修改了请求和响应行大小的默认上限(尽管不建议这样做)。您可以按照如何查看当前限制中的说明确定响应行大小上限。

如何查看当前的上限?

本部分介绍如何验证属性 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. 在上面的示例输出中,请注意 HTTPResponse.line.limit 属性已设置为 http.properties 中的 2k 值。

    这表示在 Apigee 中,针对私有云配置的响应行大小上限为 2 KB

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

必须收集的诊断信息

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

如果您是公有云用户,请提供以下信息:

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

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

  • 观察到失败请求的完整错误消息
  • 组织名称
  • 环境名称
  • API 代理软件包
  • 失败 API 请求的跟踪文件
  • 完成用于重现 502 错误的 curl 命令
  • NGINX 访问日志 /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

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

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