Nginx 核心架构设计,揭秘其为何能支持高并发?

沙海 2021年5月24日02:38:11Java评论27字数 3347阅读11分9秒阅读模式
摘要

Nginx 核心架构设计,揭秘其为何能支持高并发? 点击关注 ? 芋道源码

Nginx 核心架构设计,揭秘其为何能支持高并发?

点击关注 ? 芋道源码 文章源自JAVA秀-https://www.javaxiu.com/25240.html

收录于话题文章源自JAVA秀-https://www.javaxiu.com/25240.html

#芋道源码文章源自JAVA秀-https://www.javaxiu.com/25240.html

81个文章源自JAVA秀-https://www.javaxiu.com/25240.html

点击上方“芋道源码”,选择“设为星标文章源自JAVA秀-https://www.javaxiu.com/25240.html

管她前浪,还是后浪?文章源自JAVA秀-https://www.javaxiu.com/25240.html

能浪的浪,才是好浪!文章源自JAVA秀-https://www.javaxiu.com/25240.html

每天 8:55 更新文章,每天掉亿点点头发...文章源自JAVA秀-https://www.javaxiu.com/25240.html

文章源自JAVA秀-https://www.javaxiu.com/25240.html

源码精品专栏文章源自JAVA秀-https://www.javaxiu.com/25240.html

 文章源自JAVA秀-https://www.javaxiu.com/25240.html

文章源自JAVA秀-https://www.javaxiu.com/25240.html

来源:sf.gg/a/1190000018261096文章源自JAVA秀-https://www.javaxiu.com/25240.html

Nginx 核心架构设计,揭秘其为何能支持高并发?文章源自JAVA秀-https://www.javaxiu.com/25240.html

前言

最近在读 Nginx 相关的书籍,做一下读书笔记。文章源自JAVA秀-https://www.javaxiu.com/25240.html

Nginx 作为业界知名的高性能服务器,被广泛的应用。它的高性能正是由于其优秀的架构设计,其架构主要包括这几点:模块化设计、事件驱动架构、请求的多阶段异步处理、管理进程与多工作进程设计、内存池的设计,以下内容依次进行说明。文章源自JAVA秀-https://www.javaxiu.com/25240.html

模块化设计

高度模块化的设计是 Nginx 的架构基础。在 Nginx 中,除了少量的核心代码,其他一切皆为模块。文章源自JAVA秀-https://www.javaxiu.com/25240.html

所有模块间是分层次、分类别的,Nginx 官方共有五大类型的模块:核心模块、配置模块、事件模块、HTTP 模块、mail 模块。它们之间的关系如下:文章源自JAVA秀-https://www.javaxiu.com/25240.html

Nginx 核心架构设计,揭秘其为何能支持高并发?文章源自JAVA秀-https://www.javaxiu.com/25240.html

在这 5 种模块中,配置模块和核心模块是与 Nginx 框架密切相关的。而事件模块则是 HTTP 模块和 mail 模块的基础。HTTP 模块和 mail 模块的“地位”类似,它们都是更关注于应用层面。文章源自JAVA秀-https://www.javaxiu.com/25240.html

事件驱动架构

事件驱动架构,简单的说就是由一些事件发生源来产生事件,由事件收集器来收集、分发事件,然后由事件处理器来处理这些事件(事件处理器需要先在事件收集器里注册自己想处理的事件)。文章源自JAVA秀-https://www.javaxiu.com/25240.html

对于 Nginx 服务器而言,一般由网卡、磁盘产生事件,Nginx 中的事件模块将负责事件的收集、分发操作;而所有的模块都可能是事件消费者,它们首先需要向事件模块注册感兴趣的事件类型,这样,在有事件产生时,事件模块会把事件分发到相应的模块中进行处理。文章源自JAVA秀-https://www.javaxiu.com/25240.html

