nginx基础架构
1、进程与线程
1.1 概念
进程(Process):
是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程(thread):
是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
1.2 二者简单对比
**进程:**指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位。
**线程:**系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。
1.3 如何理解进程与线程
比如一个工厂,我们可以看做是一个系统,这个工厂中会有很多的流水线,这些流水线我们可以看做是一个个进程,也就说这个工厂就是我们的应用程序,每个应用程序可以create出很多的进程,每个进程都会有不同的工作。
对于线程来说是流水线中不同阶段的工人,每个工人负责着流水线在不同节点时的工作,而在进程中,线程也可以去处理不同的工作。
2、异步与同步
2.1 概念
异步:
就是在发出一个调用时,在没有得到结果之前,这个调用不返回结果,但是一但调用返回,就能得到返回值,也就是在调用者得到返回值前会一直处于等待状态,直到获得返回值。
同步:
异步则与同步相反,调用发出之后,这个调用就直接返回了,所以没有返回结果,换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
2.2 如何理解同步与异步
小五打电话问书店老板有没有《nginx优化》这本书,如果是同步机制,书店老板会说,你稍等,“我查一下”,然后开始查找,一直会等到查到为止(时间可能是几秒也可能是1天),然后在告诉你结果。
如果是异步机制,书店老板会直接告诉你我查找一下,查到了我打电话告诉你,然后通话结束,等到查找好了,主动打电话告诉你,也就是通过回调的方式告诉你结果。
3、nginx进程结构
3.1 概念
单进程结构
多进程结构
单进程结构实际上不适用于生产环境,只适合我们做开发调试使用。因为在生产环境中我们必须保持 Nginx 足够健壮以及 Nginx 可以利用多核的一个特性,而单进程的 Nginx 是做不到这一点的,所以默认的配置中都是打开为多进程的 Nginx。
3.2 多进程的Nginx结构进程模型图:
多进程中的 Nginx 进程架构如下图所示,会有一个父进程(Master Process),它会有很多子进程(Child Processes),这些子进程会分为两类:
worker 进程
cache 相关的进程
3.3 作用
Master进程主要作用:
1、解析配置文件
2、初始化数据结构
3、模块配置
4、信号处理
5、网络监听生成
6、工作进程生成以及管理
Worker进程的主要作用:
1、初始化进程
2、调用nginx的各个模块
3、处理接收的请求
3.4 为什么nginx采用多进程结构而不是多线程结构?
1、Nginx最核心的一个目的是要保持高可用性、高可靠性,而当 Nginx 如果使用的是多线程结构的时候,因为线程之间是共享同一个地址空间的,所以当某一个第三方模块引发了一个地址空间导致的段错误时、在地址越界出现时,会导致整个 Nginx 进程全部挂掉。而当采用多进程模型时,往往不会出现这样的问题。从上图可以看到 Nginx 在做进程设计时,同样遵循了实现高可用、高可靠这样的一个目的。
2、master 进程被设计用来的目的是做 worker 进程的管理的,也就是所有的 worker 进程是处理真正的请求的,而 master 进程负责监控每个 worker 进程是不是在正常的工作、需不需要做重新载入配置文件、需不需要做热部署。
3、cache (缓存)是在多个 worker 进程间共享的,而且缓存不仅要被 worker 进程使用,还要被 cache manager 和 cache loader进程 使用。cache manager 和 cache loader 也是为反向代理时,后端发来的动态请求做缓存所使用的,cache loader 只是用来做缓存的载入、cache manager 用来做缓存的管理。实际上每个请求处理时,使用到缓存还是由 worker 进程来进行的。
4、这些进程间的通讯,都是使用共享内存来解决的。可以看到cache manager 和 cache loader各有一个进程,master 进程因为是父进程,所以肯定只有一个。那么 worker 进程为什么会有很多呢?这是因为 Nginx 采用了事件驱动引擎以后,他希望每一个 worker 进程从头到尾占有一颗CPU,所以往往不止要把 worker 进程的数量配置与我们服务器上的 CPU核数一致以外,还需要把每一个worker进程与某一颗CPU核绑定在一起,这样可以更好的使用每颗CPU核上面的CPU缓存来减少缓存失效的命中率。