当前位置: 首页 > 科技观察

Nginx服务器架构分析

时间:2023-03-19 17:09:58 科技观察

1.Nginx模块化模块化结构的思想是一个由来已久的概念,但也是成熟的思想造就了Nginx的巨大优势。我们知道Nginx一般是由很多模块组成的。习惯上将Nginx分为5大模块:核心模块、标准HTTP模块、可选HTTP模块、邮件服务模块和第三方模块。这5个模块的重要性从上到下依次递减。(1)核心模块;核心模块是Nginx服务器正常运行不可或缺的模块,就像操作系统的内核一样。它提供了Nginx最基本的核心服务。如进程管理、权限控制、错误记录等;(2)标准HTTP模块;标准HTTP模块支持标准HTTP功能;(3)可选的HTTP模块;可选的HTTP模块主要用于扩展标准的HTTP功能,让Nginx处理一些特殊的服务;(4)邮件服务模块;邮件服务模块主要用于支持Nginx的邮件服务;(5)第三方模块;第三方模块是扩展Nginx服务器应用,完成开发者想要的功能;*******Nginx模块命名有自己的习惯************一般使用Ngx_作为prefix,--module作为后缀,中间使用一个或多个英文单词来描述模块的功能,比如ngx_core_module,表示该模块提供了Nginx的核心功能等;每个模块包含哪些模块,可以自行在源码中查询,此处略过;2.Nginx的web请求处理机制在架构设计上,NginxServers是不同的。一是模块化设计;第二个也是更重要的一点是它对客户端请求的处理机制;Web服务器和客户端是一对多的关系,Web服务器必须具备同时为多个客户端服务的能力。端提供服务。一般来说,有三种方式来完成并行处理请求的工作:1.多进程模式;每当接到客户时。有一个服务端主进程生成子进程与客户端建立连接进行交互。导向连接断开。子进程结束。多进程方式的优点是设计简单,各个子进程相对独立,处理客户端请求时互不干扰;缺点是操作系统生成一个子进程,需要进行内存复制等操作,会在资源和时间上产生一定的开销;当有大量请求时,会导致减少在系统性能方面;(2)多线程模式多线程模式是指每当服务器端收到请求时,就会从服务器主进程派生出一个线程与客户端进行交互。因为操作系统产生的一个线程的开销远小于一个进程的开销。因此,多线程的方式大大降低了Web服务器对系统资源的要求。但同时,由于多个线程位于同一个进程中,它们可以访问同一个内存空间。因此需要开发者自行管理内存进程,增加了难度。(3)异步模式异步模式适用于多进程和多线程之间完全不同的客户端请求处理方式。这里有几个我们需要熟悉的概念:同步、异步、阻塞、非阻塞;网络通信中的同步和异步是描述通信方式的概念。同步:发送方发送请求后,需要等待接收方的响应,才能发送下一个请求;所有请求都在服务器端同步,发送端和接收端的步调一致;asynchronous:与同步机制相反,在异步机制中,发送方发送请求后,不等待接收方响应请求,继续发送下一个请求;发送方的所有请求组成一个队列,接收方处理后通知发送方;在进程中使用阻塞和非阻塞来进行处理调度。在网络通信中,主要是指socket的阻塞和非阻塞,而socket的本质就是IO操作。阻塞:调用结果返回前,当前线程暂停运行状态,直到调用结果返回才会进入就绪状态,获得CPU后继续执行。非阻塞:与阻塞方式相反,如果不能立即返回调用结果,则当前线程不会立即返回,而是立即返回执行下一次调用。因此,衍生出4种方法:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞这里简单解释一下异步非阻塞:发送方向接收方发送请求后,无需等待就可以继续其他工作回应;receiverprocessingtherequest如果当时执行的IO操作不能立即得到结果,则无需等待,而是立即返回做其他事情。当IO操作完成后,会通知接收方完成状态和结果,接收方会响应发送方。同时Nginx服务器是如何处理请求的???Nginx服务器的一个显着优势是它可以同时处理大量并发请求。它结合了多进程机制和异步机制。异步机制采用异步非阻塞方式。(主工)。每个工作进程采用异步非阻塞方式,可以处理多个客户端请求。当一个工作进程收到客户端的请求时,它调用IO进行处理。如果不能立即得到结果,将处理其他请求;而client在此期间不需要等待响应,可以处理其他事情;当IO返回时,通知工作进程;进程收到通知,暂时中止当前处理错误,以响应客户端请求。也就是说:Nginx采用异步非阻塞的方式来处理请求。请求的处理具体到系统底层,就是读写事件(所谓阻塞调用方式就是请求事件没有准备好,线程只能等到事件准备好。;而不是阻塞,也就是事件没有准备好,马上返回ENGAIN,告诉你事件还没有准备好,但是这期间可以先做其他事情,回头看看事件有没有准备好了,时不时的,所需的开销也不小)异步可以理解为循环处理多个准备好的事件,不会造成不必要的资源浪费。当并发数多的时候,只会占用更多的内存;3、Nginx服务器的实践驱动模型从上面我们可以知道,Nginx服务器的工作进程在调用IO之后,会执行其他的工作;当IO调用返回时,将通知工作进程。但是如何在调用IO时通知工作进程它的状态呢?一般有两种方法可以解决这个问题:(1)让工作进程在其他任务期间每隔一段时间检查一下IO的状态。如果完成,请回复客户,如果没有,请继续工作。(2)IO调用完成后,可以主动通知工作进程。当然,最好的方法是使用第二种方法;select/poll/epoll等系统调用用于支持第二种解决方案。这些系统调用也常被称为事件驱动模型。它们提供了一种机制,只允许进程同时处理多个并发请求,而不关心IO调用的具体状态。IO调用完全由事件驱动模型管理。Nginx中的事件驱动模型使用了一个事件驱动处理库(多IO复用),最常用的有select模型、poll模型、epoll模型。关于这三种模型的详细解释可以在这里找到:https://segmentfault.com/a/11900000030638594.架构介绍通过上面简单的解释,再加上对服务器架构的了解,可以对Nginx有一个简单的了解希望对后续的源码分析有所帮助。大致来说,Nginx的架构是这样的:1、Nginx启动后,会生成一个主进程,主进程执行完一系列任务后,会生成一个或多个工作进程;2、在客户端请求动态站点的过程中,NginxServers也参与到与后端服务器的通信中。Nginx将接收到的web请求通过代理转发给后端服务器,由后端服务器进行数据处理和组织;3、为了提高请求的响应效率,降低网络压力,Nginx采用了缓存机制,将历史响应数据缓存到本地。保证快速访问缓存文件;##工作流程##工作流程的主要任务如下:接收客户端请求;向各功能模块发送请求进行过滤处理;IO调用获取响应数据;端服务器通信,接收后端服务器处理结果;数据缓存响应客户端请求;##进程交互##Nginx服务器在使用Master-Worker模型时,会涉及到主进程和worker进程之间的交互以及worker进程之间的交互interact。两种类型的交互都依赖于管道机制。1.Master-Worker交互这个管道不同于普通的管道。是master进程到worker进程的单向管道,包括master进程发给worker进程的指令,worker进程ID等;同时,master进程通过信号与外界通信;2.Worker-Worker交互这种交互与Master-Worker交互基本相同。但会经历主要过程。工作进程之间是相互隔离的,所以当工作进程W1需要向工作进程W2发送指令时,它首先找到W2的进程ID,然后将正确的指令写入到指向W2的通道中。W2收到信号并采取相应措施。