我正在为具有数十个 JS 和 css 文件的大型 SPA 应用程序选择更好的 Web 服务器。使用 HTTP/2,我们现在无法将它们合并成两个大文件(JS 为 3 MB),这在慢速连接时需要很长时间才能加载。但是哪个服务器更适合新的 HTTP/2 范式?
Nginx 是为解决 http/1 问题而设计的,它的优点是更好地服务于大量连接,而在 HTTP/2 中,所有文件只有一个连接,因此该功能现在似乎是多余的。你怎么看,你能给我什么建议?
最佳答案
这是一个非常主观的问题,可能不太适合 StackOverflow,所以想象一下这会被关闭。但这是我的两分钱...
完全披露:我主要使用Apache。
首先,让我们解决您的一个错误观点:Nginx 并非旨在解决 HTTP/1 问题。 Nginx 旨在通过基于异步、事件驱动模型来解决以前 Web 服务器的一些可扩展性问题。在 HTTP/2 下,每个客户端应该有更少的连接,您可能会争辩说,这使得可扩展性成为问题,因为每个客户端只使用他们以前使用的资源的 1/6 - 但这可能有点简单化。 Apache has an event-driven MPM module 现在也有很多年了(尽管在任何线程不安全的 PHP 应用程序的情况下通常不会默认打开 - 但这对于 Nginx 来说也是一个问题!)。这使它们更加一致,尽管对此仍有很多争论,许多人说 Nginx 仍然更快。根据我的经验,除非您处理的是真正巨大的数据量(在这种情况下您应该查看 CDN、负载平衡器和缓存加速器),否则很少有人会注意到 Nginx 和 Apache 之间的区别。当下游应用程序和系统发挥作用时尤其如此 - a slow PHP application will quickly negate any performance or scalability issues at the web server level 。
无论如何,回到你的主要问题:
对于 HTTP/2 支持,我的选择是 Apache 而不是 Nginx。一段时间以来,它对 HTTP/2 的支持更好。例如 Nginx only added HTTP/2 Push support in early 2018,而 Apache 已经有很多年了。 Apache 还支持 PushDiary(基于 now-abandon Cache-Digests 提议)来防止推送已经发送的资源,支持 103 Early Hints 用于提前推送,以及 push prioritisation options 。从 HTTP/2 推送开始,Apache 还支持使用 HTTP/2 in proxy mode(尽管它仍然被标记为实验性和 the usefulness of this is questionable at the moment )和 HTTP/2 over HTTP(h2c - 尽管再次有用性值得怀疑,因为浏览器不支持这一点)。我还发现 Apache HTTP/2 实现的主要开发人员对 GitHub page for the mod_http2 module 非常敏感(自 2.4.18 起作为核心 Apache 的一部分包含在内,自 2.4.26 起不再标记为“实验性”)。
另一方面,我知道 Cloudflare 使用定制的基于 Nginx 的 Web 服务器,并且他们现在已经有一年多的 HTTP/2 推送(是他们将这个实现向后移植到 Nginx)。所以, given Cloudflare's scale ,这说明了 though not sure how customised it is from the core Nginx code 的实现。
还有一个 HTTP/2 conformance Testing tool available,当我针对一些常见的 HTTP/2 服务器(对于 book I wrote on the subject btw)运行它时,我得到了以下结果,这清楚地表明 Apache 最符合规范:
公平地说,大多数错误的原因是没有正确响应错误的请求,在完美的世界中无论如何都不应该发送这些请求,所以并不那么重要。但是,我们并不生活在一个完美的世界中,错误检查是技术的重要组成部分,所以我当然更喜欢更兼容的服务器。与下面评论中指出的类似,工具和 Web 服务器本身可能会受到竞争条件和其他可能错误报告错误的问题的影响。
最终,您最好选择您最满意的实现。总体感觉一直是 Nginx 更轻巧且更易于配置,但另一方面,因此可能不如 Apache 功能齐全。 HTTP/2 支持似乎延续了这个主题。如果您想使用即将推出的 HTTP/2 特性,那么对我来说,Apache 目前绝对具有优势(尽管没有什么可以说将来不会改变)。但是,对于 HTTP/2 的基本用例,它们可能被认为是相似的。甚至 HTTP/2 Push 也没有被广泛使用,并且存在严重的 it could degrade performance if not used appropriately or due to implementation issues 问题,这可能是 Nginx 没有优先考虑它的原因,而他们只是在后来才实现它。
关于apache - HTTP/2 : Apache vs Nginx? 有什么好处,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48974616/