http/1.1 的 CDN 服务器与 http/2 的网络服务器

CDN-server with http/1.1 vs. webserver with http/2

我有一个 http/2 的托管网络服务器(中速),另外我还有一个 space 在只有 http/1.1 的快速 CDN 服务器上。 是否建议从 CDN 加载一些资源,或者我应该只使用网络服务器,因为 http/2? 由于 http/1.1,从 CDN 加载太多资源可能会成为瓶颈? 会很高兴得到一些提示...

你需要测试。这实际上取决于您的应用程序、您的用户和您的服务器。

在 HTTP/1.1 下,您被限制为 6 connections to a domain。因此,将内容托管在单独的域(例如 static.example.com)或从 CDN 加载是将限制增加到 6 以上的一种方法。这些单独的域通常也 cookie-less,因为它们位于单独的域上,这很好为了性能和安全。最后,如果从 code.jquery.com 加载 jQuery 那么您可能会受益于用户已经为另一个站点下载了它,因此请完全保存该下载(尽管库和 CDN 的版本数量有可能常用的库已经下载并且在浏览器缓存中在我看来是有问题的)。

但是,单独的域需要设置单独的连接。这意味着 DNS 查找、TCP 连接,通常还有 HTTPS 握手。这一切都需要时间,尤其是如果只下载一个资产(例如 jQuery),那么这些资产通常会耗尽将资产托管在单独站点上的任何好处!这实际上就是浏览器将连接数限制为 6 的原因——return 的连接数在增加到 6 个以上时会逐渐减少。因此,我已经质疑分片域的价值一段时间了,人们不应该仅仅假设它们会更快。

HTTP/2 旨在通过允许 multiplexing 消除对单独连接的需求,从而有效地消除 6 "connections" 的限制,从而解决对单独域(也称为分片域)的需求,但没有单独连接的缺点。它们还允许 HTTP header 压缩,减少来回发送大 cookie 的性能下降。

所以从这个意义上说,我建议只从本地服务器提供所有内容。当然不是每个人都会在 HTTP/2 上,但是 support is incredible strong 所以大多数用户应该。

但是,CDN 的另一个好处是它们通常是全球分布的。因此,世界另一端的用户可以连接到本地 CDN 服务器,而不是千里迢迢回到您的服务器。这有助于缩短连接时间(因为 TCP 握手和 HTTPS 握手基于更短的距离)并且内容也可以缓存在那里。尽管如果 CDN 必须返回原始服务器以获取大量内容,那么仍然存在滞后(尽管 TCP 和 HTTPS 设置的好处仍然存在)。

所以从这个意义上说,我建议使用 CDN。但是,我会说将所有内容都通过此 CDN,而不是像您建议的那样只是其中的一部分,但您是对的 HTTP/1.1 可能会限制它的用处。这很奇怪,因为大多数商业 CDN 都支持 HTTP/2,而且你还说你有一个 "CDN server"(而不是服务器网络 - 复数)所以也许你的意思是静态域,而不是真正的 CDN?

无论哪种方式,一切都归结为测试,正如本答案开头所述,它实际上取决于您的应用程序、您的用户和您的服务器,这里没有一个真实、明确的答案。

希望这能让您对需要考虑的事情有所了解。如果您想了解更多,因为 Stack Overflow 确实不是其中一些地方,而且这个答案已经足够长了,那么我刚刚写了一本书,其中大部分内容都在讨论这一切:https://www.manning.com/books/http2-in-action