<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
问题
客户端应用收到 HTTP 状态代码 502 Bad Gateway
和错误代码
protocol.http.TooBigBody
作为 API 调用的响应。
错误消息
客户端应用将获得以下响应代码:
HTTP/1.1 502 Bad Gateway
此外,您可能还会看到以下错误消息:
{ "fault":{ "faultstring":"Body buffer overflow", "detail":{ "errorcode":"protocol.http.TooBigBody" } } }
可能的原因
如果目标/后端服务器将载荷大小作为一部分发送到 Apigee Edge,就会出现此错误 HTTP 响应数超过 Apigee Edge 中允许的限额。
以下是导致此错误的可能原因:
原因 | 说明 | 适用的问题排查说明 |
---|---|---|
响应载荷大小大于允许的上限 | 作为对 Apigee 的 HTTP 响应的一部分,目标/后端服务器发送的载荷大小为 超过 Apigee 中允许的限制。 | Edge 公有云和私有云用户 |
响应的有效负载量超过允许的上限后, 解压缩 | 目标/后端服务器作为 HTTP 的一部分以压缩格式发送的载荷大小 由 Apigee 解压缩后,对 Apigee 的响应数量会超过允许的限值。 | Edge 公有云和私有云用户 |
常见诊断步骤
使用以下工具/技术之一来诊断此错误:
API 监控
<ph type="x-smartling-placeholder">如需使用 API Monitoring 诊断错误,请执行以下操作:
- <ph type="x-smartling-placeholder"></ph> 以拥有的用户身份登录 Apigee Edge 界面 适当的角色。
切换到您要在其中调查问题的单位。
- 导航至分析 >API 监控 >调查页面。
- 选择您观察到错误的具体时间范围。
- 您可以选择代理过滤器来缩小错误代码的范围。
- 根据时间绘制错误代码。
选择错误代码为
protocol.http.TooBigBody
的单元格 如下所示:您将看到有关错误代码的信息
protocol.http.TooBigBody
,如下所示:点击查看日志,然后展开失败请求对应的行。
- 在“日志”窗口中,请注意以下详细信息:
<ph type="x-smartling-placeholder">
- </ph>
- 状态代码:
502
- 故障来源:
target
- 错误代码:
protocol.http.TooBigBody
。
- 状态代码:
- 如果故障来源的值为
target
和故障代码 值为protocol.http.TooBigBody
,则表示 HTTP 来自目标/ 后端服务器的响应的响应载荷大小大于 Apigee Edge 中允许的限制。
Trace
<ph type="x-smartling-placeholder">如需使用跟踪工具诊断错误,请执行以下操作:
- 启用跟踪会话并执行以下操作之一:
<ph type="x-smartling-placeholder">
- </ph>
- 等待发生
502 Bad Gateway
错误,或者 - 如果您可以重现问题,请进行 API 调用并重现问题
502 Bad Gateway
个错误。
- 等待发生
- 选择其中一个失败请求并检查跟踪记录。
- 浏览跟踪记录的不同阶段,并找到失败的位置。
跳至 Response received from target(从目标接收到的响应)后的阶段 Error(错误) 服务器阶段,如下所示:
请记下跟踪记录中的错误值:
- 错误:
Body buffer overflow
- error.class:
com.apigee.errors.http.server.BadGateway
这表示 Apigee Edge(消息处理器组件)会在 由于载荷大小超过允许的 上限。
- 错误:
您将在响应已发送至客户端阶段看到失败情况,如下所示:
- 请记下跟踪记录中的错误值。上面的跟踪示例显示了以下内容:
<ph type="x-smartling-placeholder">
- </ph>
- 错误:
502 Bad Gateway
- 错误内容:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- 错误:
请根据不同的情况进入从目标服务器收到的响应阶段(如下所示):
未压缩
场景 1:以未压缩形式发送的响应载荷
请记下跟踪记录中的错误值:
- 从目标服务器收到的响应:
200 OK
- Content-Length(来自响应标头部分):约 11MB
压缩后
场景 2:以压缩格式发送请求载荷
请记下跟踪记录中的错误值:
- 从目标服务器收到的响应:
200 OK
- Content-Encoding:如果您在响应标头中看到此标头
部分中,记下其值。例如,在此示例中,该值为
gzip
。
- 从目标服务器收到的响应:
请注意 Response Content 部分下的 Body:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
<ph type="x-smartling-placeholder">进入跟踪记录中的 AX(分析的数据记录的)阶段,然后点击该阶段 查看相关详情。
- 在阶段详情中,向下滚动到变量读取部分,并确定
target.received.content.length
的值,这表明:- 以未压缩格式发送的响应负载和
- Apigee 解压缩后的响应载荷的大小(当载荷为 以压缩格式发送。该值始终与允许的 上限 (10 MB)。
未压缩
场景 1:以未压缩形式发送的响应载荷
请记下 target.received.content.length 的值:
请求标头 值 target.received.content.length 约 11 MB 压缩后
场景 2:以压缩格式发送请求载荷
请记下 target.received.content.length 的值:
请求标头 值 target.received.content.length 约 10 MB 下表说明了 Apigee 为何会在下方返回
502
错误 两种情形(根据 target.received.content.length 的值):场景 target.received.content.length 的值 失败原因 未压缩格式的响应载荷 约 11 MB 大小 >允许的上限为 10 MB 压缩格式的响应载荷 约 10 MB 解压缩时超出大小限制
<ph type="x-smartling-placeholder">
NGINX
<ph type="x-smartling-placeholder">如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是私有云用户,则可以使用 NGINX 访问日志来确定
有关 HTTP
502
错误的关键信息。 查看 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中:ORG、ENV 和 PORT# 替换为实际值。
- 搜索以查看在特定时间段内是否存在任何
502
错误(如果 问题是否发生过),或者是否有任何请求仍失败,502
。 - 如果您确实在 X-Apigee-fault-code 匹配项中找到了任何
502
错误, 求protocol.http.TooBigBody
的值,然后确定 X-Apigee-fault-source.NGINX 访问日志中的 502 错误示例:
以上 NGINX 访问日志中的示例条目包含 X-Apigee- fault-code 和 X-Apigee-fault-source:
响应标头 值 X-Apigee-fault-code protocol.http.TooBigBody
X-Apigee-fault-source target
原因:响应载荷大小超过允许的限制
诊断
- 确定应用的故障代码、故障来源和响应载荷大小 使用 API 监控、跟踪工具或 NGINX 访问日志观察到的错误,如 常见诊断步骤(情景 1)。
- 如果故障来源的值为
target
,则表示响应 目标/后端服务器发送到 Apigee 的载荷大小大于 Apigee Edge 中允许的限制。 - 验证第 1 步确定的响应载荷大小。
- 如果载荷大小 >允许的上限是 10 MB,则这就是导致错误的原因。
- 如果载荷大小上限约为 10 MB,则响应 负载以压缩格式传递转到 原因:响应的有效负载量超出解压缩后允许的上限。
- 验证响应载荷大小确实是 >通过查看
进行实际响应:
<ph type="x-smartling-placeholder">
- </ph>
- 如果您无权访问向目标/后端服务器发出的实际请求, 然后找到分辨率。
- 如果您可以访问对目标/后端服务器发出的实际请求,那么
请执行以下步骤:
<ph type="x-smartling-placeholder">
- </ph>
- 如果您是公有云/私有云用户,请直接向 从后端服务器本身访问后端服务器, 可以向后端服务器发出请求。
- 如果您是 Private Cloud 用户,也可以向 从某个消息处理器中返回后端服务器。
- 通过检查 Content-Length 标头。
- 如果您发现有效负载的大小 Apigee Edge 中允许的限制,则这就是导致 问题。
来自后端服务器的示例响应:
curl -v https://BACKENDSERVER-HOSTNAME/testfile
* About to connect() to 10.14.0.10 port 9000 (#0) * Trying 10.14.0.10... * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0) > GET /testfile HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.14.0.10:9000 > Accept: */* > < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Length: 11534336 < Content-Type: application/octet-stream < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT < Date: Wed, 30 Jun 2021 09:22:41 GMT < ----snipped---- <Response Body>
在上面的示例中,您可以看到
Content-Length: 11534336 (which is ~11 MB)
是导致此错误的原因,因为它超出了 Apigee Edge 中允许的限制。
分辨率
请参阅解决方法。
原因:响应负载大小超出允许的限值 解压缩
如果响应载荷以压缩格式和响应标头发送
Content-Encoding
设置为 gzip,
Apigee 解压缩响应
载荷。在解压缩过程中,如果 Apigee 发现负载较大
超过 Apigee Edge 中允许的限制,则进一步停止
解压缩并立即响应
(代码为 502 Bad Gateway
且错误代码为 protocol.http.TooBigBody
)。
诊断
- 确定应用的故障代码、故障来源和响应载荷大小 使用 API 监控、跟踪工具或 NGINX 访问日志观察到的错误,如 常见诊断步骤(适用于情景 2)。
- 如果故障来源的值为
target
,则表示 目标/后端应用发送到 Apigee 的响应载荷大小大于 Apigee Edge 中允许的限制。 - 验证第 1 步确定的响应载荷大小。
- 如果载荷大小 >允许的上限是 10 MB,则这就是导致错误的原因。
- 如果载荷大小允许的上限约 10 MB,则响应载荷可能会 以压缩格式传递。在本例中,请检查压缩包的未压缩大小 响应载荷。
- 您可以验证来自目标/后端的响应是否以压缩格式发送,
使用以下某一条件,未压缩的大小超出了允许的限值
方法:
Trace
使用跟踪工具:
- 如果您已捕获失败请求的跟踪记录,请参阅
Trace 和
<ph type="x-smartling-placeholder">
- </ph>
- 确定 target.received.content.length 的值
- 验证来自客户端的请求是否包含
Content-Encoding:
gzip
标头
- 如果 target.received.content.length 的值在允许的 10 MB 左右
限制和响应标头 Content-Encoding:
gzip
,也就是 导致出现此错误的原因。
实际请求
使用实际请求:
- 如果您无权访问向目标/后端服务器发出的实际请求, 然后找到分辨率。
- 如果您可以访问对目标/后端服务器发出的实际请求,那么
请执行以下步骤:
<ph type="x-smartling-placeholder">
- </ph>
- 验证响应中传递的有效负载的大小,以及
响应中发送的
Content-Encoding
标头。 - 如果您发现响应标头
Content-Encoding
设置为gzip
,并且载荷的未压缩大小超过了 Apigee Edge 中允许的上限,则会导致 出错。从后端服务器收到的响应示例:
curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
* About to connect() to 10.1.0.10 port 9000 (#0) * Trying 10.1.0.10... * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0) > GET /testzippedfile.gz HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.1.0.10:9000 > Accept: */* > < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Encoding: gzip < Content-Type: application/x-gzip < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT < Testheader: test < Date: Wed, 07 Jul 2021 10:14:16 GMT < Transfer-Encoding: chunked < ----snipped---- <Response Body>
在上述情况下,系统会发送标头
Content-Encoding: gzip
, 响应中文件testzippedfile.gz
的大小小于 未超过上限,但是未压缩文件testzippedfile
的大小为 约 15 MB。
- 验证响应中传递的有效负载的大小,以及
响应中发送的
消息处理器日志
使用消息处理器日志:
<ph type="x-smartling-placeholder">- 如果您是 Private Cloud 用户,可以使用消息处理器日志
确定有关 HTTP
502
错误的关键信息。 检查消息处理器日志
/opt/apigee/var/log/edge-message-processor/logs/system.log
搜索查看在特定时间段内是否存在任何
502
错误 (如果问题在过去发生过)或者是否还有任何请求仍失败,502
。您可以使用以下搜索字符串:grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- 您会找到
system.log
中与以下内容类似的行 (TotalRead
和chunkCount
可能会因您的情况而异):2021-07-07 09:40:47,012 NIOThread@7 ERROR HTTP.SERVICE - TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large. TotalRead 10489856 chunkCount 2571 2021-07-07 09:40:47,012 NIOThread@7 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155 useCount=1 bytesRead=0 bytesWritten=182 age=23ms lastIO=0ms isOpen=true).onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: Body buffer overflow 2021-07-07 09:40:47,012 NIOThread@7 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@77cbd7c4, Body buffer overflow)
在解压缩过程中,一旦消息处理器确定 总读取字节数为 >10 MB,它会停止运行并输出以下行:
Message is too large. TotalRead 10489856 chunkCount 2571
这表示响应载荷大小超过 10 MB,且 Apigee 会在大小开始超过 10 MB 限值时抛出错误,错误代码为
<ph type="x-smartling-placeholder">protocol.http.TooBigBody
- 如果您已捕获失败请求的跟踪记录,请参阅
Trace 和
<ph type="x-smartling-placeholder">
分辨率
固定尺寸
方法 1 [推荐]:修复目标服务器应用,使其不发送超过 Apigee 限制的载荷大小
<ph type="x-smartling-placeholder">- 分析特定目标服务器发送响应的原因 / 载荷大小 超过了 中定义的允许的上限 限制。
- 如果您不希望这样,请修改目标服务器应用,使其只发送 响应 / 载荷大小小于允许的上限。
- 如果需要,并且您希望发送的响应/载荷超过允许的数量, 限制,请转到下一个选项。
签名网址格式
选项 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 提供了 <ph type="x-smartling-placeholder"></ph> 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">
本部分介绍了如何验证
“HTTPResponse.body.buffer.limit
”已更新为消息中的新值
处理器。
在消息处理器计算机上,搜索属性
HTTPResponse.body.buffer.limit
(位于/opt/apigee/edge-message- processor/conf
目录中),然后检查已设置的值,如下所示:grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
上述命令的示例结果如下所示:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
在上面的示例输出中,请注意属性 已在
HTTPResponse.body.buffer.limit
10m
http.properties
。这表示 Apigee 中针对 私有云的大小为 10 MB。
如果您仍然需要 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
其中:ORG、ENV 和 PORT# 替换为 实际值。
- 消息处理器系统日志
/opt/apigee/var/log/edge-message-processor/logs/system.log