由于Nginx对硬件和操作系统内核特性的深度挖掘,使得它在保持高并发的同时,实现了高吞吐量。优秀的模块设计,使得Nginx的生态圈,异常丰富。大量的第三方模块,使得Nginx可以轻松实现各种场景下的定制化需求
这些特性,使得Nginx成为互联网公司的标准配置
Nginx的三个主要应用场景
往往一个web请求从红色的箭头走下来以后,会先经过Nginx,再到应用服务,然后再去访问Redis或者MySQL这样的数据库,提供基本的数据功能
这里有一个问题,应用服务因为对开发效率要求特别的高,它的运行效率是很低的,它的QPS、TPS或者并发都是受限的,所以就需要把很多这样的应用服务组成一个集群,向用户提供高可用性,而一旦很多应用服务构成集群的时候,就需要Nginx具有反向代理功能,可以将动态请求传给应用服务
很多的应用服务组成的集群,它一定会带来两个需求:
- 需要动态的扩容
- 有些服务出问题的时候,需要做容灾
这样就使反向代理必须具备负载均衡功能。其次,在这样的一个链路中,Nginx是处在企业内部网络的边缘节点,随着网络链路的增长,用户体验到的时延会增加,所以如果我们能把一些用户看起来不变的,或者在一段时间内看起来不变的动态内容,缓存在Nginx部分,由Nginx直接向用户提供访问。那么这样用户访问时延就会减少很多
所以反向代理会衍生出另外一个功能叫缓存,它能加速访问。很多时候我们在访问css、js或者一些小的图标图片,这样的静态资源,是没有必要由应用服务来提供访问的,它只需要通过本地文件,系统上放置的静态资源,直接由Nginx提供访问就可以了,这就是Nginx提供静态资源服务功能
第三个应用场景,则是因为应用服务它本身的性能因为有很多的问题,但是数据库服务要比应用服务好的多,因为它的应用场景比较简单,它的并发性能和TPS都要远高于应用服务,所以就衍生出第三个应用场景。由Nginx直接去访问数据库(Redis或者类似这样的服务),利用Nginx强大的并发性实现如:web防火墙,这样复杂的业务功能来提供给用户。这要求API服务有非常强大的业务处理功能,所以像OpenResty,或者像Nginx集成的JavaScript,利用JavaScript、Lua这样的语言功能,和它们语言先天自带的一些工具库来提供完整的API服务
Nginx出现的历史背景
- 互联网数据量的快速增长
- 摩尔定律:性能提升
- 低效的Apache
主要是全球化和物联网的快速发展,导致接入互联网的人与设备的数量都在快速上升,数据的快速爆炸,对硬件性能提出了很高的要求,提到硬件,大家都知道摩尔定律。之前我的服务跑在1GHz的CPU上,一年半以后,我更新到2GHz的CPU时,我可以预测到我的服务会有两倍的性能提升
但是到本世纪初,摩尔定律在单颗CPU的频率上已经失效了,CPU开始向多核方向发展。这个时候,当你的服务是跑在8核CPU上时,一年以后,你换到16核的CPU,通常你的服务不会有一倍的性能提升的
那么这些性能究竟损耗在哪里?
主要是操作系统和大量的软件没有做好服务于多核架构的准备,比如Apache,Apache是低效的,因为它的架构模型里,一个进程,同一时间,只会处理一个连接一个请求,只有在这个请求处理完以后,才会去处理下一个请求
这有什么潜台词呢?这实际上是在使用操作系统的进程间切换的特性,因为操作系统微观上只有有限的CPU,但是操作系统被设计为同时服务于数百甚至上千的进程,而Apache一个进程只能服务于一个连接,这样的模式,会导致,当Apache需要面对几十万、几百万连接的时候,它没有办法去开几百万的进程,而进程间切换的代价、成本又太高。当并发的连接数变多,这些进程间切换,引发的性能消耗也就越大。而Nginx是专门为了这样的应用场景而生的。Nginx可以处理数百万甚至数千万的并发连接
Nginx的优点
- 高并发、高性能
- 可扩展性好
- 高可靠性
- 热部署
- BSD许可证
它的Y轴是每秒处理的请求数(RPS),X轴是并发连接数。从图中可以看到,大部分的程序或web服务器,随着并发连接数的上升,它的RPS会急剧的下降,这就是上边说到的,它的架构设计是有问题的
Nginx的第一个优点就是高并发、高性能同时具备的,往往高并发只需要对每一个连接所使用的内存尽量的少就可以达到。而具备高并发的同时又具备高性能,往往需要非常好的设计。Nginx可以达到什么样的标准呢?比如说现在比较主流的服务器(32核、64G内存),可以轻松达到数千万的并发连接,如果是处理一些简单的静态资源请求,它可以达到100w的RPS
第二个核心优点是它的可扩展性非常的好。它的可扩展性主要体现在它的模块化设计,模块化设计的非常稳定,使得Nginx的第三方模块生态圈非常的丰富。丰富的生态圈,为Nginx丰富的功能提供了保证
第三个优点是它的高可靠性。所谓高可靠性是指Nginx可以在服务器上持续不间断的运行数年,而很多web服务器,往往运行几周或者几个月就需要做一次重启。对于Nginx这样一个高并发、高性能的反向代理服务器而言,它往往运行在企业内的边缘节点上,这个时候,如果企业想提供4个9,5个9,甚至更高的高可用性时,对Nginx持续运行,能够宕机的时间一年可能只能以秒来计。所以在这样一个角色中,Nginx的高可靠性,提供了非常好的保证
第四个优点是热部署。是指可以在不停止服务的情况下升级Nginx,这个功能对Nginx来讲非常重要,因为在Nginx上可能跑了数百万的并发连接。如果是普通的服务,我们可能是需要kill掉进程然后再重启的方式就可以处理好。但是对于Nginx而言,因为kill掉Nginx进程,会导致操作系统为所有的已经建立连接的客户端发送一个TCP中的reset复位包,而很多的客户端是没有办法很好的处理复位请求的。在大并发场景下,一些偶然事件,就会导致必然的恶性结果,所以热部署是非常有必要的
第五个优点是BSD许可证。它指的是Nginx不仅是开源的、免费的,而且大家可以在有定制的场景下去修改Nginx的源代码,在商业场景下是合法的
Nginx的四个主要组成部分
Nginx二进制可执行文件
这个是由Nginx本身的框架,它的官方模块和编译进去的各种第三方模块,一起构建的文件。这个文件就相当于汽车本身,它有完整的系统,所有的功能都由它提供
Nginx.conf配置文件
它相当于驾驶员,虽然二进制可执行文件已经提供了许多功能,但这些功能有没有开启,或者开启了以后,定义怎样的行为处理请求,都是由Nginx.conf配置文件决定的。所以它相当于驾驶员,控制汽车的行为
access.log访问日志
它相当于这辆汽车经过的所有地方形成了GPS轨迹,access.log会记录下每一条http请求信息与响应信息
error.log错误日志
它相当于黑匣子一样,当出现了一些不可预期的问题时,可以通过error.log去把问题定位出来
Nginx的版本发布情况
- feature:发布了哪些功能
- bugfix:修复了哪些bug
- change:做了哪些小的重构
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。