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.rhkb.cn/news/365373.html

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

相关文章

【Python】利用代理IP爬取当当网数据做数据分析

前言 在数字化浪潮的推动下,电商平台已经彻底改变了我们的购物方式。从简单的在线交易到复杂的用户交互,电商平台积累了海量的用户数据。这些数据,如同隐藏在深海中的宝藏,等待着被发掘和利用。通过分析用户的浏览、搜索、购买等行…

华为RH2288H V2服务器,远程端口安装Linux操作系统

1、管理口 每台服务器的管理口不一样的,假如我的管理IP地址为:192.168.111.201 使用网线,将管理口和自己电脑连接起来,自己ip地址设置成和管理ip同一网段。 使用 ie 浏览器,如果是Edge,必须在Internet Exp…

基于局域网下的服务器连接、文件传输以及内网穿透教程 | 服务器连接ssh | 服务器文件传输scp | 内网穿透frp | 研究生入学必备 | 深度学习必备

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 📌本篇博客分享的是基于局域网下的服务器连接🔗、文件传输以及内网穿透教程,内容非常完备✨,涵盖了在服务器上做深度学…

Mojo — 适用于所有人工智能开发人员的编程语言

Mojo语言是一个由人工智能公司Modular推出的全新编程语言,专为AI开发者设计。Mojo的语法与Python相似,但结合了Python的易用性和C语言的高性能,旨在解锁AI硬件的可编程性和AI模型的可扩展性。 Modular这个公司则是一个非常年轻的新生AI创业公…

观成科技:证券行业加密业务安全风险监测与防御技术研究

摘要:解决证券⾏业加密流量威胁问题、加密流量中的应⽤⻛险问题,对若⼲证券⾏业的实际流量内容进⾏调研分析, 分析了证券⾏业加密流量⾯临的合规性⻛险和加密协议及证书本⾝存在的⻛险、以及可能存在的外部加密流量威 胁,并提出防…

第三方服务提供商的五大风险

亚马逊如何应对网络安全挑战 关键网络安全统计数据和趋势 移动优先世界中安全和隐私策略 当今数字时代网络安全的重要性 用户无法停止犯安全错误的 3 个原因 首席安全官可能过于依赖 EDR/XDR 防御 随着业务流程变得越来越复杂,公司开始转向第三方来提高其提供关…

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

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

Web后端开发之前后端交互

http协议 http ● 超文本传输协议 (HyperText Transfer Protocol)服务器传输超文本到本地浏览器的传送协议 是互联网上应用最为流行的一种网络协议,用于定义客户端浏览器和服务器之间交换数据的过程。 HTTP是一个基于TCP/IP通信协议来传递数据. HTT…

Transformer详解encoder

目录 1. Input Embedding 2. Positional Encoding 3. Multi-Head Attention 4. Add & Norm 5. Feedforward Add & Norm 6.代码展示 (1)layer_norm (2)encoder_layer1 最近刚好梳理了下transformer,今…

文件系统(操作系统实验)

实验内容 (1)在内存中开辟一个虚拟磁盘空间作为文件存储器, 在其上实现一个简单单用户文件系统。 在退出这个文件系统时,应将改虚拟文件系统保存到磁盘上, 以便下次可以将其恢复到内存的虚拟空间中。 (2&…

MySQL-java连接MySQL数据库+JDBC的使用

目录 1.准备所需要资源 2.导入驱动包 3.连接数据库步骤 首先在MySQL中创建好数据库和表 代码实现连接数据库 1.准备所需要资源 1.mysql和驱动包 我用的是5.7的mysql和5.1.49的驱动包,链接放在网盘里,需要的自取 链接:https://pan.bai…

二轴机器人装箱机:重塑物流效率,精准灵活,引领未来装箱新潮流

在现代化物流领域,高效、精准与灵活性无疑是各大企业追求的核心目标。而在这个日益追求自动化的时代,二轴机器人装箱机凭借其较佳的性能和出色的表现,正逐渐成为装箱作业的得力助手,引领着未来装箱新潮流。 一、高效:重…

【自动化测试】Selenium自动化测试框架 | 相关介绍 | Selenium + Java环境搭建 | 常用API的使用

文章目录 自动化测试一、selenium1.相关介绍1.Selenium IDE2.Webdriverwebdriver的工作原理: 3.selenium Grid 2.Selenium Java环境搭建3.常用API的使用1.定位元素2.操作测试对象3.添加等待4.打印信息5.浏览器的操作6.键盘事件7.鼠标事件8.定位一组元素9.多层框架定…

springcloud-config 客户端启用服务发现client的情况下使用metadata中的username和password

为了让spring admin 能正确获取到 spring config的actuator的信息,在eureka的metadata中添加了metadata.user.user metadata.user.password eureka.instance.metadata-map.user.name${spring.security.user.name} eureka.instance.metadata-map.user.password${spr…

HTTP协议和Nginx

一、HTTP协议和Nginx 1.套接字Socket 套接字Socket是进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换,SocketAPI出现于1983年BSD4.2实现在建立通信连接的每一端,进程间的传输…

【单元测试】Controller、Service、Repository 层的单元测试

Controller、Service、Repository 层的单元测试 1.Controller 层的单元测试1.1 创建一个用于测试的控制器1.2 编写测试 2.Service 层的单元测试2.1 创建一个实体类2.2 创建服务类2.3 编写测试 3.Repository 1.Controller 层的单元测试 下面通过实例演示如何在控制器中使用 Moc…

Uniapp 默认demo安装到手机里启动只能看得到底tab无法看到加载内容解决方案

Uniapp 默认demo安装到手机里以后,启动APP只能看到底tab栏,无法看到每个tab页对应的内容,HBuilder会有一些这样的报错信息: Waiting to navigate to: /pages/tabBar/API/API, do not operate continuously: 解决方案:…

OpenCV 调用自定义训练的 YOLO-V8 Onnx 模型

一、YOLO-V8 转 Onnx 在本专栏的前面几篇文章中,我们使用 ultralytics 公司开源发布的 YOLO-V8 模型,分别 Fine-Tuning 实验了 目标检测、关键点检测、分类 任务,实验后发现效果都非常的不错,但是前面的演示都是基于 ultralytics…

SpringBoot + mkcert ,解决本地及局域网(内网)HTTPS访问

本文主要解决访问SpringBoot开发的Web程序,本地及内网系统,需要HTTPS证书的问题。 我测试的版本是,其他版本不确定是否也正常,测试过没问题的小伙伴,可以在评论区将测试过的版本号留下,方便他人参考: <spring-boot.version>2.3.12.RELEASE</spring-boot.vers…

快速将网页封装成APP:小猪APP分发助您一臂之力

你是否曾经有一个绝妙的网页&#xff0c;但苦于无法将其变成手机APP&#xff1f;其实&#xff0c;你并不孤单。越来越多的企业和开发者希望将自己的网站封装成APP&#xff0c;以便更好地接触到移动端用户。我们就来聊聊如何快速将网页封装成APP&#xff0c;并探讨小猪APP分发在…