【Nginx】Nginx 工作原理

Nginx 架构以及工作流程图

【Nginx】Nginx 工作原理
Nginx 在是以守护进程的形式在后台运行,采用 多线程+异步非阻塞IO事件模型 来处理各种请求。多线程模型包括一个 master 进程,多个 worker 进程,一般 worker 进程个数是根据服务器 CPU 核数来决定的。master 进程负责管理 Nginx 本身和其他 worker 进程。

Master 进程的主要职责

  • 读取并验证配置信息(nginx.conf)
  • 创建,绑定,关闭套接字(IP + PORT)
  • 启动,终止,维护 worker 进程的个数

Worker 进程的主要职责

  • 处理连接和请求
  • Worker 进程的个数由配置文件决定,一般和 CPU 个数相关,配置几个就有几个 Worker 进程。

Nginx 如何实现热部署

所谓热部署,就是修改配置文件 nginx.conf 后,不需要重启 nginx,不需要中断请求,就能让配置文件生效。

在修改完配置文件后,会重新生成新的 worker 进程,会以新的配置进行处理请求,而且新的请求也会交给新的 worker 进程处理,老的 worker 进程,会在执行完请求直接关闭。

Nginx 如何做到高并发下的高效处理

Nginx 采用了 Linux 的 epoll 模型,epoll 模型是基于事件驱动机制,它可以监控多个事件是否准备完毕,如果 OK,那么放入 epoll 队列中,这个过程是异步的。worker 只需要从 epoll 队列循环处理即可。

Worker 如何处理请求

一个请求由一个 worker 进程处理。

Nginx 在内部维护了一个 accept_mutex,其实就是锁,确保在某一时刻,一个请求只能被一个 worker 进程捕获。当一个 worker 进程在 accept 这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。

异步/非阻塞/事件驱动

我们知道,很多请求来了,他们大多需要读写数据,发生IO请求,此时程序就会发生中断,如果此时我们一直等待IO调用结束,才继续工作,那么这种就是阻塞的,那么很显然很多请求来了,都处于等待状态,CPU就将处于空闲状态,为了提供高并发的能力,Nginx采用的是非阻塞的方式。如果发生IO中断,那么你去做你的事情,但是过一段时间来看看IO调用是否结束,这就是非阻塞:你可以做更多的事情,但是你得时不时的检查中断状态,带来的开销也不小。

为了更高效,Nginx利用了LINUX的EPOLL模型(其他系统类似):

EPOLL模型,提供一种事件驱动机制,它可以监控多个事件是否准备好了,如果准备好了,那么就放入EPOLL队列中。这种机制是异步的。通过这样,WORKER进程只需要循环处理EPOLL队列中的请求,我们只需要在请求间不断切换,而这种切换是不需要付出什么代价的,通过这种循环处理已经准备好的请求,从而Nginx可以高效的处理高并发的问题。