nginx架构学习

news2025/1/21 9:35:47

前言

这篇文章主要记录下对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.coloradmin.cn/o/1880518.html

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

相关文章

【ESP32】打造全网最强esp-idf基础教程——14.VFS与SPIFFS文件系统

VFS与SPIFFS文件系统 这几天忙着搬砖,差点没时间更新博客了,所谓一日未脱贫,打工不能停,搬砖不狠,明天地位不稳呀。 不多说了,且看以下内容吧~ 一、VFS虚拟文件系统 先来看下文件系统的定义&#x…

zabbix监控进阶:如何分时段设置不同告警阈值(多阈值告警)

作者 乐维社区(forum.lwops.cn)乐乐 在生产环境中,企业的业务系统状态并不是一成不变的。在业务高峰时段,如节假日、促销活动或特定时间段,系统负载和用户访问量会大幅增加,此时可能需要设置更高的告警阈值…

网络基础:静态路由

静态路由是一种由网络管理员手动配置的路由方式,用于在网络设备(如路由器或交换机)之间传递数据包。与动态路由不同,静态路由不会根据网络状态的变化自动调整。 不同厂商的网络设备在静态路由的配置上有些许差异;下面…

qt文件如何打包成一个独立的exe文件

QT官方给我们安装好了打包软件,就在你QT安装的位置 把这个在cmd打开C:\Qt\6.7.1\mingw_64\bin\windeployqt6.exe(或复制地址) 然后把要打包项目的exe复制到新的空文件夹,再复制他的地址 按回车后生成新文件 再下载打包软件&#…

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

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

树莓派3B读写EEPROM芯片AT24C256

AT24C256是一个Atmel公司的EEPROM存储芯片,容量是256K个bit(也就是32K字节),I2C接口,而树莓派正好有I2C接口,如下图蓝框中的4个IO口, 把AT24C256和这4个口接在一起,这样硬件就准备好…

观察者模式在金融业务中的应用及其框架实现

引言 观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,使得多个观察者对象同时监听某一个主题对象。当这个主题对象发生变化时,会通知所有观察者对象,使它们能够自动更新。…

【NodeJs】入门

目录 一、前导 二、 url模块 三、path模块 四、buffer模块 五、fs模块 六、stream流模块 七、os模块 八、crypto模块 九、util模块 十、http模块 nodejs官网 Node.js — 在任何地方运行 JavaScript nmp是Node.js包管理器,用来安装各种库、框架和工具&…

js自定义内容生成二维码,qrcodejs的使用

qrcodejs qrcodejs是基于原生js的文本转换成二维码的库&#xff0c;轻量且使用方法简单&#xff0c;它的实现原理是通过canvas将重新编码的内容绘制在页面元素上&#xff0c; 使用qrcodejs时可以选择引入它的cdn或者使用npm下载 <script type"text/javascript" …

Nacos配置中心客户端源码分析(一): 客户端如何初始化配置

本文收录于专栏 Nacos 推荐阅读&#xff1a;Nacos 架构 & 原理 文章目录 前言一、NacosConfigBeanDefinitionRegistrar二、NacosPropertySourcePostProcessor三、AbstractNacosPropertySourceBuilder总结「AI生成」 前言 专栏前几篇文章主要讲了Nacos作为服务注册中心相关…

vmware安装debian11

安装vmware16 下载镜像 https://repo.huaweicloud.com/debian-cd/ https://repo.huaweicloud.com/debian-cd/11.7.0/amd64/iso-dvd/ 安装 安装完成之后重启&#xff0c;输入账号密码进入&#xff0c;安装ssh服务器即可使用

park unpark

目录 一、基本使用 二、特点&#xff08;与 wait/notify 对比&#xff09; 三、park & unpark 的原理 一、基本使用 1. park 和 unpark 是 LockSupport 中的方法 2. LockSupport.park();// 暂停线程&#xff0c;线程进入 WAIT 状态 3. LockSupport.unpark(被暂停的线…

数据产品经理知识库构建

概述 数据产品经理是企业中负责管理和推动数据产品的专业人员。他们利用数据来辅助决策&#xff0c;优化产品&#xff0c;提升用户体验。用STAR法则&#xff08;Situation, Task, Action, Result&#xff09;来介绍数据产品经理的角色&#xff0c;应该学习的数据产品&#…

Linux安装Node-RED并实现后台运行及开机启动

首先确保系统中已近成功安装Node.js&#xff0c;并保证需要的合适版本&#xff1a; 关于node.js的安装可以参考我的另一篇博文:《AliyunOS安装Node.js》。 然后就可以使用npm工具安装Node-RED了&#xff0c;很简单使用如下命令&#xff1a; sudo npm install -g --unsafe-per…

各维度卷积神经网络内容收录

各维度卷积神经网络内容收录 卷积神经网络&#xff08;CNN&#xff09;&#xff0c;通常是指用于图像分类的2D CNN。但是&#xff0c;现实世界中还使用了其他两种类型的卷积神经网络&#xff0c;即1D CNN和3D CNN。 在1D CNN中&#xff0c;内核沿1个方向移动。1D CNN的输入和…

可信和可解释的大语言模型推理-RoG

大型语言模型&#xff08;LLM&#xff09;在复杂任务中表现出令人印象深刻的推理能力。然而&#xff0c;LLM在推理过程中缺乏最新的知识和经验&#xff0c;这可能导致不正确的推理过程&#xff0c;降低他们的表现和可信度。知识图谱(Knowledge graphs, KGs)以结构化的形式存储了…

模板方法模式在金融业务中的应用及其框架实现

引言 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它在一个方法中定义一个算法的框架&#xff0c;而将一些步骤的实现延迟到子类中。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤。在金融业务中&#xff…

Python技术笔记汇总(含语法、工具库、数科、爬虫等)

对Python学习方法及入门、语法、数据处理、数据可视化、空间地理信息、爬虫、自动化办公和数据科学的相关内容可以归纳如下&#xff1a; 一、Python学习方法 分解自己的学习目标&#xff1a;可以将学习目标分基础知识&#xff0c;进阶知识&#xff0c;高级应用&#xff0c;实…

【简易版tinySTL】 哈希表与移动语义

基本概念 哈希表&#xff08;HashTable&#xff09;是一个重要的底层数据结构, 无序关联容器包括unordered_set, unordered_map内部都是基于哈希表实现。 哈希表是一种通过哈希函数将键映射到索引的数据结构&#xff0c;存储在内存空间中。哈希函数负责将任意大小的输入映射到…

谷歌开发者新号上架攻略:开发者实战经验分享

前段时间&#xff0c;不少开发者朋友们在纷纷在吐槽新账号没法上架成功。以前谷歌对新号是真的很严格&#xff0c;但现在情况似乎有所好转。 今天&#xff0c;和大家聊聊如何在新号成功上架上“快人一步”&#xff0c;以及怎样增加账号权重提高上架成功率。 首先&#xff0c;我…