当前位置: 首页 > 后端技术 > Java

Nginx 架构到底有多牛

时间:2023-04-01 21:53:36 Java

Nginx架构有多牛逼?运行时,后台进程包括一个master进程和多个worker进程。如下图所示:nginx是一个master管理进程,多个worker进程处理工作的多进程模型。基础架构设计,如下图所示:master负责管理worker进程,worker进程负责处理网络事件。整个框架设计为事件驱动、异步、非阻塞模式。这样设计的优点:2.master进程2.1核心逻辑master进程的主要逻辑在ngx_master_process_cycle中,核心集中在源码上:从上面的代码可以理解master进程主要是用来管理worker进程,包括以下四个主要功能:2.2HotUpdate2.2.1Hotreload——配置热更新nginx热更新配置,可以保持运行流畅更新配置,具体流程如下:2.2.2Hotupgrade——程序热更新3.Worker进程3.1核心逻辑Worker进程的主要逻辑在ngx_worker_process_cycle中,核心集中在源码上:从上面的代码可以了解到,Worker进程主要是处理网络事件,其实现方式是ngx_process_events_and_timers方法,事件主要包括:网络事件和定时器事件。3.2事件驱动——epollworker进程在处理网络事件时,依赖epoll模型管理并发连接,实现了事件驱动、异步、非阻塞等特性。如下图所示:通常在海量并发连接的过程中,在每个时刻(一个比较短的时间段),往往只有少量有事件的连接需要处理,即活跃连接。基于以上现象,epoll通过将连接管理与主动连接管理分离,实现了高效稳定的网络IO处理能力。其中epoll利用红黑树高效的增删改查效率来管理连接,使用双向链表维护活动连接。3.3shockinggroup由于worker都是master进程的fork产生的,worker都会监听同一个端口。这样,当accept建立连接时,多个子进程就会发生争抢,从而产生著名的“shockinggroup”问题。worker核心处理逻辑ngx_process_events_and_timers的核心代码如下:从上面的代码可以看出,Nginx解决了惊群:3.4负载均衡worker之间负载的关键在于有多少连接相互连接,以及访问连接抢锁的前提是ngx_accept_disabled>0,所以ngx_accept_disabled是负载均衡机制的关键阈值。因此,当nginx启动时,ngx_accept_disabled的值为负数,其值为总连接数的7/8。当进程的连接数达到总连接数的7/8时,进程将不再处理新的连接。同时,每调用一次'ngx_process_events_and_timers',ngx_accept_disabled就会减1,直到它的值低于阈值。在尝试重新处理新连接之前。因此,nginxworker子进程之间的负载均衡只有在一个worker进程处理的连接数达到其最大连接总数的7/8时才会触发,其负载均衡不满足任何条件。如下图:'pid'为1211的进程为master进程,其余为worker进程4.思考4.1为什么不用多线程模型来管理连接?4.2为什么不用多线程处理逻辑业务?感谢大家的认可和支持,小编会继续转发《乐字节》的优质文章