应用程序负载均衡器 (ALB)

应用程序负载均衡器 (ALB)

由于 Amazon ELB 截断了较长的(超过 1K 个字符)URL,我们似乎遇到了错误。

我搜索了常见的嫌疑人,但没有找到有关 Amazon ELB 的 URL 长度限制的任何讨论。

Amazon URL 的长度有限制吗?如果有,有办法增加该限制吗?

答案1

我使用一个简单的 bash 脚本针对我在 ELB 后面运行的域进行了测试:

S='a';
URL='http://example.com/?foo=';
while true;
do
  echo $URL$S | wc -c;
  curl -I "$URL$S";
  S=$S$S;
done

这种方法在一段时间内效果很好:

2081
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Tue, 05 Feb 2013 15:01:44 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Connection: keep-alive

4129
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Tue, 05 Feb 2013 15:01:46 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Connection: keep-alive

但一旦超过 8192 长度限制就会失败:

8225
HTTP/1.1 414 Request-URI Too Large
Content-length: 337
Content-Type: text/html; charset=iso-8859-1
Date: Tue, 05 Feb 2013 15:01:47 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Connection: keep-alive

16417
HTTP/1.1 414 Request-URI Too Large
Content-length: 337
Content-Type: text/html; charset=iso-8859-1
Date: Tue, 05 Feb 2013 15:01:47 GMT
Server: Apache/2.2.22 (Ubuntu)
Vary: Accept-Encoding
Connection: keep-alive

Apache 将失败的请求记录在不同的文件中,因为字符串GET位于Host:标头之前,因此 Apache 无法确定要使用哪个虚拟主机。

尽管如此,它曾是Apache 仍在响应,而不是 ELB,甚至单个字符串的大小超过 128KB GET。完整的 128KB 请求记录在默认 Apache 日志文件中。超过 256KB 后,curl无法处理请求。

看起来 Amazon ELB 中没有任何 URL 长度限制。

答案2

我们从 AWS Support 收到了以下答复(我的格式):

请注意,所有负载均衡器的 URI 长度都有限制,并且由于您收到 414 错误,因此您的 GET 请求一定超出了以下限制。

应用程序负载均衡器 (ALB)

对于 ALB,HTTP/1.x 标头和 HTTP/2 标头的 HTTP 标头限制有所不同。请参阅HTTP 标头限制

HTTP/1.x 标头应用程序负载均衡器具有以下大小限制:

  • 请求行:16K
  • 单头:16K
  • 整个头:64K

HTTP/2 标头应用程序负载均衡器具有以下大小限制:

  • 请求行:16K
  • 单头:16K
  • 整个头:64K

传统负载均衡器 (CLB)

CLB 施加的唯一限制是 HTTP 动词(GET、POST 等)的长度,并且必须为 127 字节或更小,任何大于此的动词都会导致 CLB 返回 HTTP 错误 405“METHOD_NOT_ALLOWED”。

网络负载均衡器 (NLB)

由于 NLB 运行在开放系统互连 (OSI) 模型的第四层,因此对 HTTP 标头没有限制。它会尝试在侦听器配置中指定的端口上打开到选定目标的 TCP 连接。

相关内容