nginx架构学习

前言

这篇文章主要记录下对nginx架构的学习记录。

架构设计

优秀的模块化设计

高度模块化的设计是Nginx的架构基础。在Nginx中,除了少量的核心代码,其他一切皆
为模块。

在这5种模块中,配置模块与核心模块都是与Nginx框架密切相关的,是其他模块的基
础。而事件模块则是HTTP模块和mail模块的基础,原因参见8.2.2节。HTTP模块和mail模块
的“地位”相似,它们都更关注于应用层面。在事件模块中,ngx_event_core_module事件模块
是其他所有事件模块的基础;在HTTP模块中,ngx_http_core_module模块是其他所有HTTP模
块的基础;在mail模块中,ngx_mail_core_module模块是其他所有mail模块的基础。

事件驱动架构

所谓事件驱动架构,简单来说,就是由一些事件发生源来产生事件,由一个或者多个事
件收集器来收集、分发事件,然后许多事件处理器会注册自己感兴趣的事件,同时会“消
费”这些事件。下图为Nginx处理事件的简单模型:

管理进程、多工作进程设计

Nginx采用一个master管理进程、多个worker工作进程的设计方式,如图所示:

包括完全相同的worker进程、1个可选的cache manager进程以及1个可选的
cache loader进程。

这种设计带来以下优点:
(1)利用多核系统的并发处理能力
现代操作系统已经支持多核CPU架构,这使得多个进程可以占用不同的CPU核心来工
作。如果只有一个进程在处理请求,则必然会造成CPU资源的浪费!如果多个进程间的地位
不平等,则必然会有某一级同一地位的进程成为瓶颈,因此,Nginx中所有的worker工作进
程都是完全平等的。这提高了网络性能、降低了请求的时延。
(2)负载均衡
多个worker工作进程间通过进程间通信来实现负载均衡,也就是说,一个请求到来时更
容易被分配到负载较轻的worker工作进程中处理。这将降低请求的时延,并在一定程度上提
高网络性能。
(3)管理进程会负责监控工作进程的状态,并负责管理其行为
管理进程不会占用多少系统资源,它只是用来启动、停止、监控或使用其他行为来控制
工作进程。首先,这提高了系统的可靠性,当工作进程出现问题时,管理进程可以启动新的
工作进程来避免系统性能的下降。其次,管理进程支持Nginx服务运行中的程序升级、配置
项的修改等操作,这种设计使得动态可扩展性、动态定制性、动态可进化性较容易实现。

内存池的设计

      为了避免出现内存碎片、减少向操作系统申请内存的次数、降低各个模块的开发复杂
度,Nginx设计了简单的内存池。这个内存池没有很复杂的功能:通常它不负责回收内存池
中已经分配出的内存。这种内存池最大的优点在于:把多次向系统申请内存的操作整合成一
次,这大大减少了CPU资源的消耗,同时减少了内存碎片。
       因此,通常每一个请求都有一个这种简易的独立内存池(在第9章中会看到,Nginx为每
一个TCP连接都分配了1个内存池,而在第10章和第11章,HTTP框架为每一个HTTP请求又分
配了1个内存池),而在请求结束时则会销毁整个内存池,把曾经分配的内存一次性归还给
操作系统。这种设计大大提高了模块开发的简单性(如在前几章中开发HTTP模块时,申请
内存后都不用关心它释放的问题),而且因为分配内存次数的减少使得请求执行的时延得到
了降低,同时,通过减少内存碎片,提高了内存的有效利用率和系统可处理的并发连接数,
从而增强了网络性能。

使用统一管道过滤器模式的HTTP过滤模块

     有一类HTTP模块被命名为HTTP过滤模块,其中每一个过滤模块都有输入端和输出端,
这些输入端和输出端都具有统一的接口。这些过滤模块将按照configure执行时决定的顺序组
成一个流水线式的加工HTTP响应的中心,每一个过滤模块都是完全独立的,它处理着输入
端接收到的数据,并由输出端传递给下一个过滤模块。每一个过滤模块都必须可以增量地处
理数据,也就是说能够正确处理完整数据流的一部分。
     这种统一管理过滤器的设计方式的好处非常明显:首先它允许把整个HTTP过滤系统的
