---
menu: Apache、Nginx 的性能差异
title: Apache 和 Nginx 性能差异的原因
taxonomy:
    category: docs
---

在深入了解了 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](http://www.xmailserver.org/linux-patches/nio-improve.html)。这个功能的发布奠定了 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 响应容量。
