413 请求实体过大 - TooBigBody

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

问题

客户端应用收到 HTTP 状态代码 413 Request Entity Too Large (错误代码为 protocol.http.TooBigBody )作为对 API 调用的响应。

错误消息

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

HTTP/1.1 413 Request Entity Too Large

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

{
   "fault":{
      "faultstring":"Body buffer overflow",
      "detail":{
         "errorcode":"protocol.http.TooBigBody"
      }
   }
}

可能的原因

如果客户端应用发送到 Apigee Edge 的载荷大小是 HTTP 请求大于 Apigee Edge 中允许的限制

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

原因 说明 适用的问题排查说明
请求载荷大小大于允许的上限 客户端应用作为 HTTP 请求的一部分发送到 Apigee Edge 的载荷大小为 超过 Apigee Edge 中允许的限额。 Edge 公有云和私有云用户
请求载荷大小超出允许的上限 解压缩 客户端应用作为 HTTP 的一部分以压缩格式发送的载荷大小 由 Apigee Edge 解压缩后,发送给 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.TooBigBody 的单元格, Status Code(状态代码)413,如下所示:

  8. 错误代码 protocol.http.TooBigBody 的相关信息显示为 如下所示:

  9. 点击查看日志,然后展开失败请求对应的行。然后从 Logs 窗口中,记录如下所示的详细信息:

    未压缩

    场景 1:以未压缩格式发送请求载荷

    在“日志”窗口中,请注意以下详细信息:

    • 状态代码413
    • 故障来源proxy
    • 错误代码protocol.http.TooBigBody
    • 请求长度(字节)15360440(约 15 MB)

    如果故障来源的值为 proxy,即故障代码 其值为 protocol.http.TooBigBodyRequest Length 超过 10 MB,则表示来自客户端的 HTTP 请求包含 请求载荷大小大于 Apigee 中允许的限制

    压缩后

    场景 2:以压缩格式发送请求载荷

    日志窗口中,请注意以下详细信息:

    • 状态代码413
    • 故障来源proxy
    • 错误代码protocol.http.TooBigBody
    • 请求长度(字节)15264(约 15kB)

    如果故障来源的值为 proxy,即故障代码 值为 protocol.http.TooBigBodyRequest Length 为 小于 10 MB,则表示来自客户端的 HTTP 请求具有 请求的载荷大小小于其压缩格式允许的上限,但是 由 Apigee 解压缩时,载荷大小大于允许的限值。

