<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 诊断错误,请执行以下操作:
- <ph type="x-smartling-placeholder"></ph> 以拥有的用户身份登录 Apigee Edge 界面 适当的角色。
 切换到您要在其中调查问题的单位
      - 导航至分析 >API 监控 >调查页面。
 - 选择您观察到错误的具体时间范围。
 - 您可以选择代理过滤器来缩小错误代码的范围。
 - 根据时间绘制错误代码。
 选择一个包含错误代码
protocol.http.TooBigBody的单元格, Status Code(状态代码)413,如下所示:
      错误代码
protocol.http.TooBigBody的相关信息显示为 如下所示:
      - 点击查看日志,然后展开失败请求对应的行。然后从
        Logs 窗口中,记录如下所示的详细信息:
          
未压缩
场景 1:以未压缩格式发送请求载荷
              在“日志”窗口中,请注意以下详细信息:
- 状态代码:
413 - 故障来源:
proxy - 错误代码:
protocol.http.TooBigBody。 - 请求长度(字节):
15360440(约 15 MB) 
如果故障来源的值为
proxy,即故障代码 其值为protocol.http.TooBigBody,Request Length 超过 10 MB,则表示来自客户端的 HTTP 请求包含 请求载荷大小大于 Apigee 中允许的限制。压缩后
场景 2:以压缩格式发送请求载荷
              在日志窗口中,请注意以下详细信息:
- 状态代码:
413 - 故障来源:
proxy - 错误代码:
protocol.http.TooBigBody。 - 请求长度(字节):
15264(约 15kB) 
如果故障来源的值为
proxy,即故障代码 值为protocol.http.TooBigBody,Request Length 为 小于 10 MB,则表示来自客户端的 HTTP 请求具有 请求的载荷大小小于其压缩格式允许的上限,但是 由 Apigee 解压缩时,载荷大小大于允许的限值。 - 状态代码:
 
Trace
<ph type="x-smartling-placeholder">如需使用跟踪工具诊断错误,请执行以下操作:
- 启用跟踪会话,并且
          <ph type="x-smartling-placeholder">
- </ph>
            
 - 等待发生 
413 Request Entity Too Large错误,或者 - 如果您可以重现问题,请进行 API 调用并重现问题
              
413 Request Entity Too Large个错误 
 - 等待发生 
 确保已启用显示所有流程信息。
        - 选择其中一个失败请求并检查跟踪记录。
 - 进入从客户端收到的请求阶段。
          
未压缩
场景 1:以未压缩格式发送请求载荷
                请注意以下信息:
- Content-Encoding: 不存在
 - Content-Length:
15360204 
压缩后
场景 2:以压缩格式发送请求载荷
                请注意以下信息:
- Content-Encoding:
gzip - Content-Length:
14969 - 内容类型:
application/x-gzip 
 - 浏览跟踪记录的不同阶段,并找到失败的位置。
 您会在 Request Received from from Client 阶段,如下所示:
        - 请记下跟踪记录中的错误值。上面的跟踪示例显示了以下内容:
          <ph type="x-smartling-placeholder">
- </ph>
            
 - 错误: 
Body buffer overflow - error.class::
com.apigee.errors.http.user.RequestTooLarge 
 - 错误: 
 转到 Response Sent to Client,并记下 跟踪记录。以下示例跟踪记录显示了以下内容:
- 错误: 
413 Request Entity Too Large - 错误内容:
              
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}} 
        - 错误: 
 - 进入跟踪记录中的 AX(分析的数据记录的)阶段,然后点击该阶段。
 在 Phase Details 部分中,向下滚动到 Variables Read。
        - 确定变量 client.received.content.length  的值,该值指示:
          <ph type="x-smartling-placeholder">
