架构概览
了解Nginx的架构,能更加清楚的了解Nginx的组成部分,已经了解Nginx是怎么进行工作的,学习的时候也更有方向性。
先看一张Nginx架构图:
两种进程
先看图的最上面,可以看到,Nginx有两种进程,一个master进程,一种是worker进程。nginx启动时,会生成两种类型的进程,一个是主进程(Master),一个(windows版本的目前只有一个)或者多个工作进程(Worker)。如图:
主进程并不处理网络请求,主要负责调度工作进程,也就是图示的三项:加载配置、启动工作进程及非停升级。所以,nginx启动以后,查看操作系统的进程列表,我们就能看到至少有两个nginx进程。
服务器实际处理网络请求及响应的是工作进程(worker),在类unix系统上,nginx可以配置多个worker,而每个worker进程都可以同时处理数以千计的网络请求。
worker进程的数量当然也不是越多越好,实际调优的时候,一般要根据cpu 的数量而定。
为什么这几个worker进程却能支撑上万甚至上十万的并发呢?
原因是Nginx设计的时候是基于非阻塞式的方式,能做到非阻塞是因为它的线程模型是基于Linux里面的epoll/select模型,这个也类似于我们java中nio的多路复用选择器模型。事件驱动加上异步非阻塞的io模型,可以说是nginx得以获得高并发、高性能的关键因素。同时学过netty的同学会发现,底层是有很多相似之处的。
模块化设计
Nginx还有一个特点就是模块化设计。nginx的worker,包括核心和功能性模块,核心模块负责维持一个运行循环(run-loop),执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。而其代码的模块化设计,也使得我们可以根据需要对功能模块进行适当的选择和修改,编译成具有特定功能的服务器。
下面是Nginx的核心模块:
上面是简单的架构模型和模块。后面会讲每个模块相关的配置以及性能调优。
关于非阻塞线程模型和零拷贝的内容,可以专门学习一下类unix操作系统的知识,反正要成为资深程序员这些知识也是必经的一个过程。
反向代理
从架构图上可以看到剩下的内容还有下面几个:
包括反向代理功能和缓存管理功能。代理功能也是nginx非常非常核心的一个知识点。涉及到nginx最常用的负载均衡的功能。说道反向代理,先说一下正向代理。
什么是正向代理?
比如在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!
上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
什么是反向代理?
明白了什么是正向代理,我们继续看关于反向代理的处理方式,举例如我大天朝的某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用nginx进行反向代理实现的,并且通过封装nginx和其他的组件之后起了个高大上的名字:Tengine。
如下图:
通过上述的图解大家就可以看清楚了,多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色
反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!
同时上面的例子也是最经典的负载均衡功能,这种方式能直接的提高并发能力。