1。前言Nginx---NgineX是一款免费、自由、开源、高性能的HTTP服务器和反向代理服务器;它还是一个IMAP、POP3、SMTP代理服务器;Nginx以其高性能、稳定、丰富的特性、简单的配置和低资源消耗而著称。也就是说,Nginx本身可以托管网站(类似Tomcat),进行Http服务处理,也可以作为反向代理服务器、负载均衡器、HTTP缓存等。Nginx解决了服务器的C10K问题(即一秒内连接客户端数为10k即10000)。它的设计并没有像传统服务器那样使用线程来处理请求,而是采用了更高级的机制——事件驱动机制,这是一种异步的事件驱动结构。2、Nginx跨平台的特点:可以在大多数类Unix系统上编译运行。还有一个适用于Windows的移植版本。配置极其简单:非常简单易用。非阻塞、高并发连接:在数据复制过程中,磁盘I/O的第一阶段是非阻塞的。官方测试可以支持5万并发连接,实际生产中可以运行2万到3万并发连接(得益于Nginx采用了最新的epoll事件处理模型(消息队列),Nginx代理和客户端之间不需要长连接)后端Web服务器;Nginx异步接收用户请求,即先接收所有用户请求,然后一次性发送给后端Web服务器,大大减轻了后端Web服务器的压力。发送响应报文时,接收来自后端的报文web服务器的数据发送给客户端,网络依赖性低,理论上只要能ping通就可以实现负载均衡,并且可以有效区分内网和外网流量,支持内置服务器检测,Nginx可以根据应用服务器处理页面返回的状态码,超时信息等,检测服务器是否出现故障,并返回错误请求及时重新提交给其他节点。另外,内存消耗小,成本低(比F5硬件负载均衡器便宜很多),节省带宽,稳定性高等。三、Nginx整体架构1.Nginx的Worker进程模块化设计,包括核心模块和功能模块。核心模块负责维护一个run-loop,执行不同阶段的网络请求处理模块功能,例如:存储读写、内容传输、网络读写、出站过滤、向上游服务器发送请求等。其代码的模块化设计还使我们可以根据需要正确选择功能模块并修改,并将其编译到具有特定功能的服务器中。2.代理设计代理(proxy)设计可以说是Nginx的根深蒂固的设计。无论是对HTTP,还是对Memcache、Redis、FastCGI等的网络请求或响应,本质上都是使用了代理机制。因此,Nginx天生就是一个高性能的代理服务器。3.事件驱动模型基于异步非阻塞的事件驱动模型,可以说是Nginx实现高并发和高性能的关键因素。它还受益于事件通知和采用I/O性能增强,例如kqueue、epoll和事件端口。4、主进程模型Nginx启动时,会产生两种类型的进程,一种是主进程(Master),另一种是工作进程(Worker)。主进程不处理网络请求,主要负责调度工作进程,就是图中的三项:加载配置、启动工作进程、不停升级。所以Nginx启动后,查看操作系统的进程列表,可以看到至少有两个Nginx进程。5.工作流程模型服务器实际处理网络请求并响应工作流程。在类Unix系统上,Nginx可以配置多个Worker,每个Worker进程可以同时处理上千个网络请求。4.Nginx的模块化设计高度模块化的设计是Nginx的架构基础。Nginx服务器被分解成多个模块,每个模块都是一个功能模块,只负责自己的功能,模块之间严格遵循“高内聚、低耦合”的原则。1、核心模块核心模块是Nginx服务器正常运行不可或缺的模块,提供错误记录、配置文件解析、事件驱动机制、进程管理等核心功能。2、标准HTTP模块标准HTTP模块提供了HTTP协议解析相关的功能,如:端口配置、网页编码设置、HTTP响应头设置等。3、可选的HTTP模块可选的HTTP模块主要用于扩展标准的HTTP功能,让Nginx处理一些特殊的服务,例如:Flash多媒体传输、解析GeoIP请求、网络传输压缩、安全协议SSL支持等4.邮件服务模块邮件服务模块主要用于支持Nginx的邮件服务,包括对POP3协议、IMAP协议和SMTP协议的支持。5、第三方模块第三方模块用于扩展Nginx服务器应用,完成开发者自定义的功能,如:Json支持,Lua支持等。5、代理设计中的正向代理和反向代理首先,一个代理服务器一般是指局域网内的一台机器,通过代理服务器向互联网上的服务器发送请求,代理服务器一般作用于客户端。例如:GoAgent翻墙软件。当我们的客户端执行翻墙操作时,我们使用正向代理。通过正向代理,我们在客户端运行一个软件,将我们的HTTP请求转发到其他不同的服务器,实现请求的分发。反向代理服务器作用于服务器端。它在服务器端接收客户端的请求,然后将请求分发到特定的服务器进行处理,然后将服务器的相应结果反馈给客户端。Nginx是一个反向代理服务器软件。从上图可以看出:客户端必须设置一个正向代理服务器,当然前提是知道正向代理服务器的IP地址和代理程序的端口。反向代理与正向代理正好相反。对于客户端来说,代理服务器就像原来的服务器一样,客户端不需要做任何特殊的设置。客户端向反向代理的命名空间(name-space)中的内容发送一个正常的请求,然后反向代理会判断将请求转发到哪里(原始服务器)并将获取到的内容返回给客户端。6、Nginx事件驱动模型在Nginx的异步非阻塞机制中,工作进程调用IO后,会处理其他请求。当IO调用返回时,将通知工作进程。对于这样的系统调用,主要采用Nginx服务器的事件驱动模型来实现。如上图所示,Nginx的事件驱动模型由三个基本单元组成:事件发送器、事件收集器、事件处理器:事件发送器:负责将IO事件发送给事件处理器;事件收集器:负责收集Worker进程的各种IO请求;事件处理器:负责响应各种事件。事件发送者将每个请求放入一个待处理事件列表中,并使用非阻塞I/O调用事件处理程序来处理请求。其处理方式称为“多路IO复用方式”,常见的有以下三种:select模型、poll模型、epoll模型。7、Nginx的请求处理Nginx是一个高性能的web服务器,可以同时处理大量的并发请求。它结合了多进程机制和异步机制。异步机制采用异步非阻塞方式。接下来介绍一下Nginx的多线程机制和异步非阻塞机制。1.多进程机制每当服务器接收到客户端时,服务器的主进程(masterprocess)产生一个子进程(workerprocess)与客户端建立连接进行交互,直到连接断开,子进程才会对它的超过。使用进程的好处是每个进程相互独立,不需要加锁,减少了使用锁对性能的影响,降低了编程复杂度,降低了开发成本。其次,使用独立进程可以避免进程之间相互影响。如果一个进程异常退出,其他进程正常工作,master进程会迅速启动一个新的worker进程,保证服务不会中断,从而将风险降到最低。缺点是操作系统需要进行内存复制等操作来生成子进程,这会在资源和时间上产生一定的开销。当有大量请求时,会导致系统性能下降。2、异步非阻塞机制每个工作进程采用异步非阻塞方式,可以处理多个客户端请求。当一个worker进程收到客户端的请求后,调用IO进行处理。如果不能立即得到结果,则处理其他请求(即非阻塞);而客户端在此期间不需要等待响应,可以处理其他请求的东西(即异步)。当IO返回时,通知worker进程;该进程收到通知并暂时挂起当前处理的事务以响应客户端请求。八、Nginx进程处理模型Nginx服务器采用master/worker多进程模式。多线程启动和执行的过程如下:主程序Master进程启动后,通过for循环接收并处理外部信号;主进程通过fork()函数生成worker子进程,每个子进程执行一个for循环,实现Nginx服务器接收和处理事件。一般建议worker进程数与CPU核数相同,这样不会产生大量的子进程生成和管理任务,避免进程间争夺CPU资源和进程切换的开销.而且,为了更好的利用多核特性,Nginx提供了CPU亲和性的绑定选项。我们可以将某个进程绑定到某个核上,这样缓存就不会因为进程切换而失效。对于每个请求,只有一个工作进程来处理它。首先,每个工作进程都是从主进程派生出来的。在master进程中,先设置好需要监听的socket(listenfd),然后fork多个worker进程。当新连接到达时,所有工作进程的listenfd将变得可读。为保证只有一个进程处理连接,所有worker进程在注册listenfd读事件前抢占accept_mutex,抢到mutex的进程注册listenfd读事件。在read事件中调用accept接受连接。当一个工作进程接受连接后,它开始读取请求、解析请求、处理请求、生成数据、返回给客户端,最后断开连接。这样一个完整的请求看起来像这样。我们可以看到一个请求是完全由worker进程处理的,而且只在一个worker进程中处理。Nginx服务器运行过程中,主进程和worker进程需要进程交互。交互依赖于Socket实现的管道。1、主进程与工作进程交互。这条管道不同于普通的管道。是主进程到工作进程的单向管道,包括主进程发送给工作进程的指令、工作进程ID等;同时,主进程与外界通信。通过信号通讯;每个子进程都有接收信号和处理相应事件的能力。2、工作进程与工作进程的交互与主进程与工作进程的交互基本相同,只是会通过主进程间接进行。工作进程之间是相互隔离的,所以当工作进程W1需要向工作进程W2发送指令时,它首先找到W2的进程ID,然后将正确的指令写入到指向W2的通道中。W2接收到信号并采取相应的动作。九。小结通过本文,我们对Nginx服务器的整体架构有了一个整体的了解。包括它的模块化设计、多进程和异步非阻塞请求处理方式、事件驱动模型等。只有通过这些理论知识,才能更好地理解Nginx的设计思想。对我们学习Nginx有很大的帮助。