输入/输出简化为一个个过滤模块的简单组合,这大大提高了简单性;其次,它提供了很好
的可重用性,任意两个HTTP过滤模块都可以连接在一起(在可允许的范围内);再次,整
个过滤系统非常容易维护、增强。例如,开发了一个新的过滤模块后,可以非常方便地添加
到过滤系统中,这是一种高可扩展性。又如,旧的过滤模块可以很容易地被升级版的过滤模
块所替代,这是一种高可进化性;接着,它在可验证性和可测试性上非常友好,我们可以灵
活地变动这个过滤模块流水线来验证功能;最后,这样的系统完全支持并发执行。

其他一些用户模块

      Nginx还有许多特定的用户模块。例如,ngx_http_stub_status_module模块提供对所有HTTP连接状态的监控,这就提高了系统可见性。而ngx_http_gzip_filter_module过滤模块和ngx_http_gzip_static_module模块使得相同的吞吐量传送了更多的信息,自然也就提高了网络效率。我们也可以开发这样的模块,让Nginx变得更好。

      后续再对nginx架构各块原理进行更细化的学习。

参考书籍:《深入理解Nginx模块开发与架构解析第2版》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pharmacy Management System v1.0 文件上传漏洞(CVE-2022-30887)

前言 CVE-2022-30887 是一个存在于 Pharmacy Management System v1.0 中的远程代码执行(RCE)漏洞。这个漏洞存在于 /php_action/editProductImage.php 组件中。攻击者可以通过上传一个精心制作的图像文件来执行任意代码。 漏洞详细信息 漏洞描述: Pha…

第二十三课,再识字符串

前言,再识字符串 字符串是我们学习python编程第一眼见到的东西,一行print(“hello world”)可谓是太亲切了,但在此之前我们对字符串的认知也仅局限于如何用单引号、双引号、三引号去定义字符串并打印,今天开始我们就更深入地去理…

【大数据】StarRocks的系统架构

StarRocks 架构简洁,整个系统的核心只有 FE(Frontend)、BE (Backend) 或 CN (Compute Node) 两类进程,方便部署与维护,节点可以在线水平扩展,元数据和业务数据都有副本机制,确保整个系统无单点。…

轻松解锁电脑强悍性能,4000MHz的玖合星舞 DDR4 内存很能打

轻松解锁电脑强悍性能,4000MHz的玖合星舞 DDR4 内存很能打 哈喽小伙伴们好,我是Stark-C~ 很多有经验的电脑玩家在自己DIY电脑选购内存条的时候,除了内存总容量,最看重的参数那就是频率了。内存频率和我们常说的CPU主频一样&…

通用管理页面的功能实现

在Windows Forms(WinForms)应用程序中,创建一个通用的管理页面通常涉及对数据的增删改查(CRUD)操作,以及一些额外的功能,如数据过滤、排序、导出和导入等。 先看一个仓库管理页面要素。 仓库管…

uniapp开发H5、手机APP、微信小程序 可拖动菜单按钮

ml-fab 插件地址:https://ext.dcloud.net.cn/plugin?id18909 1、可拖拽悬浮按钮 ml-fab,支持自定义插槽,点击可展开一个图标按钮菜单,可随意拖拽。 2、支持自定义插槽,可实现自定义配置。 3、操作简单易上手。 ml-f…

同元软控受邀出席2024年工业软件与新质生产力创新发展论坛

近日,由广东省工业软件学会主办的“2024年工业软件与新质生产力创新发展论坛”在广州成功举办。同元软控深圳子公司副总经理周胜受邀出席,并作《数智驱动创新,科学计算与系统建模仿真加速新质生产力进化》主题演讲。 本次论坛集结工业软件界…

【IVI】CarService启动-Android13