- </ph>
            
 - 以未压缩格式发送请求时,请求载荷的实际大小
 - Apigee 解压缩后的请求载荷的大小(当载荷为 以压缩格式发送。该值始终与允许的 上限 (10 MB)。
 
未压缩
场景 1:请求未压缩形式的载荷
                client.received.content.length 变量:
15360204压缩后
场景 2:采用压缩格式的请求载荷
                client.received.content.length 变量:
10489856 - 下表说明了 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 访问日志诊断错误,请执行以下操作:
- 如果您是私有云用户,则可以使用 NGINX 访问日志来确定
          有关 HTTP 
413错误的关键信息。 查看 NGINX 访问日志:
<ph type="x-smartling-placeholder">/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- 搜索查看在特定时间段内是否存在任何 
413错误(如果 问题是否发生过),或者是否有任何请求仍失败,413。 - 如果您确实在 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.TooBigBodyX-Apigee-fault-sourc policy请注意请求长度:
15360440(14.6 MB > 允许的上限)压缩后
场景 2:压缩格式的请求载荷大小
                以上 NGINX 访问日志中的示例条目包含以下值: X-Apigee-fault-code 和 X-Apigee-fault-code
响应标头 值 X-Apigee-fault-code protocol.http.TooBigBodyX-Apigee-fault-source policy请注意 Request Length:
15264(14.9 K < 允许的限制)在这种情况下,即使
413请求长度低于允许的上限,因为该请求可能 以压缩格式发送,且负载的大小超过 使用 Apigee Edge 进行解压缩时存在的限制。 
原因:请求载荷大小超过允许的限额
诊断
- 确定故障代码、故障来源和请求载荷大小 使用 API 监控、跟踪工具或 NGINX 访问日志观察到错误,如 情况 1(未压缩)的常见诊断步骤。
 - 如果故障来源的值为 
policy或proxy,则 表示客户端应用发送到 Apigee 的请求载荷大小大于 Apigee Edge 中允许的限制。 - 验证第 1 步中确定的请求载荷大小。
      
- 如果载荷大小 >允许的上限是 10 MB,则这就是导致错误的原因。
 - 如果载荷大小 <允许的大小上限为 10 MB,那么 负载以压缩格式传递转到 原因:解压缩后请求载荷大小超出了允许的上限
 
 - 您还可以验证请求载荷大小是否确实大于允许的上限:10 MB
      按照以下步骤检查实际请求:
      <ph type="x-smartling-placeholder">
- </ph>
        
 - 如果您无权访问客户端应用发出的实际请求,请前往 解决方法。
 - 如果您可以访问客户端应用发出的实际请求,则请执行
         操作步骤:
         <ph type="x-smartling-placeholder">
- </ph>
           
 - 验证请求中传递的载荷的大小。
 - 如果您发现有效负载的大小超过了 “允许的上限”,那么这就是问题的原因。
 
示例请求:
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。
诊断
- 确定故障代码、故障来源和请求载荷大小 了解使用 API 监控、跟踪工具或 NGINX 访问日志观察到的错误,如 常见诊断步骤与情景 2(经过压缩)。
 - 如果故障来源的值为 
policy或proxy,则 这表示客户端应用发送到 Apigee 的请求载荷大小较大 超过 Apigee Edge 中允许的限制。 - 验证第 1 步中确定的请求载荷大小。
      
- 如果载荷大小 >允许的上限是 10 MB,则这就是导致错误的原因。
 - 如果载荷大小 <允许的大小上限为 10 MB,那么 负载以压缩格式传递在这种情况下,请检查 压缩请求载荷。
 
 - 您可以验证来自客户端的请求是否以压缩格式发送,
      未压缩大小超过允许的上限,且使用了以下某一选项
      方法:
        
Trace
如需使用跟踪工具进行验证,请执行以下操作:
- 如果您已捕获失败请求的跟踪记录,请参阅
                  Trace 和
                    <ph type="x-smartling-placeholder">
- </ph>
                      
 - 确定 client.received.content.length 变量的值
 - 验证来自客户端的请求是否包含 Content-Encoding:
                        
gzip标头 
 - 如果 client.received.content.length  变量的值大于
                  10 MB、
                  <ph type="x-smartling-placeholder"></ph>
                    允许的限制和请求标头 Content-Encoding: 
gzip, ,那么这就是导致此错误的原因。 
实际请求
如需使用实际请求进行验证,请执行以下操作:
- 如果您无权访问客户端应用发出的实际请求,请前往 解决方法。
 - 如果您可以访问客户端应用发出的实际请求,则请执行
                  操作步骤:
                  <ph type="x-smartling-placeholder">
- </ph>
                   
 - 验证请求中传递的有效负载的大小,以及
                     请求中发送的 
Content-Encoding标头。 检查未压缩的载荷大小是否超过 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">- 如果您是 Private Cloud 用户,可以使用消息处理器日志来确定
      有关 HTTP 
413错误的关键信息。 检查消息处理器日志:
/opt/apigee/var/log/edge-message-processor/logs/system.log搜索以查看在特定时间段内是否存在任何
413错误(如果 过去出现的问题)或413时是否仍失败了任何请求。您可以使用以下搜索字符串:
grep -ri "chunkCount"
grep -ri "RequestTooLarge"
- 您会找到 
system.log中类似于以下内容的行 (TotalRead和chunkCount可能会因您的情况而异):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
 - 在解压缩过程中,一旦消息处理器确定
      读取字节数为 >10 MB,它会停止运行并输出以下行:
Message is too large. TotalRead 10489856 chunkCount 2570
这表示请求载荷大小超过 10 MB,并且 Apigee 会抛出 当大小开始超过 10 MB 的大小上限时,出现
<ph type="x-smartling-placeholder">RequestTooLarge错误 错误代码为protocol.http.TooBigBody 
 - 如果您已捕获失败请求的跟踪记录,请参阅
                  Trace 和
                    <ph type="x-smartling-placeholder">
 
分辨率
<ph type="x-smartling-placeholder">固定尺寸
方法 1 [推荐]:修复客户端应用,避免发送大于 允许的限额
<ph type="x-smartling-placeholder">- 分析特定客户端发送请求 / 载荷大小超出允许的原因 如限制中所定义。
 如果不合需要,请修改您的客户端应用,使其可以发送请求 / 载荷 大小小于允许的上限。
在上面讨论的示例中,您可以传递一个较小的文件, 我们假设
test5mbfile(大小为 5 MB)载荷,如下所示:curl https://<host>/testtoobigbody -k -X POST -F file=@test5mbfile -v
- 如果需要,并且您希望发送的请求/载荷超过允许的限制,请转到 接下来的选项
 
签名网址格式
选项 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 限额。
    
- 如果您是公有云用户,则请求和响应的数量上限
        载荷大小如以下文档中有关 
Request/response size的说明: Apigee Edge 限额。 - 如果您是 Private Cloud 用户 ,则可能修改了默认设置 限制请求和响应载荷大小(尽管不建议这样做)。 您可以按照 如何查看当前限制。
 
如何查看当前限制?
<ph type="x-smartling-placeholder">本部分介绍了如何验证资源是否 HTTPRequest.body.buffer.limit
  已使用新值对消息处理器进行更新。
- 在消息处理器计算机上,搜索属性
      
HTTPRequest.body.buffer.limit(位于/opt/apigee/edge-message- processor/conf目录中),并使用以下命令检查设置的值 命令:grep -ri "HTTPRequest.body.buffer.limit" /opt/apigee/edge-message-processor/conf
 - 上述命令的示例结果如下所示:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.body.buffer.limit=10m
 在上面的示例输出中,请注意属性 已在
HTTPRequest.body.buffer.limit10mhttp.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其中:ORG、ENV 和 PORT# 替换为 实际值。
- 消息处理器系统日志 
/opt/apigee/var/log/edge-message-processor/logs/system.log