对于传统 web 服务器(如 Apache)而言,采用的所谓事件驱动往往局限在 TCP 连接建立、关闭事件上,一个连接建立以后,在其关闭之前的所有操作都不再是事件驱动,这时会退化成按顺序执行每个操作的批处理模式,这样每个请求在连接建立后都将始终占用着系统资源,直到关闭才会释放资源。这种请求占用着服务器资源等待处理的模式会造成服务器资源极大的浪费。如下图所示,传统 web 服务器往往把一个进程或线程作为时间消费者,当一个请求产生的事件被该进程处理时,直到这个请求处理结束时,进程资源都将被这一请求所占用。比较典型的例子如 Apache 同步阻塞的多进程模式就是这样的。文章源自JAVA秀-https://www.javaxiu.com/25240.html

传统 web 服务器处理事件的简单模型(矩形代表进程):Nginx 核心架构设计,揭秘其为何能支持高并发?文章源自JAVA秀-https://www.javaxiu.com/25240.html

Nginx 采用事件驱动架构处理业务的方式与传统的 web 服务器是不同的。它不使用进程或者线程来作为事件消费者,所谓的事件消费者只能是某个模块。只有事件收集、分发器才有资格占用进程资源,它们会在分发某个事件时调用事件消费模块使用当前占用的进程资源,如下图所示,该图中列出了 5 个不同的事件,在事件收集、分发者进程的一次处理过程中,这 5 个事件按照顺序被收集后,将开始使用当前进程分发事件,从而调用相应的事件消费者来处理事件。当然,这种分发、调用也是有序的。文章源自JAVA秀-https://www.javaxiu.com/25240.html

Nginx 处理事件的简单模型:Nginx 核心架构设计,揭秘其为何能支持高并发?文章源自JAVA秀-https://www.javaxiu.com/25240.html

由上图可以看出,处理请求事件时,Nginx 的事件消费者只是被事件分发者进程短期调用而已,这种设计使得网络性能、用户感知的请求时延都得到了提升,每个用户的请求所产生的事件会及时响应,整个服务器的网络吞吐量都会由于事件的及时响应而增大。当然,这也带来一定的要求,即每个事件消费者都不能有阻塞行为,否则将会由于长时间占用事件分发者进程而导致其他事件得不到及时响应,Nginx 的非阻塞特性就是由于它的模块都是满足这个要求的。文章源自JAVA秀-https://www.javaxiu.com/25240.html

请求的多阶段异步处理

多阶段异步处理请求与事件驱动架构是密切相关的,也就是说,请求的多阶段异步处理只能基于事件驱动架构实现。多阶段异步处理就是把一个请求的处理过程按照事件的触发方式划分为多个阶段,每个阶段都可以由事件收集、分发器来触发。文章源自JAVA秀-https://www.javaxiu.com/25240.html

处理获取静态文件的 HTTP 请求时切分的阶段及各阶段的触发事件如下所示:Nginx 核心架构设计,揭秘其为何能支持高并发?文章源自JAVA秀-https://www.javaxiu.com/25240.html

这个例子中,该请求大致分为 7 个阶段,这些阶段是可以重复发生的,因此,一个下载静态资源请求可能会由于请求数据过大,网速不稳定等因素而被分解为成百上千个上图所列出的阶段。文章源自JAVA秀-https://www.javaxiu.com/25240.html

异步处理和多阶段是相辅相成的,只有把请求分为多个阶段,才有所谓的异步处理。当一个时间被分发到事件消费者中进行处理时,事件消费者处理完这个事件只相当于处理完 1 个请求的阶段。什么时候可以处理下一个阶段呢?这只能等待内核的通知,即当下一次事件出现时,epoll 等事件分发器将会获取到通知,然后去调用事件消费者进行处理。文章源自JAVA秀-https://www.javaxiu.com/25240.html

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

Nginx 在启动后,会有一个 master 进程和多个 worker 进程。master 进程主要用来管理worker 进程,包括接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态以及启动 worker 进程。worker 进程是用来处理来自客户端的请求事件。多个 worker 进程之间是对等的,它们同等竞争来自客户端的请求,各进程互相独立,一个请求只能在一个 worker 进程中处理。worker 进程的个数是可以设置的,一般会设置与机器 CPU 核数一致,这里面的原因与事件处理模型有关。Nginx 的进程模型,可由下图来表示:文章源自JAVA秀-https://www.javaxiu.com/25240.html