【IVI】CarService启动-Android13 1、CarServiceImpl启动概述2、简要时序图 1、CarServiceImpl启动概述 【IVI】CarService启动: CarServiceHelperService中绑定CarServiceICarImpl初始化各种服务 packages/services/Car/README.md 2、简要时序图

PCIe物理层_CTLE(continuous time linear equalizer)

1.CTLE(continuous time linear equalizer) 的作用 信号在介质的传输过程中存在趋肤效应(skin effiect)和能量损耗,在接收端数据会存在失真,并且呈现出低通特性。什么意思呢?就是低频率的信号衰减幅度小&#xff0c…

音频接口电路的PCB设计

Audio接口是音频插孔,即音频接口,可分为Audio in接口和Audio out接口。音频接口是连接麦克风和其他声源与计算机的设备,其在模拟和数字信号之间起到了桥梁连接的作用。对于平台的数字音频接RK3588口,需遵循《Rockchip RK3588 High…

本地项目上传到GitHub上(李豆)

本地项目上传到GitHub上(李豆) 准备工作: 本地需要有 git 也需要有一个 GitHub 账号 首先需要在 GitHub 新建一个空仓库 在想要上传项目的文件夹中使用 Git 命令操作 初始化: git init与 github 仓库进行链接 :git remote add origin …

isspace()方法——判断字符串是否只由空格组成

自学python如何成为大佬(目录): https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isspace()方法用于判断字符串是否只由空格组成。isspace()方法的语法格式如下: str.isspace() 如果字符串中只包含空格&…

[深入理解DDR] 总目录

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR》 蓝色的是传送门,点击链接即可到达指定文章。 图。 DDR 分类 导论 [RAM] DRAM 导论:DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生 运存与内存?内存与存…

AI大模型API:驱动人工智能创新的核心引擎

在当今快速发展的人工智能领域,AI大模型API成为了开发者必备的利器。这些API为开发者提供了强大的人工智能模型和算法,使他们能够轻松地构建智能化应用和解决方案。作为开发者,我们可以借助AI大模型API实现自然语言处理、图像识别、声音合成等…

Arduino IDE 的安装与esp32项目的创建

1打开官网下载 官网 1-1下载完成后安装即可,会弹出一些按安装提示点击安装 2切换为中文模式 2-1点击Flie,在点击图中高亮的位置,进入 2-2选择语言 3创建esp32项目 3-1在线安装(不一定成功,可以一直试) …

Vue3学习(一)

创建组件实例:我们传入 createApp 的对象实际上是一个组件 import { createApp } from vue // 从一个单文件组件中导入根组件 import App from ./App.vueconst app createApp(App) 大多数真实的应用都是由一棵嵌套的、可重用的组件树组成的。 App (root compone…

问题处理记录与深入:系统线程耗尽,Java无法调用native方法新建线程

1. 问题处理记录 1.1 问题描述 公司使用Presto作为OLAP查询引擎,Presto的coordinator节点在运行过程中报错 java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reachedat java.base/java.lang.Thre…

Google推出开源模型Gemma 2:性能大幅提升与创新训练方法

引言 近日,Google推出了开源模型Gemma 2,吸引了广大研究人员和开发者的关注。相比上一代模型,Gemma 2在性能和可用性方面实现了显著提升,提供了9B和27B两个版本,并且对外开放免费使用。本文将深入探讨Gemma 2的技术细…

架构师篇-10、DDD实战篇:通过领域模型落地系统

基于领域模型的设计与开发 数据库设计程序设计微服务设计 在线订餐系统的领域事件通知 微服务拆分 事件风暴会议 梳理领域事件进行领域建模识别聚合关系划分限界上下文 用户下单领域模型 更新后的模型 领域模型的设计实现过程 数据库设计 数据库映射:一对一关系…

SpringBoot使用redis 笔记(视频摘抄 哔哩哔哩博主(感谢!):遇见狂神)

springboot集成redis步骤 1.创建springboot项目 2.配置连接 3.测试 创建springboot项目 创建以一个Maven项目 创建之后查看pom.xml配置文件,可以看到 pom文件里面导入了 data-redis 的依赖,那我们就可以在知道,springboot集成redis操作…