作者:陈炘宇_573 | 来源:互联网 | 2022-12-26 16:24
我正在为大型SPA应用程序选择一个更好的Web服务器,其中包含许多JS和css文件.使用HTTP/2,我们现在无法将它们合并为两个大文件(JS为3 MB),在慢速连接时需要很长时间才能加载.但是哪种服务器更适合新的HTTP/2范例?
Nginx旨在解决http/1问题,它的优点是更好地服务于大量连接,HTTP/2只有一个连接用于所有文件,因此该功能现在似乎是多余的.你觉得怎么样,你能告诉我什么?
1> Barry Pollar..:
这是一个非常主观的问题,可能不适合StackOverflow,所以想象一下这个问题会被关闭.但这是我的两分钱......
完全披露:我主要使用Apache.
首先,让我们解决您的一个错误点:Nginx不是为解决HTTP/1问题而设计的.Nginx旨在通过基于异步事件驱动模型来解决先前Web服务器的一些可伸缩性问题.在HTTP/2下,每个客户端应该有更少的连接,你可以认为这使得可扩展性不是一个问题,因为每个客户端只使用他们之前所做资源的六分之一 - 但这可能有点简单.Apache现在也有一个事件驱动的mpm模块(虽然在任何线程不安全的PHP应用程序的情况下默认情况下通常不会打开 - 但这也是Nginx的一个问题!).这让他们更加重新回归,尽管仍有很多争论,很多人说Nginx仍然更快.根据我的经验,除非你正在处理真正庞大的卷(在这种情况下你应该看看CDN,负载均衡器和缓存加速器),很少有人会注意到Nginx和Apache之间的区别.当下游应用程序和系统发挥作用时尤其如此 - 缓慢的PHP应用程序将很快消除Web服务器级别的任何性能或可伸缩性问题.
无论如何,回到你的主要问题:
对于HTTP/2支持,我的选择是Apache over Nginx.它有一段时间有更好的HTTP/2支持.例如,Nginx仅在2018年初添加了HTTP/2 Push支持,而Apache已经拥有了多年的支持.Apache还支持PushDiary(基于即将推出的Cache- Digests草案),以防止推送已经发送的资源,支持提前推送的早期提示,以及推送优先级选项.从HTTP/2推送开始,Apache还支持在代理模式下使用HTTP/2(尽管它仍然标记为实验性的,目前这个问题的实用性是有问题的),而HTTP/2则通过HTTP(h2c - 虽然再次有用的是有问题,因为浏览器不支持这个).我还发现Apache HTTP/2实现的主要开发人员对mod_http2模块的GitHub页面非常敏感(自2.4.18以来作为核心Apache的一部分包含在内,自2.4.26以来不再标记为"实验性").
另一方面,我了解Cloudflare使用基于Nginx的自定义Web服务器,并且他们已经推出了一年多的HTTP/2推送(正是他们将此实现向后移植到Nginx).因此,考虑到Cloudflare的规模,虽然不确定它是如何根据核心Nginx代码进行自定义的,但这与实现相当.
还有一个HTTP/2一致性测试工具可用,当我最近针对一些常见的HTTP/2服务器运行时(对于我正在写的主题 btw的书),我得到了以下结果,这清楚地表明Apache是最合规的与规格:
现在公平地说,大多数错误的原因都是没有正确回应不良请求,在完美的世界中永远不应该发送,所以并不重要.但是,我们仍然没有生活在一个完美的世界中,错误检查是技术的重要组成部分,所以我一个人肯定更喜欢更符合要求的服务器.
最终,您最好选择最适合您的实施方案.一般的感觉一直是Nginx更轻,更容易配置,但另一方面可能并不像Apache那样功能齐全.HTTP/2支持似乎继续这个主题.如果你想玩即将推出的HTTP/2功能,那么对我来说,Apache肯定有优势(尽管没有什么可说的,以后也不会改变).但是,对于HTTP/2的基本用例,它们可能被认为是类似的.甚至HTTP/2推送还没有被使用,并且存在严重的担忧,如果没有适当地使用或者由于实现问题,它可能会降低性能,这可能是为什么它不是Nginx的优先级,而他们最近只实现了它.