Nginx架构基础
转载请备注来源: 《Nginx架构基础》 | shuwoom.com
本文摘要
通过本篇文章,我们会初步介绍nginx的模块化设计只是、nginx worker进程模型、nginx调度机原理以及nginx处理事件的模型(事件驱动模型)。通过阅读本片文章,你可以快速对Nginx的架构有一个基本的认识。
Nginx的模块化设计
Nginx的架构基础是高度模块化的,所有模块都是已ngx_module_t结构体表示,该结构体内部定义了7个回调方法,它们负责模块的初始化和退出。
ctx是一个void指针,ctx可以指向不同类型模块的通用接口,官方提供了5大类模块,与ctx接口的对应关系如下:
- 核心模块:接口为ngx_core_module_t,类型宏为NGX_CORE_MODULE
- HTTP模块:接口为ngx_http_modult_t,类型宏为NGX_HTTP_MODULE
- 事件模块:接口为ngx_event_module_t,类型宏为NGX_EVENT_MODULE
- mail模块:接口为ngx_mail_module_t,类型宏为NGX_MAIL_MODULE
- 配置模块:接口为NULL,类型宏为NGX_CONF_MODULE
Nginx框架调用6个核心模块,而这6个核心模块则管理其他类型的非核心模块。其关系如下图所示:

Nginx Worker进程模型
我们通过如下命令可以看到nginx的进程分布结构:
[root@VM_16_4_centos ~]# ps -ef --forest|grep nginx|grep -v grep root 17899 1 0 Jul18 ? 00:00:00 nginx: master process /usr/local/services/nginx-1.0/sbin/nginx -c /usr/local/services/nginx-1.0/conf/nginx.conf nginx 22494 17899 0 Jul18 ? 00:00:01 \_ nginx: worker process nginx 22495 17899 0 Jul18 ? 00:00:01 \_ nginx: worker process nginx 22496 17899 0 Jul18 ? 00:00:02 \_ nginx: worker process nginx 22497 17899 0 Jul18 ? 00:00:01 \_ nginx: worker process
Nginx进程结构如下图所示,包含master进程、worker进程以及管理缓存的cache进程。
- master进程:master进程主要用来管理worker进程。包括接收外部的信号、向worker进程发送信号、监控worker进程运行状态、worker进程重启、平滑升级等,不负责网络事件的处理。
- worker进程:worker进程主要处理网络事件。worker进程之间是对等、独立的,它们共同竞争处理来自客户端的请求,一个请求只能在一个worker进程中处理。
- cache loader进程在启动时把磁盘上的缓存加载到内存中之后就退出,所以它的调用频率很低,资源消耗也很少。
- cache manager会定期整理磁盘上的缓存,以使得大小在配置文件的要求内。

这样设计的优点是:
- 充分利用多核系统的并发能力。使得每个worker进程都分别占用不同的CPU核心来工作。
- 负载均衡。多个worker工作进程通过进程间通信来实现负载均衡。
- 管理进程不会占用太多系统资源,提高了系统的可靠性。
所以,Nginx进程的配置在大多数情况下都建议worker进程数跟CPU核数保持一致,你也可以直接通过以下设置让nginx自动去调整:
worker_processes auto;
当nginx服务器运行的时候,只有worker进程会一直忙碌着。每个worker进程会以费阻塞的方式处理多个连接,减少了上下文切换的数量。
进程可以使用共享内存进行通信,以共享缓存数据、session数据以及其他资源。
Nginx状态机调度原理

Nginx worker进程一开始通过监听sockets等待事件到来 (accept_mutex和kernel socket sharding)。事件由新传入的连接启动。这些连接会被分配到状态机中(HTTP状态机是应用最广泛的),nginx自身也为原始TCP、Mail等实现了状态机,如下图所示:

状态机包含一系列重要的指令告诉Nginx如何处理一个请求。大多数web服务器都使用跟nginx类似的状态机方法,唯一区别的是具体的实现细节。
Nginx事件驱动模型
Nginx采用异步非阻塞机制处理请求,其实现主要依靠事件驱动模型实现。这个可以说是Nginx获得高并发、高性能的关键因素。Nginx事件处理简单模型如下:

如上图所示,Nginx的事件驱动模型由事件收集者、事件分发者和事件消费者三部分组成。
- 事件收集者:负责收集worker进程的各种请求
- 事件分发者:负责将请求发送到事件消费者
- 事件消费者:负责各种事件的响应工作
转载请备注来源: 《Nginx架构基础》 | shuwoom.com