在 AWS 上使用 Kubernetes 部署 HTTP/2 网络服务器

Deploying an HTTP/2 web-server with Kubernetes on AWS

我有一个 Go 服务器,目前是 运行 AWS 上的 Kubernetes。该网站位于 route-53 和管理 SSL 终止的 ELB 下。 现在,我想在我的网络服务器中支持 HTTP/2 以便将资源推送到客户端,我看到 HTTP/2 要求网络服务器使用 HTTPS。据此我有几个问题。

我觉得我错过了什么,所以我会很感激任何帮助。谢谢

如果您的后端也不是 HTTP2,则在 AWS 负载均衡器上部署 HTTP2 没有任何好处。技术上 HTTP2 不需要 HTTPS,但没有人为 HTTP 实现 HTTP2。 HTTP2 是一种协议优化(简单的观点),它消除了 SSL 协商中的往返行程,改进了流水线等。如果负载均衡器通过 HTTP 与您的后端通信,则不会有任何改进。由于 HTTPS 设置期间往返次数减少,负载平衡器的负载会略有下降。

我建议您将后端服务配置为仅使用 HTTPS(将客户端重定向到 HTTPS)并使用 SSL 证书。然后配置HTTP2,顺便说下也不容易。您可以使用 Let's Encrypt for SSL,效果很好。您还可以使用 OpenSSL 自签名证书(我不推荐)。您不能使用 AWS 服务为后端服务创建 SSL 证书,只能为 AWS 托管服务(CloudFront、ALB 等)创建。

您还可以使用第 4 层 (TCP) 侦听器设置负载平衡器。这就是我在后端服务器上设置 HTTP2 时所做的。现在从客户端到后端的整个路径都使用 HTTP2,没有双重 SSL 加密/解密层。

负载均衡器的一个很好的特性叫做 "SSL offloading"。这意味着您在负载均衡器上启用 SSL,而仅在后端 Web 服务器上启用 HTTP。这违背了 HTTP2。因此,请仔细考虑您真正想要实现的目标,然后设计您的服务以满足这些目标。

还有一点要考虑。由于您正在研究 HTTP2,同时删除您的服务对旧 TLS 版本和不安全的加密和哈希算法的支持。删除 TLS 1.0 今天应该是强制性的,我建议也删除 TLS 1.1。除非你真的需要支持古老的浏览器或自定义低端硬件,否则 TLS 1.2 应该是今天的标准。您的日志文件可以告诉您客户端是否通过旧协议进行连接。

新的 ELB 支持 HTTP/2 (https://aws.amazon.com/blogs/aws/new-aws-application-load-balancer/) but not the Push attribute (https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html#listener-configuration):“您不能使用 HTTP/2 的服务器推送功能”

如果您想使用 Push,您可以将 ELB 用作四级 TCP LoadBalancer,并在您的网络服务器上启用它。对于 HaProxy,也可以使用此设置 () 偏移 SSL/TLS,但不确定在 ELB 下是否可以进行类似操作(可能不会)。这是因为虽然 HTTP/2 需要来自所有主要浏览器的 HTTPS,但这并不是协议本身的要求,因此负载平衡器 -> 服务器可以在没有 HTTPS 的情况下结束 HTTP/2(称为 h2c)。

但是我会说 HTTP/2 推送非常复杂,要正确使用 - 请阅读 Google 的 Jake Archibald 的精彩 post:https://jakearchibald.com/2017/h2-push-tougher-than-i-thought/。通常发现它在少数情况下会受益,而在大多数情况下不会造成任何变化,甚至会导致其他情况下的性能下降。最终它在 HTTP/2 功能上有点令人失望,但我个人认为它没有得到足够的探索,因此可能会产生一些积极的影响。

所以,如果你不想使用 Push,那么在前端升级到 HTTP/2 还有意义吗?在我看来是的,正如我在此处的回答中所详述的那样:。这也表明从 LB 到网络服务器的后端没有真正需要 HTTP/2,这意味着您可以将其保留为 HTTPS 卸载 loaf 平衡器。

需要注意的是,在一些用例中HTTP/2速度较慢:

  1. 丢包严重(即互联网连接非常糟糕)。这里 HTTP/2 使用的单个 TCP 连接和它的 TCP 线头阻塞意味着连接遭受超过 6 个单独的 HTTP/1 连接。 QUIC 是一个比 HTTP/2 更新的协议(如此新,它甚至还没有出来,所以除了在 Google 服务器上之外实际上不可用)解决了这个问题。
  2. 由于 AWS 的特定实施,对于大数据包。有趣的是 post:https://medium.com/@ptforsberg/on-the-aws-application-load-balancer-http-2-support-fad4bc67b21a。这只是真正的大下载量最有可能是 API 的问题,对于大多数网站来说应该不是问题(如果是,那么您应该优化您的网站,因为 HTTP/2 无论如何也无济于事!)。可以通过升级 HTTP/2 window 大小设置轻松修复,但看起来 ELB 不允许您设置此设置。