Trace

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

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

  1. 启用跟踪会话,并且 <ph type="x-smartling-placeholder">
      </ph>
    • 等待发生 413 Request Entity Too Large 错误,或者
    • 如果您可以重现问题,请进行 API 调用并重现问题 413 Request Entity Too Large 个错误
  2. 确保已启用显示所有流程信息

  3. 选择其中一个失败请求并检查跟踪记录。
  4. 进入从客户端收到的请求阶段。

    未压缩

    场景 1:以未压缩格式发送请求载荷

    请注意以下信息:

    • Content-Encoding: 不存在
    • Content-Length15360204

    压缩后

    场景 2:以压缩格式发送请求载荷

    请注意以下信息:

    • Content-Encodinggzip
    • Content-Length14969
    • 内容类型application/x-gzip
  5. 浏览跟踪记录的不同阶段,并找到失败的位置。
  6. 您会在 Request Received from from Client 阶段,如下所示:

  7. 请记下跟踪记录中的错误值。上面的跟踪示例显示了以下内容: <ph type="x-smartling-placeholder">
      </ph>
    • 错误Body buffer overflow
    • error.class:com.apigee.errors.http.user.RequestTooLarge
  8. 转到 Response Sent to Client,并记下 跟踪记录。以下示例跟踪记录显示了以下内容:

    • 错误413 Request Entity Too Large
    • 错误内容{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  9. 进入跟踪记录中的 AX(分析的数据记录的)阶段,然后点击该阶段。
  10. Phase Details 部分中,向下滚动到 Variables Read

  11. 确定变量 client.received.content.length 的值,该值指示: <ph type="x-smartling-placeholder">
      </ph>
    • 以未压缩格式发送请求时,请求载荷的实际大小
    • Apigee 解压缩后的请求载荷的大小(当载荷为 以压缩格式发送。该值始终与允许的 上限 (10 MB)。
    。 <ph type="x-smartling-placeholder">

    未压缩

    场景 1:请求未压缩形式的载荷

    client.received.content.length 变量:15360204

    压缩后

    场景 2:采用压缩格式的请求载荷

    client.received.content.length 变量:10489856

  12. 下表说明了 Apigee 为何会在下方返回 413 错误 两种情形(根据 client.received.content.length 变量的值):
    场景 client.received.content.length 的值 失败原因
    未压缩格式的请求载荷 约 15 MB 大小 >允许的大小上限为 10 MB。
    压缩格式的请求载荷 约 10 MB

    解压缩时超出大小限制

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

NGINX

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

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

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

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

    <ph type="x-smartling-placeholder">
  3. 搜索查看在特定时间段内是否存在任何 413 错误(如果 问题是否发生过),或者是否有任何请求仍失败, 413
  4. 如果您确实在 X-Apigee-fault-code 匹配项中找到了任何 413 错误, protocol.http.TooBigBody 的值,然后确定 X-Apigee-fault-source.

    未压缩

    场景 1:未压缩格式的请求载荷大小

    上述 NGINX 访问日志中的示例条目包含 X-Apigee-fault-code X-Apigee-fault-code 的以下值:

    响应标头
    X-Apigee-fault-code protocol.http.TooBigBody
    X-Apigee-fault-sourc policy

    请注意请求长度15360440(14.6 MB > 允许的上限)

    压缩后

    场景 2:压缩格式的请求载荷大小

    以上 NGINX 访问日志中的示例条目包含以下值: X-Apigee-fault-code X-Apigee-fault-code

    响应标头
    X-Apigee-fault-code protocol.http.TooBigBody
    X-Apigee-fault-source policy

    请注意 Request Length: 15264(14.9 K < 允许的限制)

    在这种情况下,即使413 请求长度低于允许的上限,因为该请求可能 以压缩格式发送,且负载的大小超过 使用 Apigee Edge 进行解压缩时存在的限制。

原因:请求载荷大小超过允许的限额

诊断

  1. 确定故障代码故障来源请求载荷大小 使用 API 监控、跟踪工具或 NGINX 访问日志观察到错误,如 情况 1(未压缩)的常见诊断步骤
  2. 如果故障来源的值为 policyproxy,则 表示客户端应用发送到 Apigee 的请求载荷大小大于 Apigee Edge 中允许的限制
  3. 验证第 1 步中确定的请求载荷大小
  4. 您还可以验证请求载荷大小是否确实大于允许的上限:10 MB 按照以下步骤检查实际请求: <ph type="x-smartling-placeholder">
      </ph>
    1. 如果您无权访问客户端应用发出的实际请求,请前往 解决方法
    2. 如果您可以访问客户端应用发出的实际请求,则请执行 操作步骤: <ph type="x-smartling-placeholder">
        </ph>
      1. 验证请求中传递的载荷的大小。
      2. 如果您发现有效负载的大小超过了 “允许的上限”,那么这就是问题的原因。
      3. 示例请求

        curl http://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile -v
        

        在上述示例中,文件 test15mbfile 约为 15 MB。如果您 正在使用某个其他客户端,请获取客户端日志以了解发送的载荷大小。

分辨率

转到分辨率

原因:解压缩后请求载荷大小超出了允许的限值

请求载荷是否以压缩格式和请求标头发送 Content-Encoding 设置为 gzip, Apigee 解压缩请求 载荷。在解压缩过程中,如果 Apigee 发现负载较大 超过 10 MB, <ph type="x-smartling-placeholder"></ph> 超过允许的限值,则它会停止进一步解压缩,并返回响应, 立即显示 413 Request Entity Too Large,并显示错误代码 protocol.http.TooBigBody

诊断

  1. 确定故障代码故障来源请求载荷大小 了解使用 API 监控、跟踪工具或 NGINX 访问日志观察到的错误,如 常见诊断步骤与情景 2(经过压缩)。
  2. 如果故障来源的值为 policyproxy,则 这表示客户端应用发送到 Apigee 的请求载荷大小较大 超过 Apigee Edge 中允许的限制
  3. 验证第 1 步中确定的请求载荷大小
    • 如果载荷大小 >允许的上限是 10 MB,则这就是导致错误的原因。
    • 如果载荷大小 <允许的大小上限为 10 MB,那么 负载以压缩格式传递在这种情况下,请检查 压缩请求载荷。
  4. 您可以验证来自客户端的请求是否以压缩格式发送, 未压缩大小超过允许的上限,且使用了以下某一选项 方法:

    Trace

    如需使用跟踪工具进行验证,请执行以下操作:

    1. 如果您已捕获失败请求的跟踪记录,请参阅 Trace 和 <ph type="x-smartling-placeholder">
        </ph>
      1. 确定 client.received.content.length 变量的值
      2. 验证来自客户端的请求是否包含 Content-Encoding: gzip 标头
    2. 如果 client.received.content.length 变量的值大于 10 MB、 <ph type="x-smartling-placeholder"></ph> 允许的限制和请求标头 Content-Encoding: gzip, ,那么这就是导致此错误的原因。

    实际请求

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

    1. 如果您无权访问客户端应用发出的实际请求,请前往 解决方法
    2. 如果您可以访问客户端应用发出的实际请求,则请执行 操作步骤: <ph type="x-smartling-placeholder">
        </ph>
      1. 验证请求中传递的有效负载的大小,以及 请求中发送的 Content-Encoding 标头。
      2. 检查未压缩的载荷大小是否超过 Apigee Edge 中的允许限制

        示例请求

        curl https://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile.gz -H "Content-Encoding: gzip" -v
        

        在上例中,文件 test15mbfile.gz 小于大小限制; 不过,未压缩文件 test15mbfile 的大小约为 15 MB, Content-Encoding 标头为 gzip

        如果您使用的是其他客户端,请获取客户端日志以了解载荷大小 并且 Content-Encoding 标头设为 gzip

    消息处理器日志

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

    <ph type="x-smartling-placeholder">
    1. 如果您是 Private Cloud 用户,可以使用消息处理器日志来确定 有关 HTTP 413 错误的关键信息。
    2. 检查消息处理器日志:

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

    3. 搜索以查看在特定时间段内是否存在任何 413 错误(如果 过去出现的问题)或 413 时是否仍失败了任何请求。

      您可以使用以下搜索字符串:

      grep -ri "chunkCount"
      
      grep -ri "RequestTooLarge"
      
    4. 您会找到 system.log 中类似于以下内容的行 (TotalReadchunkCount 可能会因您的情况而异):
      2021-07-06 13:29:57,544  NIOThread@1 ERROR HTTP.SERVICE -
        TrackingInputChannel.checkMessageBodyTooLarge()
        : Message is too large.  TotalRead 10489856 chunkCount 2570
      
      2021-07-06 13:29:57,545  NIOThread@1 INFO  HTTP.SERVICE -
        ExceptionHandler.handleException()
        : Exception trace: com.apigee.errors.http.user.RequestTooLarge
        : Body buffer overflow
      
    5. 在解压缩过程中,一旦消息处理器确定 读取字节数为 >10 MB,它会停止运行并输出以下行:
      Message is too large.  TotalRead 10489856 chunkCount 2570
      

      这表示请求载荷大小超过 10 MB,并且 Apigee 会抛出 当大小开始超过 10 MB 的大小上限时,出现 RequestTooLarge 错误 错误代码为 protocol.http.TooBigBody

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

分辨率

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

固定尺寸

方法 1 [推荐]:修复客户端应用,避免发送大于 允许的限额

<ph type="x-smartling-placeholder"> <ph type="x-smartling-placeholder">
    </ph>
  1. 分析特定客户端发送请求 / 载荷大小超出允许的原因 如限制中所定义。
  2. 如果不合需要,请修改您的客户端应用,使其可以发送请求 / 载荷 大小小于允许的上限。

    在上面讨论的示例中,您可以传递一个较小的文件, 我们假设 test5mbfile(大小为 5 MB)载荷,如下所示:

    curl https://<host>/testtoobigbody -k -X POST -F file=@test5mbfile -v
    

  3. 如果需要,并且您希望发送的请求/载荷超过允许的限制,请转到 接下来的选项

签名网址格式

选项 2 [推荐]:在 Apigee JavaCallout 中使用签名网址格式

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

对于超过 10 MB 的载荷,Apigee 建议在 如示例中的 <ph type="x-smartling-placeholder"></ph> GitHub 上的 Edge Callout: Signed 网址 Generator 示例。

流式

方法 3:使用流式传输

如果您的 API 代理需要处理非常大的请求和/或响应,则可启用 在 Apigee 中进行流式处理

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

CwC

方法 4:使用 CwC 属性提高缓冲区限制

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

仅当您无法使用任何推荐选项时,才应使用该选项, 会导致性能问题。

Apigee 提供了 CwC 属性,可用于提高 请求和响应载荷大小限制。如需了解详情,请参阅 <ph type="x-smartling-placeholder"></ph> 在路由器或消息处理器上设置邮件大小限制

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

限制

Apigee 要求客户端应用和后端服务器发送的载荷大小不得超过 为 Request/response size 记录的允许限制 Apigee Edge 限额

  1. 如果您是公有云用户,则请求和响应的数量上限 载荷大小如以下文档中有关 Request/response size 的说明: Apigee Edge 限额
  2. 如果您是 Private Cloud 用户 ,则可能修改了默认设置 限制请求和响应载荷大小(尽管不建议这样做)。 您可以按照 如何查看当前限制

如何查看当前限制?

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

本部分介绍了如何验证资源是否 HTTPRequest.body.buffer.limit 已使用新值对消息处理器进行更新。

  1. 在消息处理器计算机上,搜索属性 HTTPRequest.body.buffer.limit(位于 /opt/apigee/edge-message- processor/conf 目录中),并使用以下命令检查设置的值 命令:
    grep -ri "HTTPRequest.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. 上述命令的示例结果如下所示:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.body.buffer.limit=10m
    
  3. 在上面的示例输出中,请注意属性 已在HTTPRequest.body.buffer.limit10m http.properties

    这表示在 Apigee for Private 中配置的请求载荷大小限制 Cloud 存储空间为 10 MB

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

必须收集的诊断信息

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

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

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

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

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