<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.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 进行解压缩时存在的限制。
原因:请求载荷大小超过允许的限额
诊断
- 确定故障代码、故障来源和请求载荷大小 使用 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"> <ph type="x-smartling-placeholder">- </ph>
- 分析特定客户端发送请求 / 载荷大小超出允许的原因 如限制中所定义。
如果不合需要,请修改您的客户端应用,使其可以发送请求 / 载荷 大小小于允许的上限。
在上面讨论的示例中,您可以传递一个较小的文件, 我们假设
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.limit
10m
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
其中:ORG、ENV 和 PORT# 替换为 实际值。
- 消息处理器系统日志
/opt/apigee/var/log/edge-message-processor/logs/system.log