logo

Apache 和 Nginx 性能差异的原因

在深入了解了 Apache HTTP Server 以及 Apache 基金会的发展历程之后,让我们将目光重新聚焦到技术领域。作为一名后端开发者,我们或许都知晓 Nginx 相较于 Apache 具备更出色的性能表现,然而,为何 Nginx 更加强大,其优势究竟体现在何处,我们在网络上只能搜索到一些雷同的文章。

为了解答这个问题,笔者将尝试从互联网的发展、需求的演变以及技术进步的角度来解释这一问题。

互联网流量的发展

2000 年 6 月,美国互联网月 PV(Page View,页面浏览量)最高的网站是 AOL,日均 1336 万。到了 2004 年 4 月,第一名雅虎的日均 PV 达到了 1.886 亿,四年时间增长到了 14 倍。又过了差不多三年,2007 年 1 月的时候,谷歌排名第一,平均日 PV 为 2.37 亿,增长不到一倍,此时第二名是雅虎,它的日均 PV 甚至出现了 8.6% 的下降。

我们可以明显地观察到,2000 年之后的四年中,网民的数量和活跃程度出现了暴增,而 2004 年之后的三年却只有小幅上涨,可想而知 2004 年的时候,Web Server 软件的压力有多么大:谁能提升一倍的性能,谁就能节约一半的服务器成本,这无疑是一笔巨大的开支。

到了 2021 年 5 月,谷歌依然是美国第一大网站,日均 PV 为 5.8 亿,只是 14 年前的 2007 年的 2.45 倍,与过去相比,如今的互联网流量增长所带来的压力已经不再那么紧迫了。

Kernel 的进步

2002 年 10 月 4 日,Kernel 2.5.46 发布,首次引入了 事件驱动的异步 I/O 框架 epoll。这个功能的发布奠定了 Linux 在服务器领域的霸主地位,因为它显著提升了 Linux 在高负载下的 I/O 性能。那 epoll 是怎么做到高性能的呢?

当一个系统保持了 n 个网络连接的时候,传统的 select(2)poll(2) 的复杂度都是 O(n),而 Apache 在对 TCP 连接和进程进行匹配的时候甚至能搞出 O(n^2) 的超高复杂度,而 epoll 的复杂度只有 O(log n)。

在 Kernel 引入 epoll 几个月之前的 2002 年春天,在俄罗斯第二大网站 Rambler 工作的 Igor Sysoev 在公司的安排下开始开发新一代 Web Server,尝试用更少的服务器支撑与日俱增的流量,并提升系统的扩展能力。很显然,他成功了。

Nginx 横空出世

在 epoll 发布两周年的那天,Nginx 正式开源了,从此 HTTP/HTTPS 流量的分发效率进入了一个新的时代。Nginx 利用了 Linux 内核新引入的 epoll API,大幅降低了海量 TCP 连接下的 CPU 负载,显著提升了单台服务器的 TCP 响应容量。

阅读数:2339      字数:837 最后更新:2023-10-25 15:31:33