Nginx 核心架构设计,揭秘其为何能支持高并发?文章源自JAVA秀-https://www.javaxiu.com/25240.html

在服务器上查看 Nginx 进程:文章源自JAVA秀-https://www.javaxiu.com/25240.html

Nginx 核心架构设计,揭秘其为何能支持高并发?文章源自JAVA秀-https://www.javaxiu.com/25240.html

这种设计带来以下优点:文章源自JAVA秀-https://www.javaxiu.com/25240.html

1) 利用多核系统的并发处理能力文章源自JAVA秀-https://www.javaxiu.com/25240.html

现代操作系统已经支持多核 CPU 架构,这使得多个进程可以分别占用不同的 CPU 核心来工作。Nginx 中所有的 worker 工作进程都是完全平等的。这提高了网络性能、降低了请求的时延。文章源自JAVA秀-https://www.javaxiu.com/25240.html

2) 负载均衡文章源自JAVA秀-https://www.javaxiu.com/25240.html

多个 worker 工作进程通过进程间通信来实现负载均衡,即一个请求到来时更容易被分配到负载较轻的 worker 工作进程中处理。这也在一定程度上提高了网络性能、降低了请求的时延。文章源自JAVA秀-https://www.javaxiu.com/25240.html

3) 管理进程会负责监控工作进程的状态,并负责管理其行为文章源自JAVA秀-https://www.javaxiu.com/25240.html

管理进程不会占用多少系统资源,它只是用来启动、停止、监控或使用其他行为来控制工作进程。首先,这提高了系统的可靠性,当 worker 进程出现问题时,管理进程可以启动新的工作进程来避免系统性能的下降。其次,管理进程支持 Nginx 服务运行中的程序升级、配置项修改等操作,这种设计使得动态可扩展性、动态定制性较容易实现。文章源自JAVA秀-https://www.javaxiu.com/25240.html

内存池的设计

为了避免出现内存碎片,减少向操作系统申请内存的次数、降低各个模块的开发复杂度,Nginx 设计了简单的内存池,它的作用主要是把多次向系统申请内存的操作整合成一次,这大大减少了 CPU 资源的消耗,同时减少了内存碎片。文章源自JAVA秀-https://www.javaxiu.com/25240.html

因此,通常每一个请求都有一个简易的独立内存池(如每个 TCP 连接都分配了一个内存池),而在请求结束时则会销毁整个内存池,把曾经分配的内存一次性归还给操作系统。这种设计大大提高了模块开发的简单些,因为在模块申请内存后不用关心它的释放问题;而且因为分配内存次数的减少使得请求执行的时延得到了降低。同时,通过减少内存碎片,提高了内存的有效利用率和系统可处理的并发连接数,从而增强了网络性能。文章源自JAVA秀-https://www.javaxiu.com/25240.html

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢文章源自JAVA秀-https://www.javaxiu.com/25240.html

Nginx 核心架构设计,揭秘其为何能支持高并发?文章源自JAVA秀-https://www.javaxiu.com/25240.html

已在知识星球更新源码解析如下:文章源自JAVA秀-https://www.javaxiu.com/25240.html

Nginx 核心架构设计,揭秘其为何能支持高并发?文章源自JAVA秀-https://www.javaxiu.com/25240.html

Nginx 核心架构设计,揭秘其为何能支持高并发?文章源自JAVA秀-https://www.javaxiu.com/25240.html

Nginx 核心架构设计,揭秘其为何能支持高并发?文章源自JAVA秀-https://www.javaxiu.com/25240.html

Nginx 核心架构设计,揭秘其为何能支持高并发?文章源自JAVA秀-https://www.javaxiu.com/25240.html

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/25240.html

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。文章源自JAVA秀-https://www.javaxiu.com/25240.html

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。文章源自JAVA秀-https://www.javaxiu.com/25240.html

文章源自JAVA秀-https://www.javaxiu.com/25240.html

文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)
文章源自JAVA秀-https://www.javaxiu.com/25240.html

阅读原文文章源自JAVA秀-https://www.javaxiu.com/25240.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定