您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档。 信息
问题
客户端应用收到 HTTP 状态代码 414 Request-URI Too Long
且错误代码为 protocol.http.TooBigLine
,作为 API 调用的响应。
错误消息
客户端应用会获得以下响应代码:
HTTP/1.1 414 Request-URI Too Long
此外,您可能还会看到以下错误消息:
{ "fault":{ "faultstring":"request line size exceeding 7,168", "detail":{ "errorcode":"protocol.http.TooBigLine" } } }
请注意,上述错误消息中的 faultstring
包含 Apigee Edge 中请求行允许的限制,即 7168 bytes
(7 KB)。
可能的原因
如果客户端应用作为 HTTP 请求的一部分发送到 Apigee Edge 的请求行大小超过 Apigee Edge 中允许的限制,就会发生此错误。
在我们了解此错误的可能原因之前,我们先了解请求行的含义以及如何检查其大小。
了解请求行
典型的 HTTP 请求由三部分组成:
- 请求行
- (一组 HTTP 标头)
- [正文 ]
请求行由如下所示的三部分组成。
Request-Line = <Method> <Request-URI> <HTTP-Version>
当客户端应用向服务器发出 HTTP 请求时,转到服务器的第一行包含上述请求行。其后是标头和请求正文/载荷。
以下示例屏幕截图显示了典型的 curl
请求、请求部分(以及请求行)和响应部分。
了解请求行大小
- 在上述示例中,请求中的起始行(第一行,也称为请求行)如下所示:
GET /test/ HTTP/1.1
请求行的大小为
~19 bytes
,因为它包含19 ASCII characters
。由于这未超出 Apigee Edge 中的允许限制,因此请求会得到处理,而不会出现任何错误,并且您会收到成功响应。 - 同样,如果您查看上面显示的
错误消息中的
faultstring
,会发现它包含"request line size exceeding 7,168"
。这表示客户端发出的 HTTP 请求中的请求行超出了 7168 字节。
以下是导致此错误的可能原因:
原因 | 说明 | 适用的问题排查说明 |
---|---|---|
请求的载荷大小超出允许的上限 | 客户端应用在向 Apigee Edge 发出的 HTTP 请求中发送的请求 URI 的大小超过 Apigee Edge 中允许的限制。 | Edge 公有云和私有云用户 |
常见诊断步骤
使用以下工具/技巧之一来诊断此错误:
API 监控
要使用 API Monitoring 诊断错误,请执行以下操作:
- 以拥有 适当角色的用户身份 登录 Apigee Edge 界面。
切换到您要调查问题的组织。
- 前往 Analyze > API Monitoring > Investigate 页面。
- 选择您发现错误的具体时间范围。
- 根据时间绘制故障代码。
- 选择一个包含错误代码
protocol.http.TooBigLine
和状态代码414
的单元格,如下所示:( 查看大图)
您将看到有关错误代码
protocol.http.TooBigline
的信息,如下所示:( 查看大图)
点击查看日志,然后展开失败请求所在的行:
( 查看大图)
在 Logs 窗口中,请注意以下详细信息:
- 状态代码:
414
- 错误来源:
apigee
- 错误代码:
protocol.http.TooBigLine
。 - 请求长度(字节):
7244 (> 7KB)
- 状态代码:
- 如果故障来源的值为
apigee
或MP
,故障代码的值为protocol.http.TooBigLine
且请求长度大于 7 KB,则表示来自客户端的 HTTP 请求的请求 URI 大于 Apigee 中允许的限制。
跟踪工具
NGINX
如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是 Private Cloud 用户,则可以使用 NGINX 访问日志来确定有关 HTTP
414
错误的关键信息。 检查 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中:将 ORG、ENV 和 PORT# 替换为实际值。
- 搜索以查看在特定持续时间内是否存在任何
414
错误(如果问题是在过去发生的),或者是否有任何请求仍然失败并显示414
。 如果您确实发现 X-Apigee-fault-code 与 X-Apigee-fault-code 的值匹配的任何
414
错误,则确定 X-Apigee-fault-code 的值。NGINX 访问日志中的上述示例条目具有 X-Apigee-fault-code 和 X-Apigee-fault-code 的以下值:
响应标头 值 X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source policy
请注意请求长度:
7244
(7.244KB > 允许的上限)
原因:请求载荷大小超出允许的上限
诊断
- 按照常见诊断步骤中所述,确定使用 API 监控、跟踪工具或 NGINX 访问日志观察到的错误的故障代码、故障来源和请求长度大小。
- 如果故障来源的值为
apigee
或MP
,则表示客户端应用向 Apigee 发送的请求大小大于 Apigee Edge 中允许的限制。 - 您可以使用以下任一方法验证请求行大小是否已超过允许的 7 KB 限制:
错误消息
如需使用错误消息进行验证,请执行以下操作:
如果您有权访问从 Apigee Edge 收到的完整错误消息,请参阅
faultstring
。faultstring
表示请求行大小超过允许的 7 KB 限制。示例错误消息:
"faultstring":"request line size exceeding 7,168"
实际请求
如需使用实际请求进行验证,请执行以下操作:
如果您有权访问客户端应用发出的实际请求,请执行以下步骤:
- 请验证请求中传递的 URI 的大小。
如果您发现 URI 的大小超过 Apigee Edge 中允许的限制,这就是问题的原因。
示例请求:
curl http://<hostalias>/testtoobigline?_qparam=000000000000000000……..000000<trimmed> -k -X POST
在上例中,查询参数
qparam
的值大于 7 KB,即包含的 ASCII 字符超过 7 K。如果您使用的是其他客户端,则可以查看客户端日志并尝试确定发送到 Apigee Edge 的请求行的大小。
消息处理器日志
如需使用消息处理器日志进行验证,请执行以下操作:
如果您是 Private Cloud 用户,则可以使用消息处理器日志来验证请求行大小是否超出了 Apigee Edge 中允许的限制。
检查消息处理器日志:
/opt/apigee/var/log/edge-message-processor/logs/system.log
- 搜索以查看在特定持续时间内是否存在任何
414
错误(如果问题是在过去发生的),或者是否有任何请求仍然失败并显示414
。您可以使用以下搜索字符串。grep -ri "exceeding"
grep -ri "RequestURITooLong"
- 您会发现,
system.log
中的行与以下内容类似:2021-07-12 08:53:31,461 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:null, uri:null, message Id:null, exception:com.apigee.errors.http.user.RequestURITooLong{ code = protocol.http.TooBigLine, message = request line size exceeding 7,168, associated contexts = []}, context:Context@366f4217 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.195.90:8443 Local:192.168.67.23:34256]@301912 useCount=1 bytesRead=0 bytesWritten=45849 age=2254670ms lastIO=0ms isOpen=true)
上述错误消息中的文本
message = request line size exceeding 7,168
表示请求 URI 大小超过 7 KB。 因此,Apigee Edge 会抛出com.apigee.errors.http.user.RequestURITooLong
异常并将带有错误代码protocol.http.TooBigline
的414
状态代码返回给客户端应用。
分辨率
修正尺寸
方法 1 [推荐]:解决客户端应用发送的请求 URI 大小超出允许限制的问题
- 分析特定客户端发送请求 URI 大小超过限制中定义的允许限制的原因。
如果您不希望这样,请修改您的客户端应用,使其发送的请求 URI 大小小于允许的上限。
在上述示例中,您可以通过将长查询参数作为请求正文/载荷的一部分(而不是作为请求网址的一部分进行传递)来解决此问题,如下所示:
curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
- 如果需要,并且想要发送的 URI 数量超出允许的上限,请转到下一个选项。
CwC
方法 2:使用 CwC 媒体资源提高请求行数量上限
Apigee 提供了 CwC 属性,可用于提高请求行大小限制。如需了解详情,请参阅 在消息处理器上设置请求行数上限
限制
Apigee 要求客户端应用和后端服务器不会发送大小超过 Apigee Edge 限制中请求/响应行限制中规定的允许限制的请求/响应行。
- 如果您是公有云用户,则请求和响应行大小的上限如 Apigee Edge 限制中请求/响应行大小中所述。
- 如果您是 Private Cloud 用户 ,则可能修改了请求和响应行大小的默认上限(尽管不建议这样做)。您可以按照如何查看当前限制中的说明确定请求行的大小上限。
如何查看当前的上限?
本部分介绍如何验证属性 HTTPRequest.line.limit
是否已使用消息处理器上的新值更新。
- 在消息处理器计算机上,在
/opt/apigee/edge-message-processor/conf
目录中搜索属性HTTPRequest.line.limit
,然后检查设置的值,如下所示:grep -ri "HTTPRequest.line.limit" /opt/apigee/edge-message-processor/conf
- 上述命令的示例结果如下所示:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.line.limit=7k
请注意,在上面的示例输出中,属性
HTTPRequest.line.limit
已使用http.properties
的值7k
进行了设置。这表示在 Apigee for Private Cloud 中配置的请求行大小限制为 7 KB。
如果您仍然需要 Apigee 支持的任何帮助,请参阅必须收集诊断信息。
必须收集的诊断信息
收集以下诊断信息,然后联系 Apigee Edge 支持团队:
如果您是公有云用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 完成用于重现
414
错误的curl
命令 - API 请求的跟踪文件
如果您是 Private Cloud 用户,请提供以下信息:
- 观察到失败请求的完整错误消息
- 组织名称
- 环境名称
- API 代理软件包
- 失败 API 请求的跟踪文件
- 完成用于重现
414
错误的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