<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
问题
客户端应用收到 HTTP 状态代码 502 Bad Gateway
,
错误代码 protocol.http.TooBigHeaders
作为对 API 的响应
调用。
错误消息
客户端应用将获得以下响应代码:
HTTP/1.1 502 Bad Gateway
此外,您可能还会看到以下错误消息:
{ "fault":{ "faultstring":"response headers size exceeding 25,600", "detail":{ "errorcode":"protocol.http.TooBigHeaders" } } }
可能的原因
如果目标/后端发送的标头的总大小为 0,则会出现此错误 服务器到 Apigee Edge 的响应数量超过允许的 Apigee Edge 中允许的限制。
以下是导致此错误的可能原因:
原因 | 说明 | 适用的问题排查说明 |
---|---|---|
响应中的标头大小超过允许的上限 | 特定标头的标头大小,或所有标头大小的总和 作为 HTTP 响应的一部分由目标/后端服务器发送的标头 超出了 Apigee Edge 中允许的限额。 | Edge 公有云和私有云用户 |
常见诊断步骤
使用以下工具/技术之一来诊断此错误:
API 监控
<ph type="x-smartling-placeholder">如需使用 API Monitoring 诊断错误,请执行以下操作:
- <ph type="x-smartling-placeholder"></ph> 以拥有的用户身份登录 Apigee Edge 界面 适当的角色。
切换到您要在其中调查问题的单位。
- 导航至分析 >API 监控 >调查页面。
- 选择您观察到错误的具体时间范围。
- 您可以选择代理过滤器来缩小错误代码的范围。
- 根据时间绘制错误代码。
选择错误代码为
protocol.http.TooBigHeaders
的单元格 如下所示:( 查看大图)
您将看到有关错误代码的信息
protocol.http.TooBigHeaders
,如下所示:( 查看大图)
点击查看日志,然后展开失败请求对应的行。
( 查看大图)
- 在日志窗口中,请注意以下详细信息:
<ph type="x-smartling-placeholder">
- </ph>
- 状态代码:
502
- 故障来源:
target
- 错误代码:
protocol.http.TooBigHeaders
。
- 状态代码:
- 如果 Fault Source 的值为
target
,并且 Fault 代码的值为protocol.http.TooBigHeaders
, 来自目标/ 后端服务器的 HTTP 响应的标头大小更大 超过 Apigee Edge 中允许的限制。
跟踪工具
<ph type="x-smartling-placeholder">- 启用跟踪会话
以及:
<ph type="x-smartling-placeholder">
- </ph>
- 等待发生
502 Bad Gateway
错误,或者 - 如果您可以重现问题,请进行 API 调用并重现
502 Bad Gateway
错误。
- 等待发生
- 选择其中一个失败请求并检查跟踪记录。
- 浏览跟踪记录的不同阶段并找到失败之处 错误。
通常,您会在名为 Error 的流程中看到此错误,紧跟在 请求发送到目标服务器阶段,如下所示:
( 查看大图)
请记下跟踪记录中的错误值:
- 错误:
response headers size exceeding 25,600
- error.class:
com.apigee.errors.http.server.BadGateway
这表示 Apigee Edge(消息处理器组件)会像 在收到后端服务器的响应后立即启动,因为标头大小 超出允许的上限。
- 错误:
您会在 Response Sent to Client 中看到失败。 错误响应,如下所示:
( 查看大图)
- 请记下跟踪记录中的错误值。上面的跟踪示例显示了以下内容:
<ph type="x-smartling-placeholder">
- </ph>
- 错误:
502 Bad Gateway
。 - 错误内容:
{"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
- 错误:
进入跟踪记录中的 AX(记录的 Google Analytics 数据)阶段 然后点击该图标即可查看相关详情
( 查看大图)
请注意以下项的值:
错误标头 值 X-Apigee-fault-code protocol.http.TooBigHeaders
X-Apigee-fault-source target
错误内容:正文 {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
NGINX
<ph type="x-smartling-placeholder">如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是 Private Cloud 用户,则可以使用 NGINX 访问日志
确定有关 HTTP
502 Bad Gateway
的关键信息。 查看 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中:ORG、ENV 和 PORT# 替换为实际值。
- 搜索是否存在任何
502
错误 在特定时长内返回错误代码protocol.http.TooBigHeaders
(如果问题在过去发生过)或者是否还有任何请求仍失败,502
。 如果您发现任何包含 X-Apigee-fault-code 的
502
错误 与protocol.http.TooBigHeaders
的值匹配,然后确定 X-Apigee-fault-source.NGINX 访问日志中的 502 错误示例:
以上 NGINX 访问日志中的示例条目包含以下值: X-Apigee-fault-code 和 X-Apigee-fault-code
错误标头 值 X-Apigee-fault-code protocol.http.TooBigHeaders
X-Apigee-fault-source target
原因:响应中的标头大小超过允许的上限
诊断
- 确定故障代码、故障来源和响应载荷大小 使用 API 监控、跟踪工具或 NGINX 访问日志观察到错误,如 常见的诊断步骤。
- 如果故障来源的值为
target
,则表示 目标/后端服务器发送到 Apigee 的响应包含大小更大的标头 超过 Apigee Edge 中允许的限制。 - 您可以验证来自目标/后端的响应是否具有大小为
使用以下方法之一,使其高于允许的上限:
错误消息
如需使用错误消息进行验证,请执行以下操作:
如果您有权查看从 Apigee Edge 收到的完整错误消息,则: 请参阅
faultstring
。faultstring
表示 响应标头大小超过允许的限制。示例错误消息:
"faultstring":"response headers size exceeding 25,600"
在上述错误消息中,请注意在
faultstring
中, 响应中包含的标头总大小超过允许的上限。实际请求
如需使用实际请求进行验证,请执行以下操作:
如果您可以访问对目标/后端服务器发出的实际请求, 然后执行以下步骤:
- 如果您是公有云/私有云用户,请提交申请 从后端服务器本身直接发送到后端服务器 从这里向后端发出请求 服务器。
- 如果您是 Private Cloud 用户,还可以向 从其中一个消息处理器发送到后端服务器。
- 检查从后端服务器收到的响应,尤其是 计算并验证响应中传递的标头的总大小。
如果您发现响应载荷中标头的大小 超出了 Apigee Edge 中允许的限额, 那么这就是出现问题的原因
目标服务器的响应示例:
curl -v https://TARGET_SERVER_HOST/test
* 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 /test 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-Length: 0 < Content-Type: text/plain; charset=utf-8 < Last-Modified: Tue, 20 Jul 2021 09:23:56 GMT
< Testheader1: XVlBzgba—-<snipped>---THctcuAx < Testheader2: hxKQFDaFpLSj—-<snipped>---FbcXoEFfRsWxP
< Date: Fri, 23 Jul 2021 09:51:22 GMT < * Connection #0 to host 10.1.0.10 left intact在上面的示例中,
Testheader1
和Testheader2
的大小较高 因为该错误超出了允许的上限 Apigee Edge。
消息处理器日志
如需使用消息处理器日志进行验证,请执行以下操作:
<ph type="x-smartling-placeholder">如果您是私有云用户,则可以使用消息处理器日志 验证响应标头大小是否超过了 Apigee Edge 中允许的限制。
检查消息处理器日志:
/opt/apigee/var/log/edge-message-processor/logs/system.log
- 搜索特定期间是否存在任何
502
错误 持续时间(如果问题在过去发生过)或者是否有任何请求, 仍然失败并显示502
。您可以使用以下搜索字符串:grep -ri "response headers size exceeding"
- 您会找到
system.log
中类似于以下内容的行。 响应标头大小可能会因您的情况而异:2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1 messageid:r23ijb1b-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:3.7.1.1:9000 Local:192.168.2.1:56098]@8414 useCount=1 bytesRead=0 bytesWritten=207 age=640ms lastIO=0ms isOpen=true.onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: response headers size exceeding 25,600 2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1 messageid:r23ijb1b-1 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError (HTTPResponse@31f3ef88, response headers size exceeding 25,600)
-
消息处理器从后端/目标获得响应后 发现标头的总大小超过 25 KB, 它会停止运行并抛出错误:
response headers size exceeding 25,600
这表示总标头大小超过 25 KB,并且 Apigee 在大小开始超过 25 KB 的限制时抛出错误,并提供错误代码 名称:
protocol.http.TooBigHeaders
分辨率
固定尺寸
方法 1 [推荐]:修复目标服务器应用,使其不发送标头大小 超过 Apigee 限额
<ph type="x-smartling-placeholder">- 分析特定目标服务器发送更多响应标头的原因 超过限制中定义的允许限制。
- 如果您不希望这样,请修改您的后端服务器应用,使其只发送 大小小于允许的上限 Apigee Edge。
- 检查是否可以将标头信息作为响应正文的一部分发送。
- 如果可以,请发送您计划作为内容的一部分发送的大量信息 响应正文中的标头。这样可以确保您不会超出 标头限制。
CwC
方法 2:使用 CwC 属性提高响应标头大小限制
<ph type="x-smartling-placeholder">Apigee 提供了一种 CwC 属性,以允许它提高响应标头大小限制。 有关详情,请参阅 <ph type="x-smartling-placeholder"></ph> 配置消息处理器的限制
<ph type="x-smartling-placeholder">限制
Apigee 要求客户端应用和后端服务器不会发送 标头大小超过了说明所允许的上限 对于 中的请求/响应标头大小 Apigee Edge 限制。
- 如果您是公有云用户,则 请求和响应标头大小与请求/响应标头大小 Apigee Edge 限额。
- 如果您是 Private Cloud 用户 ,则可能已经修改了默认上限 限制请求和响应标头大小(尽管不建议这样做)。 要确定响应标头的大小上限,请按照 如何查看当前限制。
如何查看当前限制?
<ph type="x-smartling-placeholder">
本部分介绍了如何验证属性 HTTPResponse.headers.limit
已在消息处理器上使用新值进行更新。
- 在消息处理器计算机上,搜索属性
HTTPResponse.headers.limit
在/opt/apigee/edge-message-processor/conf
目录,然后检查 如下所示:grep -ri "HTTPResponse.headers.limit" /opt/apigee/edge-message-processor/conf
- 上述命令的示例结果如下所示:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.headers.limit=25k
在上面的示例输出中,请注意属性
HTTPResponse.headers.limit
已在http.properties
中使用值25k
设置。这表示 Apigee for Private 中配置的响应载荷大小限制 Cloud 存储空间为 25 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
其中:ORG、ENV 和 PORT# 替换为 实际值。
- 消息处理器系统日志
/opt/apigee/var/log/edge-message-processor/logs/system.log