更多内容,可前往Nginx 简介、安装与控制命令进行浏览

一、nginx进程

两个nginx容器的数据卷 nginx两个进程_数据


ngin在启用的时候,默认有两个进程,一个是master进程,一个是worker进程。

master进程不是用来处理请求的,而只是做一些管理性的工作,是leader,只分配任务,自己不干活。
比如:处理对配置文件的reload。在执行命令./sbin/nginx -s reload时,其实就是给master进程发送了一个信号:需要重载配置文件。
比如:执行命令./sbin/nginx -s stop,也是由master进行来完成的

worker进程是真正处理请求的。本身是单线程的,虽然只有一个进程,但是可以直接处理成千上万的连接(底层是通过NIO的方式来工作的

由于只有一个进程,而一个进程只能用一个CPU,

可以给进程配置成多级进程,充分利用CPU 资源。这样的话就能大大提高并发能力的承载数量。

worker进程越多,处理的并发数量就越多吗?

答案:不是。如果worker进程的数量超出了CPU核数,比如CPU是4核的,但是给了8个进程,但是其实还是4个在工作,还要等待资源,反而会影响性能

两个nginx容器的数据卷 nginx两个进程_nginx反向代理_02


1)nginx启动时,不处理网络请求,主要负责调度工作进程,也就是:加载配置、启动工作进程及非停升级。

所以,nginx启动以后,查看操作系统的进程列表,我们就能看到至少有两个nginx进程。

2)服务器实际处理网络请求及响应的是工作进程(worker),在类unix系统上,nginx可以配置多个worker,而每个worker进程都可以同时处理数以千计的网络请求。

3)模块化设计。nginx的worker,包括核心和功能性模块,核心模块负责维持一个运行循环(run-loop),执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。而其代码的模块化设计,也使得可以根据需要对功能模块进行适当的选择和修改,编译成具有特定功能的服务器。

4)事件驱动、异步及非阻塞,可以说是nginx得以获得高并发、高性能的关键因素,同时也得益于对Linux、Solaris及类BSD等操作系统内核中事件通知及I/O性能增强功能的采用,如kqueue、epoll及event ports。


为什么一个worker进程可以处理成千上万的连接,而Apache一万个连接就需要一万个进程,NIO是如何做到的呢?

答案:浏览器的请求主要流程见下图:

两个nginx容器的数据卷 nginx两个进程_两个nginx容器的数据卷_03


      请求通过进程,执行了一些CPU相关的命令,告诉CPU要从哪个硬盘里面把数据拷贝过来,然后通过网卡返回到浏览器。

数据在拷贝的过程中,首先是通过CPU发起拷贝的指令,拷贝时,按照传统方式,首先会将硬盘中的数据拷贝到内核态(内存),再拷贝到应用态,然后拷贝到网卡,最后将数据拷贝出去,返回到浏览器。

如果按照Apache的做法,在拷贝的过程中,指令发送很快,很快就发送出去了,但指令发送出去之后,进程就没事做了,需要等待数据从硬盘拷贝到内核态(内存),然后从系统态拷贝到应用态。
   从系统态拷贝到应用态是比较快的(因为是内存间的操作),但是从硬盘拷贝到操作系统这个步骤非常慢,Apache就会在这里进行等待,整个进程都是处于等待的状态,当连接越多的时候,相应的整个等待的进程就会越来越多

如果按照Nginx的NIO模式,当发送完拷贝指令之后,进程是不会在这里进行等待的,而是去处理另一个请求,发送其他请求的CPU指令。这样,每个指令发送完就会立马发送第二条…。
   进程不等待,当硬盘的数据完成拷贝,怎么告诉nginx呢?nginx会调用操作系统里面的epool,维护了所有连接的拷贝状态列表,Nginx会去查询,看哪些请求已经准备就绪了,才会继续将数据从内核态到应用态的操作,然后再返回到浏览器,完成一个请求

所以总的来说:关键在于阻塞和不阻塞