转载请备注来源: 《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个核心模块则管理其他类型的非核心模块。其关系如下图所示:

1563514017045

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会定期整理磁盘上的缓存,以使得大小在配置文件的要求内。
diagram

这样设计的优点是:

  • 充分利用多核系统的并发能力。使得每个worker进程都分别占用不同的CPU核心来工作。
  • 负载均衡。多个worker工作进程通过进程间通信来实现负载均衡。
  • 管理进程不会占用太多系统资源,提高了系统的可靠性。

所以,Nginx进程的配置在大多数情况下都建议worker进程数跟CPU核数保持一致,你也可以直接通过以下设置让nginx自动去调整:

worker_processes auto;

当nginx服务器运行的时候,只有worker进程会一直忙碌着。每个worker进程会以费阻塞的方式处理多个连接,减少了上下文切换的数量。

进程可以使用共享内存进行通信,以共享缓存数据、session数据以及其他资源。

Nginx状态机调度原理

img

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

Internet Requests

状态机包含一系列重要的指令告诉Nginx如何处理一个请求。大多数web服务器都使用跟nginx类似的状态机方法,唯一区别的是具体的实现细节。

Nginx事件驱动模型

Nginx采用异步非阻塞机制处理请求,其实现主要依靠事件驱动模型实现。这个可以说是Nginx获得高并发、高性能的关键因素。Nginx事件处理简单模型如下:

1563502125849

如上图所示,Nginx的事件驱动模型由事件收集者、事件分发者和事件消费者三部分组成。

  • 事件收集者:负责收集worker进程的各种请求
  • 事件分发者:负责将请求发送到事件消费者
  • 事件消费者:负责各种事件的响应工作

转载请备注来源: 《Nginx架构基础》 | shuwoom.com

打赏

发表评论

电子邮件地址不会被公开。