01|讲在前言
写这文章的初衷:之前一直都是私下的、断断续续的学习相关的知识,坚持以及收获的成效一般。这不,来换一种方式,想让自己将他学下去,借助编写文字的方式记录学习过程。既然要写了,并且在众目睽睽下,这就是自定任务了!望自己坚持✊下来。将这庞大的Nginx及网络体系拆解开,定期输出。也给需要的朋友带来一些收获~
本文章的所有学习内容都源于极客时间作家 陶辉老师《Nginx核心知识150讲》
Nginx 从2004年发展至今,由于其对硬件和操作系统的内核的深度挖掘。使得他在保持高并发的同时做到了高吞吐量,其优秀的模块设计使得他的生态圈也异常丰富。大量的第三方模块使得Nginx可以实现各种定制化需求,BSD许可证又赋予Nginx最大的灵活性,这些特点已经使得Nginx成为了互联网公司的标准组件,我们平时一般只是掌握了Nginx的基本用法,并不能发挥出其强大的功力。👇让我们一起学习他,共同进阶吧!
学习完这一连载内容后我们会共同收获:
- 了解了Nginx的能力模型
- 了解Nginx的工作原理
- 怎么样使用Nginx搭建定制化的web服务器以及微服务集群的负载均衡服务
- 什么样的api服务适合Nginx的编写
- 在Linux系统下怎么优化Nginx,使得其能轻松应对百万并发
大概章节概述:
- 【初识Nginx】快速了解Nginx的背景以及基本用法
- 【Nginx的架构基础】 在此我们开始探讨Nginx的进程模型以及数据结构
- 【详解HTTP模型】讲清楚Nginx是如何处理请求的,再按照请求的处理流程来讲解常用HTTP模型中的指令/变量的用法
- 【反向代理与负载均衡】这里以7层负载均衡为主,兼顾4层负载均衡。搭建出不同上游协议的反向代理并理解如何高效处理上下游的流量交互
- 【Nginx的系统层性能优化】 有效调节Linux系统下CPU、内存、网络、磁盘等配置,与Nginx中的config的指令如何配置使得Nginx 性能最大
- 【Nginx与OpenResty】Nginx的实现层面打通之前学习的知识,深刻了解Nginx的机制和能力模型。并解释OpenResty和Nginx有效搭配使用的
第一章 初识Nginx
这一部分会一起了解Ngnix的背景、配置语法、命令行、能够快速搭建一个简单的web服务器,并体会一下其强大的功能
02|Nginx适用于哪些场景
Nginx的三个主要应用场景:
如下面的图所示:
- 静态资源服务
- 反向代理服务
- API服务
图中,一个外部请求从红色线进入后,会先经过Nginx再到我们的应用服务,比如Tomcat、Django。然后再去访问Redis或者MySql这样的数据库,提供基本的数据功能。这里有个问题,我们的应用服务要求开发效率非常的高,所以运行效率很低,其QPS、TPS、并发都是限制的,所以我们需要将这些应用服务组成一个集群,向用户提供高可用性。
而一旦很多应用服务组成集群就要求Ngnix具有反向代理功能,可以把动态请求传导给应用服务。
而很多应用服务变成集群后,一定会带来俩个需求:1)动态扩容 2)有些服务出问题的时候我们需要做容灾。这样我们的反向代理必须具备负载均衡功能。
其次在这样的链路中,Nginx是处于企业内网的边缘节点。随着我们的网络链路的增长,用户体验的时延会增加。所以如果我们能把一些用户看起来不变的或一段时间内看起来不变的动态内容缓存在Nginx部分,由Nginx直接向用户访问,这样用户的时延会减少很多。所以反向代理会引申出另外一个功能叫缓存。这能够加速我们的访问,而很多时候,我们访问js、css或一些图片,这样的静态资源是没有必要向应用服务访问的,只需要通过本地文件系统上设置的静态资源,直接由Nginx来访问就可以了。这是Nginx的静态资源能力。
图中第三个应用场景则是因为本身的性能有很多问题,但是社区库服务要比其好的多,因为社区库服务的业务场景比较简单,并发性能和TPS都要远高于应用服务,所引申出这个场景,由Nginx直接去访问数据库/Redis或者类似的应用服务,利用Nginx强大的并发性能实现如Web防火墙这样复杂的业务功能。这要求我们的API服务需要非常强大的业务处理功能,比如OpenResty或Nginx集成的Javascript,利用Javascript、Lua 这样的语言功能和它们语言先天自带的工具库来提供完整的API服务。
03|Nginx出现的历史背景
Nginx为什么会出现?
蓝色:Apache 红色:Microsoft 绿色:Nginx 粉色:其他
-
互联网的数据量快速增长:这主要是全球化和物联网的快速发展导致接入互联网的人与设备都在快速上升,数据的快速爆炸对我们的硬件和性能提出了很多要求
-
摩尔定律:性能提升 提到硬件,就会讲到摩尔定律:之前我们的服务跑在1GHz的CPU上,当一年半以后,我更新到2GHz的CPU上时,我可以预测我的服务可以有2倍的性能提升。但到了本世纪初,摩尔定律在单颗CPU上已经失效了。CPU向多核方向发展了,当服务跑在8核CPU上,一年半以后换到16核CPU上时,你服务的性能通常是不会有1倍的提升的。那这些性能通常损耗在哪里呢?主要是因为操作系统和软件没有做好服务于多核CPU的准备,比如说Apache
-
低效的Apache
其架构模型中一个进程同一时间只会处理一个连接一个请求,只有在这个连接请求处理完后才会处理下一个请求。潜台词实际上在使用操作系统进程间切换的一个特性,操作系统微观上只有有限的CPU,但是又被设计为同时服务于数百甚至上千个进程。而Apache一个进程只能服务于一个链接,这样的模式当Apache面对几十万/几百万链接时,没有办法开几百万个进程,而进程间切换的代价又太高了,当并发的连接数越多,这种无谓的进程间切换引发的性能消耗也就越大。
Nginx专门为这样的应用场景而生的。全异步事件驱动Nginx可以处理数百万甚至数千万的并发连接
上图中 可以观察到Nginx在的使用用户在逐步上升,Nginx排在Apache的后面的原因是市面有很多存量服务,通常我们不会轻易更换web服务,但是一般新增的服务器都会选择使用Nginx去搭建
04 为什么用Nginx:它的5个主要优点
Y轴:每秒处理的请求数 X轴:并发连接数
优点一:高并发和高性能
- 如图中所示,大部分web服务器随着并发连接数不断上升,其每秒处理的请求数会急剧下降,这是上文我们提到的(Apache等服务器),是因为其架构设计是有问题的,而Nginx的第一个优点就是高并发和高性能是同时具备的。往往高并发只需要我们对每个连接所使用的内存尽量的少就可以达到,而具备并发的同时又具备高性能需要非常好的设计。
-
Nginx可以达到什么样的一个标准呢?
主流的web服务器 32核64G内存,可以轻松达到数千万的并发连接。如果是处理一些简单的静态资源请求,可以达到一百万的RPS。
优点二:可扩展性好
- 可扩展性主要体现在其模块化设计,模块化设计非常的稳定,使得Nginx第三方模块生态圈非常的丰富。甚至有OpenResty这样第三方插件,在他之上又生成了一套生态圈。丰富的生态圈,为我们丰富的功能提供了保障
优点三:高可靠性
- 所谓高可靠性,是因为Nginx 可以在服务上持续不间断的运行数年,而很多Web服务器运行几周或几个月就需要重启,对于Nginx这样一个高并发、高性能的反向代理服务器而言,往往运行在企业内网的边缘节点上,这个时候如果企业想提供4个9、5个9甚至更高的高可用性时,对于Nginx持续运行能够宕机的时间一年可能以秒来计算。
优点四:热部署
- 是指可以在不停止服务的情况下升级Nginx:对于Nginx来说非常重要,因为在Nginx上跑了数百万的并发连接,如果是普通的服务,我们只使用Kill进程重启就可以处理好,但Nginx而言,Kill 进程会导致操作系统为所有的已经建立连接的客户端发送一个TCP中Reset复位包,而客户端是很难处理好复位请求的。在大并发场景下一些偶然事件,就会导致必然的恶性结果。
优点四:BSD许可
- BSDLicense 说明Nginx不仅仅是凯源免费的,而且可以在有定制的需求下我们来修改Nginx的源码,来运行到商业需求上,这是合法的。
其优点不只是这5条,但以上优点我们认为是最核心的特性
以上我们阐述了记录关于Nginx学习的初衷,以及后续的规划。从Nginx的应用场景出发,体现了其在当前企业网络链条中的重要性,又追本溯源回顾其历史,又讲述了它的优点。都是前置概念性的东西,本次的文章就到此了。