502 网关无效 - TooBigLine

<ph type="x-smartling-placeholder"></ph> 您正在查看 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"
      }
   }
}

可能的原因

如果 Response-Line 大小是由 目标/后端服务器迁移到 Apigee HTTP 响应中的边缘大于允许的上限 Apigee Edge 中的限制

在我们了解可能导致此错误的原因之前,我们先了解一下 以及如何检查其大小。

了解响应行

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

  1. <ph type="x-smartling-placeholder"></ph> 状态行(在 Apigee 中称为响应行)
  2. ( HTTP 标头集 )
  3. [正文 ]

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

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

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

了解响应行大小

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

    HTTP/1.1 200 OK
    

    此响应行的大小为 ~15 bytes,因为它包含 15 ASCII characters。由于这是在 允许的上限,系统会将响应发送回客户端, 错误。

  2. 同样,如果您在faultstring 如上所示的错误消息,其中包含 "response line size exceeding 2,048"。这表示 HTTP 响应中的 Response-Line 超过 2,048 个字节。

了解大型响应行

根据 <ph type="x-smartling-placeholder"></ph> 状态行(此处称为响应行)和典型的 HTTP 请求和 那么此大小将远小于 Apigee Edge 中定义的默认上限 (2 K), 因此 上限。不过,在下面一些情况下,您可能会超出此限制:

  1. 目标/后端服务器不是 HTTP 系统。它可能会以非 HTTP 响应进行响应 响应。
  2. 目标/后端服务器出现问题,并作为 HTTP 的一部分发送较长的响应行 响应。

有关详情,请参见 <ph type="x-smartling-placeholder"></ph> 收到错误协议.http.TooBigLine,“响应行大小超过 2,048”。

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

原因 说明 适用的问题排查说明
响应行大小超过允许的限制 作为 对 Apigee Edge 的 HTTP 响应大于 Apigee Edge 中允许的限制 Edge 公有云和私有云用户

常见诊断步骤

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

API 监控

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

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

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

  3. 导航至分析 >API 监控 >调查页面。
  4. 选择您观察到错误的具体时间范围。
  5. 您可以选择代理过滤器来缩小错误代码的范围。
  6. 根据时间绘制错误代码
  7. 选择错误代码为protocol.http.TooBigLine的单元格 如下所示:

    ( 查看大图

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

    ( 查看大图

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

  10. 日志窗口中,请注意以下详细信息: <ph type="x-smartling-placeholder">
      </ph>
    • 状态代码502
    • 故障来源target
    • 错误代码protocol.http.TooBigLine
  11. 如果 Fault Source 的值为 target,并且 Fault 代码的值为 protocol.http.TooBigLine, 来自目标/ 后端服务器的 HTTP 响应的响应行大小大于 Apigee Edge 中允许的上限

跟踪工具

<ph type="x-smartling-placeholder">
  1. 启用跟踪会话 以及: <ph type="x-smartling-placeholder">
      </ph>
    1. 等待发生 502 Bad Gateway 错误。或
    2. 如果您可以重现问题,请进行 API 调用并重现 502 Bad Gateway 错误。
  2. 选择其中一个失败请求并检查跟踪记录。
  3. 浏览跟踪记录的不同阶段并找到失败之处 错误。
  4. 通常,您会在 flowinfo 错误发送到目标服务器阶段之后,如下所示:

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

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

    这表示 Apigee Edge(消息处理器组件)会像 收到后端服务器的响应后立即启动,因为响应行大小 超出允许的上限。

  5. 您会在 Response Sent to Client 阶段,如下所示:

    ( 查看大图

  6. 请记下跟踪记录中的错误值: <ph type="x-smartling-placeholder">
      </ph>
    • 错误502 Bad Gateway
    • 错误内容{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. 您也可以进入跟踪记录中的“AX”(记录的 Google Analytics 数据)阶段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

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

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

  1. 如果您是私有云用户,则可以使用 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 的 502 错误 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

原因:响应行大小超过允许的限制

诊断

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

    错误消息

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

    如果您有权查看从 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,即包含 超过 2000 个 ASCII 字符。

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

    消息处理器日志

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

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

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

    1. 使用 API 监控、跟踪工具、 或 NGINX 访问日志(如常见诊断步骤中所述)。
    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 会抛出异常并返回 502 状态代码, 错误代码 protocol.http.TooBigline

分辨率

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

固定尺寸

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

<ph type="x-smartling-placeholder">
  1. 分析特定客户端发送更多大小的响应行的原因 超过限制中定义的允许限制。
  2. 如果您不希望这样,请修改目标/后端服务器应用, 会发送一个大小小于允许限制的响应行。
  3. 如果需要,并且您希望发送的响应行的大小超过 请转到下一个选项。

CwC

选项 2:使用 CwC 属性提高响应行限制

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

Apigee 提供了 CwC 属性提高其响应行大小限制。 有关详情,请参阅 <ph type="x-smartling-placeholder"></ph> 设置消息处理器的响应行限制

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

限制

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

  1. 如果您是公有云用户,则请求和 响应行大小记录中请求/响应行大小Apigee Edge 限额
  2. 如果您是 Private Cloud 用户 ,则可能已经修改了默认上限 限制请求和响应行大小(尽管我们不推荐这样做)。 要确定最大响应行大小限制,请按照 如何查看当前限制

如何查看当前限制?

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

本部分介绍了如何验证属性 HTTPResponse.line.limit 已在消息处理器上使用新值进行更新。

  1. 在消息处理器计算机上,搜索属性 HTTPResponse.line.limit/opt/apigee/edge-message-processor/conf 目录,然后检查 如下所示:
    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 for Private 中配置的响应行大小限制 Cloud 存储空间为 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