回顾历史是为了现实服务,但历史的魅力在于它永远不会重复自己。我有幸接触 Nginx ,我把自己的疑问、解答和质疑的过程整理成这篇文档,希望您通过我的视角,看到一个不一样的 Nginx!
自从视频推流方案接触到Nginx之后,一直有个问题围绕在我左右,那就是——我为什么要用它?
这成了我一直想打开的谜团,为什么!为什么会是Nginx?为什么不是Apache和Google?
web服务的使用情况为了这个问题我曾百度、google、知乎搜了一大圈,结论是相似的,一个list,总结出Nginx的优势12345,跨平台、非阻塞、轻量级和高并发……真的是这样吗?
如果是这样,怎么解释从2004年创建到2010年Nginx一直默默无闻?又怎么解释2010年到现在的一飞冲天?
为了解答这个问题,我们把时间拨到15年前,那是个草长莺飞的时代~~
一、Nginx 的时代背景
Nginx的首次问世,是2004年。再过一年,将是Apache占有率最疯狂的一年。在2005年11月,Apache的市场占用率冲破70%,微软IIS平台紧随其后,共同瓜分了Web服务市场最大的蛋糕!
在这个大背景下,Nginx就是一个微不足道的小角色。但它是如何走进我们的视野,并成功逆袭的?还是要从Nginx的创建之初说起,从那个困扰互联网发展的魔障问题C10K说起。
1、 C10K 问题的由来
互联网的基础是网络通信,不管是今天的集群服务器,还是早先前的单应用服务器都是通过连接提供服务的。在网站的建设初期,接入点的压力还不是主要问题。一台机器扛几百个连接是小case,更多的连接怎么办?那得先有更多的人啊!
当Web开启2.0这个副本之后,互联网走进了人们的生活。人多之后PV必然会上升,突然发现机器扛不住了!
那为什么呢?大家看下面的图:
The C10K Problem
当taskQueue里边有100个连接作业时,在多进程模式下,系统是能hold住的。但当Queue里有1000个task,这1000个张嘴的孩子都要吃奶,你得有多少个奶头,多快的轮转速度才能把它们都喂饱了?
随着用户越来越多,访问量也就越来越大。连接数上来以后,硬盘、 CPU 、内存都开始吃紧,一台服务器已经满足不了业务的需求,如何解决是摆在我们面前的首要问题。
解决的方法就是把数据服务和应用服务分离,给数据服务器配更好更大的磁盘,给应用服务配更快的CPU。
数据与应用分离2、C10K 问题的本质
通过上边的例子,我想让大家更好地理解C10K问题的本质。说白了,它就是嘴太多奶不够的问题(这个栗子塔哥享有最终解释权)。
核心资源必定是有限的,如何在有限的资源下满足更多的连接?这是C10K问题本身,但大家要明确一点,就现实的发展需求来说,一台机器无论如何是满足不了千万并发的现实需求!我们只能通过调整服务器架构设计,通过缓存、负载均衡、集群管理,再结合具体的业务特点,不断地优化演进,最终形成符合业务发展的服务器架构体系。
二、Nginx的崛起之路
通过上一章的了解,我们知道C10K是高性能网络服务的一个问题,但不是全部问题。Nginx的解决方案,虽然能提高连接数,但还不足以让它被广泛应用。它所缺的是一个场景,是一个理由,这个机会在Nginx诞生6年后悄无声息地来了。
纵观 Nginx 的发展, 2010 年是一个分水岭,这一年到底发生了什么?是 nginx 自己走向前台,还是被这个时代召唤的?在nginx身上到底是那种能力解决了当时的什么问题?
带着这些问题,我们暂时回到2009年。那一年我国三大电信运营商完成了3G网络的大跃进,在一年时间内累计建设3G基站32.5万个,规模超过了十年来的一半。网速的提升再加上智能手机崭露头角,一下子撞开了移动互联网的大门。
智能手机的销量走势2010年被称为移动互联网元年,新的时代有新的使命,新的时代召唤新的英雄!在那个群魔乱舞的时代,一个凸显的问题是,人们上网不再依赖PC机,有了智能手机可以随时随地接入互联网,对后台服务便有了更大的考验。
随着流量的增加,Apache+mod_php显得力不从心,开始疯狂地吃内存和CPU。在硬件资源和服务架构跟不上调整的时候,Nginx + PHP-FPM + APC在高并发下的出色表现,让Nginx 一炮而红!
随着流量的增加,我们的服务策略也做了调整。在分离数据库、分离图片应用之后,我们将各类数据与计算的压力分摊到不同的主机。完成这些调度,一般都是用nginx反向代理到内网服务器,起到负载均衡与分流的作用。
高并发与反向代理双剑合璧,借助移动互联网的普及,nginx也迎来了发展的黄金阶段。
三、小结与后记
写这个主题耗费了我很多时间和精力。简单来说,写nginx-rtmp三部曲都比写这个轻松。为什么会有这种情况,主要是因为我不了解它。
回顾这段时间,找资料写提纲添内容,是一个不断犯错,不断疑问,不断重建的过程。到今天,我自认为有了一些了解,但实际上也禁不起推敲。Nginx与Apache之间还有很多恩怨,我准备另起一篇博客说这部分。关于最初的那个问题:为什么要选Nginx?做下小结。
Nginx与Apache相比,有很多优势,但真正让它崛起的是这三个原因:
- 自身原因:通过“异步”解决大流量高并发问题。摩尔定律失效以后,CPU的发展趋势是多核,而异步正是发挥多核性能的重要手段。
- 时代原因:移动互联网的发展,为服务器实现高性能和高并发提出了新的挑战。
- 对手原因: Apache 发展到今天已经有 20 多年,这 20 多年即是财富又是包袱。理性地看待它的优势,你就会明白大而不倒死而不僵,也许只是时候未到罢了。
PS:
今天,Nginx已经得到了广泛的应用,它与Apache的差距也缩小到10个百分点,我相信在不久的将来,Nginx就会拔得头筹。我也希望到那一天时,能勾勒出服务器完整的演进过程与大家分享。
好了,Nginx的崛起就先介绍到这,再见!
网友评论