在我看来, Nginx 出现的原因主要有三个。
第一个是互联网上数据的快速增长,这主要是全球化和互联网的快速发展,导致接入互联网中的人与设备的数量都在快速上升。数据的快速爆炸对我们的硬件性能提出了很高的要求,而提到硬件上可能大家都知道摩尔定律,假如之前我的的服务跑在 1G Hz 的 CPU 上,当一年半以后,我更新到 2G Hz 的 CPU时,我可以预测到,我的服务会有两倍的性能提升,但是到了本世纪初,摩尔定律在单颗CPU的频率上已失效,CPU 开始向着多核方向发展。这个时候当你的服务器现在是跑在八核CPU上时,一年半以后,你换到了16核的CPU,你的服务的性能通常是不会有一倍的提升的。那么这些性能究竟损耗在哪里呢,那么在我看来主要是操作系统和大量的软件,没有做好服务于多核架构的准备。比如说像 apache,在我看来 apache 是低效的,因为他的架构模型里一个进程同一时间只会处理一个连接一个请求,只有在这个请求处理完以后才会去处理下一个请求。这有什么潜台词吗?它实际上在使用操作系统进程间切换的一个特性,因为操作系统微观上只有有限的 cpu,但是操作系统被设计为同时服务数百甚至上千的进程,而 apache 呢,一个进程只能服务于一个连接。这样的模式会导致当 apache 需要面对几十万,几百万连接的时候,他没有办法去开几百万的进程,而进程间切换的代价成本又太高了,当我们并发的连接数越多,这种无谓的进程间切换引发的性能消耗就越大。而 nginx 是专门为了这样的应用场景而生的。nginx 可以处理数百万甚至上千万的并发连接。
我们可以看下右边这张图。这是 netcraft 在 2017 年 12 月份发布的 web 服务器市场份额图,可以看到 nginx 这条绿色的曲线有一个快速的上升,虽然到现在他只是在 web 市场份额中排名第二,但是大家需要考虑到在存量市场中通常我们不会去更换已经在稳定运行的 web 服务器,所以实际上虽然 apache 还远远领先于 nginx,但是新增的 web 服务器都是在使用 nginx 来处理。
总结
- 全球化和互联网的快速发展,接入互联网中的人与设备数量都在快速上升,数据量大爆炸。
- 本世纪初,摩尔定律在单颗 CPU 上已经失效,CPU朝着多核方向发展,许多老旧的软件和操作系统没有做好服务于多核架构的准备。
- apache 一个进程同一时间只会处理一个连接一个请求,面对高并发时,会因进程切换引发大量的性能损耗。
- nginx 可以处理数百万甚至上千万的并发连接。
- nginx 市场份额在不断提升,新增的 web 服务器基本都使用 nginx。