<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
问题
客户端应用收到 HTTP 状态代码 431 Request Header Fields Too
Large
以及错误代码 protocol.http.TooBigHeaders
作为对 API 的响应
调用。
错误消息
客户端应用将获得以下响应代码:
HTTP/1.1 431 Request Header Fields Too Large
此外,您可能还会看到以下错误消息:
{ "fault":{ "faultstring":"request headers size exceeding 25,600", "detail":{ "errorcode":"protocol.http.TooBigHeaders" } } }<ph type="x-smartling-placeholder">
可能的原因
如果客户端应用发送到 的所有请求标头的总大小 作为 HTTP 请求的一部分,Apigee Edge 的长度大于 Apigee Edge 中允许的限制,请参阅 <ph type="x-smartling-placeholder"></ph> RFC 6585,第 5 部分:431 请求标头字段过大。
以下是导致此错误的可能原因:
原因 | 说明 | 适用的问题排查说明 |
---|---|---|
请求标头大小超过允许的限制 | 客户端应用程序作为 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.TooBigHeaders
的单元格并 状态代码431
,如下所示:( 查看大图)
您将看到有关错误代码
protocol.http.TooBigHeaders
的信息 如下所示:( 查看大图)
点击查看日志,然后展开失败请求对应的行:
( 查看大图)
在日志窗口中,请注意以下详细信息:
- 状态代码:
431
- 故障来源:
apigee
- 错误代码:
protocol.http.TooBigHeaders
。 - 请求长度(字节):
32150 (> 25 KB)
- 状态代码:
- 如果故障来源的值为
apigee
或MP
,则 错误代码的值为protocol.http.TooBigHeaders
和 请求长度超过 25 KB,则表示 由客户端应用作为 HTTP 请求的一部分发送的所有请求标头 相较于 允许的上限。 <ph type="x-smartling-placeholder">
跟踪工具
<ph type="x-smartling-placeholder">NGINX
<ph type="x-smartling-placeholder">如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是 Private Cloud 用户,则可以使用 NGINX 访问日志
确定有关 HTTP
431
错误的关键信息。 查看 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中:ORG、ENV 和 PORT# 替换为实际值。
- 搜索查看在特定时间段内是否存在任何
431
错误 (如果问题在过去发生过)或者是否还有任何请求仍失败,431
。 如果您发现任何包含 X-Apigee-fault-code 的
431
错误 与protocol.http.TooBigHeaders
的值匹配,然后确定 X-Apigee-fault-source.以上 NGINX 访问日志中的示例条目包含以下值: X-Apigee-fault-code 和 X-Apigee-fault-code
响应标头 值 X-Apigee-fault-code protocol.http.TooBigHeaders
X-Apigee-fault-source MP
请注意请求长度:
40159
(40 KB 大于 25 KB, Apigee Edge 中请求标头允许的限制)在上面的示例日志条目中,X-Apigee-fault-source 的值为
<ph type="x-smartling-placeholder">apigee
或MP
,X-Apigee-fault-code 的值为protocol.http.TooBigHeaders
且请求长度为 40 KB, 超过 Apigee 中允许的限制 - 25 KB。这清楚地表明 客户端应用作为 HTTP 的一部分发送的所有请求标头的总大小 请求超出了 Apigee Edge 中允许的 25 KB 的限制。
原因:请求标头大小超过允许的上限
诊断
- 确定错误代码、错误来源和请求长度大小 使用 API Monitoring 或 NGINX 访问日志观察到错误,如 常见的诊断步骤。
- 如果故障来源的值为
apigee
或MP
, 错误代码 的值为protocol.http.TooBigHeaders
, 请求长度超过 25 KB,则此 表示客户端应用发送到 Apigee 的请求大小大于 Apigee Edge 中允许的限制。 - 您可以使用以下任一方法验证请求标头大小是否已超过允许的 25 KB 限制:
以下方法:
错误消息
如需使用错误消息进行验证,请执行以下操作:
如果您有权查看从 Apigee Edge 收到的完整错误消息,则: 请参阅
faultstring
。faultstring
表示 请求标头的总大小已超出允许的 25 KB 的上限。示例错误消息:
"faultstring":"request headers size exceeding 25,600"
实际请求
如需使用实际请求进行验证,请执行以下操作:
如果您有权访问客户端应用发出的实际请求, 然后执行以下步骤:
- 验证请求中传递的标头的大小。
如果您发现标题的总大小超过了 Apigee Edge 中允许的限制,则也就是说 问题发生的原因。
示例请求:
curl -v https://HOSTALIAS/test -H "header0: 000000000000000000……..000000<trimmed>" -H "header1: 111111111111111111……..111111<trimmed>" -H "header2: 222222222222222222……..222222<trimmed>"-H "header3: 333333333333333333……..333333<trimmed>"
在上例中,标头的总大小
header0
、header1
、header2
、 且header3
大于 25 KB,即包含 超过 25 K ASCII 字符(字节)。如果您使用的是其他客户端,可以查看客户端日志并 尝试确定发送到 Apigee Edge 的请求行的大小。
消息处理器日志
如需使用消息处理器日志进行验证,请执行以下操作:
<ph type="x-smartling-placeholder">如果您是私有云用户,则可以使用消息处理器日志 验证请求标头大小是否超过了 Apigee Edge 中允许的限制。
检查消息处理器日志:
/opt/apigee/var/log/edge-message-processor/logs/system.log
- 搜索特定期间是否存在任何
431
错误 持续时间(如果问题在过去发生过)或者是否有任何请求, 仍然失败并显示431
。您可以使用以下搜索字符串。grep -ri "exceeding"
grep -ri "RequestHeadersTooLarge"
- 您会找到
system.log
中类似于以下内容的行:2021-07-27 08:30:28,419 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:GET, uri:/test/, message Id:null, exception:com.apigee.errors.http.user.RequestHeadersTooLarge{ code = protocol.http.TooBigHeaders, message = request headers size exceeding 25,600, associated contexts = []}, context:Context@9c5903 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.205.251:8443 Local:192.168.67.23:22188]@25130 useCount=1 bytesRead=0 bytesWritten=15367 age=667062ms lastIO=0ms isOpen=true)
文本
message = request headers size exceeding 25,600
中的 上述错误消息表明请求标头的总大小超过了 25 KB。因此,Apigee Edge 会引发异常com.apigee.errors.http.user.RequestHeadersTooLarge
并返回 向客户端应用发送带有错误代码protocol.http.TooBigHeaders
的431
状态代码。
分辨率
<ph type="x-smartling-placeholder">
固定尺寸
方法 1 [推荐]:修复客户端应用不通过 总大小超过允许的上限
<ph type="x-smartling-placeholder">- 分析特定客户端发送大型 大小,使得标头总大小超过 限制。
如果您不希望这样,请修改您的客户端应用,使其仅发送 请求标头的大小小于允许的上限。
在上面讨论的示例中,您可以通过传递长标头来解决此问题 values 参数作为请求正文/载荷的一部分:
curl -v https://HOSTALIAS/test -d '{ "header0: 000000000000000000……..000000<trimmed>" , "header1: 111111111111111111……..111111<ttrimmed>" , "header2: 222222222222222222……..222222<ttrimmed>", "header3: 333333333333333333……..333333<ttrimmed>" }'
- 如果需要,并且您希望发送的标头超过允许的上限,请转到 下一个选项。
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">
本部分介绍了如何验证属性 HTTPRequest.headers.limit
已在消息处理器上使用新值进行更新。
- 在消息处理器计算机上,搜索属性
HTTPRequest.headers.limit
在/opt/apigee/edge-message-processor/conf
目录,然后检查 如下所示:grep -ri "HTTPRequest.headers.limit" /opt/apigee/edge-message-processor/conf
- 上述命令的示例结果如下所示:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.headers.limit=25k
在上面的示例输出中,请注意属性
HTTPRequest.headers.limit
已在http.properties
中使用值25k
设置。这表示在 Apigee for Private 中配置的请求标头大小 Cloud 存储空间为 25 KB。
规范
Apigee Edge 要求客户端应用在
请求。如果请求包含总大小超过指定限制的标头,
Apigee 根据以下 RFC 抛出 431 Request Header Fields Too Large
规范:
规范 |
---|
<ph type="x-smartling-placeholder"></ph> RFC 6585,第 5 部分:431 请求标头字段过大 |
如果您仍需要 Apigee 支持团队的任何帮助,请前往 必须收集诊断信息。
必须收集的诊断信息
请收集以下诊断信息,然后联系 Apigee Edge 支持团队:
如果您是公有云用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 完成用于重现
431
错误的curl
命令 - API 请求的跟踪文件
如果您是 Private Cloud 用户,请提供以下信息:
- 观察到失败请求的完整错误消息
- 组织名称
- 环境名称
- API 代理软件包
- 失败的 API 请求的跟踪文件
- 完成用于重现
431
错误的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