第十九讲:Nginx的进程结构
接下来我们来看下Nginx的进程结构
Nginx其实有两种进程结构,一种是单进程结构,一种是多进程结构;单进程结构尼,其实不适用于生产环境,只适合我们做开发;因为在生产环境中我们需要保证Nginx足够健壮,以及Nginx可以利用多核的特性;而单进程的Nginx是做不到这一点的;所以默认的配置中都是打开多进程的nginx;我们来看下多进程的Nginx中;它的进程模型是什么样的?
会有一个父进程叫master process,它会有许多子进程;
子进程会分为两类:一类是cache进程,一类是worker进程;
为什么Nginx采用的是多进程结构,而不是多线程结构尼?
这要从Nginx最核心的一个目的,Nginx要保证它的高可用性和可靠性,而当Nginx在使用了多线程的时候,因为线程是共享同一个地址空间的;所以当某一个第三方模块引发了一个地址空间导致的段错误时,在地址越界出现时会导致整个Ngxin进程全部挂掉;而当我们使用多进程这样的一个Nginx进程模型时,往往不会出现这样的一个问题;
所以Nginx在做它的进程设计时,同样遵循了高可用,高可靠性这样的一个目的;比如说在maste进程中,通常第三方模块是不会在master进程这里加上自己的功能代码的;虽然Nginx在设计的时候是允许第三方模块在master进程中添加自己独有的自定义的一些方法;但是通常没有第三方模块会这么做;那么master进程它被设计用来的目的就是做worker进程的管理的;也就是说所有的worker进程是用来处理真正请求的,而master进程负责监控每个worker进程是不是在正常的工作;需不需要做重新载入配置文件,需不需要做热部署;而我们的cache在做缓存的时候,缓存需要在多个worker进程间共享的,而且缓存不光要被worker进程使用,还要被Cache Manager和Cache Loader进程使用;Cache Manager和Cache Loader也是为反向代理时后端发送的动态请求做缓存所使用的;那么Cache Loader 做缓存的载入Cache Manager做缓存的管理,实际上每个请求使用的缓存还是由worker进程来进行的;那么这些进程间的通讯都是使用共享内存来解决的;
那么有一个问题,为什么worker进程会很多?
我们从下图可以看到,Cache Manager和Cache Loader各有一个进程;master进程是父进程,肯定只有一个进程;那么为什么worker进程会很多尼?主要是因为Nginx采用事件驱动模型以后,它希望每一个woker进程从头到尾占有一颗CPU,所以往往我们不止要把woker进程的数量配置与我们服务器上的CPU核数一样以外;我们还需要把每一个worker进程与某一颗CPU核绑定在一起;这样可以更好的使用CPU核上的CPU缓存,来减少缓存失效的命中率;


浙公网安备 33010602011771号