架构师详解:Nginx 架构

2022-12-18 0 242

架构师详解:Nginx 架构

书名镜像:https://my.oschina.net/u/3770281/blog/1802493

译者:Java构架撷取

结语:不可否认,Nginx 伺服器是两个高效能的 Web 和逆向代理伺服器。Nginx 在惨烈的 Web 伺服器消费市场竞争中依然持续保持的增长势头,曾一度正式成为 Web 伺服器消费市场的中后期之秀,这所有人跟 Nginx 的构架结构设计是密不可分的。

Nginx 组件化结构设计

度组件化的结构设计是 Nginx 的构架此基础。Nginx 伺服器被降解为数个组件,每一组件是两个机能组件,只负责管理工作另一方面的机能,组件间严苛遵从“高contained,低谐振”的准则。

架构师详解:Nginx 架构

核心理念组件

核心理念组件是 Nginx 伺服器恒定运转不可或缺的组件,提供更多严重错误笔记历史记录、命令行导出、设计模式监督机制、民主化管理工作等核心理念机能。

国际标准 HTTP 组件

国际标准 HTTP 组件提供更多 HTTP 协定导出有关的机能,如:端口配置、页面代码增设、HTTP 积极响应头增设等。

可选 HTTP 组件

可选 HTTP 组件主要用于扩展国际标准的 HTTP 机能,让 Nginx 能处理一些特殊的服务,如:Flash 多媒体传输、导出 GeoIP 请求、SSL 支持等。

邮件服务组件

邮件服务组件主要用于支持 Nginx 的邮件服务,包括对 POP3 协定、IMAP 协定和 SMTP 协定的支持。

第三方组件

第三方组件是为了扩展 Nginx 伺服器应用,完成开发者自定义机能,如:Json 支持、Lua 支持等。

Nginx 请求处理方式

Nginx 是两个高效能的 Web 伺服器,能够同时处理大量的并发请求。它结合多民主化监督机制和异步监督机制,异步监督机制使用的是异步非阻塞方式,接下来就给大家介绍一下 Nginx 的多线程监督机制和异步非阻塞监督机制。

多民主化

伺服器每当收到两个客户端时。就有伺服器主民主化(master process)生成两个子民主化(worker process)出来和客户端建立连接进行交互,直到连接断开,该子民主化就结束了。

使用民主化的好处是各个民主化间相互独立,不需要加锁,减少了使用锁对性能造成影响,同时降低编程的复杂度,降低开发成本。

其次,采用独立的民主化,可以让民主化互相间不会影响,如果一个民主化发生异常退出时,其它民主化恒定工作,master 民主化则很快启动新的 worker 民主化,确保服务部中断,将风险降到最低。

缺点是操作系统生成两个子民主化需要进行内存复制等操作,在资源和时间上会产生一定的开销;当有大量请求时,会导致系统性能下降。

异步非阻塞

每一工作民主化使用异步非阻塞方式,可以处理数个客户端请求。当某个工作民主化接收到客户端的请求以后,调用 IO 进行处理,如果不能立即得到结果,就去处理其他的请求(即为非阻塞);而客户端在此期间也无需等待积极响应,可以去处理其他事情(即为异步);当 IO 返回时,就会通知此工作民主化;该民主化得到通知,暂时挂起当前处理的事务去积极响应客户端请求。

Nginx 设计模式模型

在 Nginx 的异步非阻塞监督机制中,工作民主化在调用 IO 后,就去处理其他的请求,当 IO 调用返回后,会通知该工作民主化。对于这样的系统调用,主要使用 Nginx 伺服器的设计模式模型来实现。

架构师详解:Nginx 架构

如上图所示,Nginx 的设计模式模型由事件收集器、事件发送器和事件处理器三部分基本单元组成。其中,事件收集器负责管理工作收集 worker 民主化的各种 IO 请求,事件发送器负责管理工作将 IO 事件发送到事件处理器,而事件处理器负责管理工作各种事件的积极响应工作。

事件发送器将每一请求放入两个待处理事件的列表,使用非阻塞 I/O 方式调用“事件处理器”来处理该请求。其处理方式称为“多路 IO 复用方法”,常见的包括以下三种:select 模型、poll 模型、epoll 模型。

针对上面的技术我特意整理了一下,有很多技术不是靠几句话能讲清楚,所以干脆找朋友录制了一些视频,很多问题其实答案很简单,但是背后的思考和逻辑不简单,要做到知其然还要知其所以然。

Nginx 结构设计构架

Nginx 伺服器使用 master/worker 多民主化模式。多线程启动和执行的流程如下:主程序 Master process 启动后,通过一个 for 循环来接收和处理外部信号;主民主化通过 fork() 函数产生子民主化,每一子民主化执行两个 for 循环来实现 Nginx 伺服器对事件的接收和处理。

一般推荐 worker 民主化数与 cpu 内核数一致,这样一来不存在大量的子民主化生成和管理工作任务,避免了民主化间消费市场竞争 CPU 资源和民主化切换的开销。而且 Nginx 为了更好的利用多核特性,提供更多了 cpu 亲缘性的绑定选项,我们可以将某两个民主化绑定在某两个核上,这样就不会因为民主化的切换带来 cache 的失效。

对于每一请求,有且只有两个工作民主化对其处理。首先,每一 worker 民主化都是从 master 民主化 fork 过来,在 master 民主化里面,先建立好需要 listen 的 socket(listenfd)之后,然后再 fork 出数个 worker 民主化。所有 worker 民主化的 listenfd 会在新连接到来时变得可读,为保证只有两个民主化处理该连接,所有 worker 民主化在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个民主化注册 listenfd 读事件,在读事件里调用 accept 接受该连接。

当两个 worker 民主化在 accept 这个连接之后,就开始读取请求,导出请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样两个完整的请求是这样的了。我们可以看到,一个请求,完全由 worker 民主化来处理,而且只在两个 worker 民主化中处理。

架构师详解:Nginx 架构

在 Nginx 伺服器的运转过程中,主民主化和工作民主化需要民主化交互。交互依赖于 Socket 实现的管道来实现。

Master-Worker 交互

这条管道与普通的管道不同,它是由主民主化指向工作民主化的单向管道,包含主民主化向工作民主化发出的指令,工作民主化 ID 等;同时主民主化与外界通过信号通信;每一子民主化具备接收信号,并处理相应的事件的能力。

worker-worker 交互

这种交互是和 Master-Worker 交互是基本一致的,但是会通过主民主化。工作民主化间是相互隔离的,所以当工作民主化 W1 需要向工作民主化 W2 发指令时,首先找到 W2 的民主化 ID,然后将正确的指令写入指向 W2 的通道。W2 收到信号采取相应的措施。

总结

通过这篇文章,我们对 Nginx 伺服器的整体构架有了两个整体的认识。包括其组件化的结构设计、多民主化和异步非阻塞的请求处理方式、设计模式模型等。通过这些理论知识,对于我们以后学习 Nginx 的源码有很大的帮助;也推荐大家多看看 Nginx 的源码,才能更好地领悟 Nginx 的结构设计思想。

架构师详解:Nginx 架构

推荐阅读

谷歌终于开放 “.app” 顶级域名注册

可以抛弃 Python 了?Google 开源 Swift for TensorFlow 意味着什么

宣布 Java 8 停止维护后,Oracle 又毙掉了 JavaOne

期待已久的 Ubuntu 18.04 LTS 终于正式发布

图文简述 Java 字节码,想不懂都难

架构师详解:Nginx 架构

点击

架构师详解:Nginx 架构

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务