Nginx是一个免费、开源、高性能、模块化、轻量级的HTTP服务器、反向代理服务器和电子邮件(IMAP/POP3)代理服务器。许多大型网站都使用了Nginx,如:百度、京东、新浪、网易、腾讯、淘宝等。一、Nginx整体结构介绍1)Nginx启动后,会生成一个主进程,主进程后执行一系列任务,会产生一个或多个工作流程;2)当客户端请求一个动态站点时,Nginx服务器还涉及到与后端服务器的通信。Nginx将接收到的web请求通过代理转发给后端服务器,由后端服务器进行数据处理和组织;3)Nginx采用缓存机制缓存历史响应数据,以提高对请求的响应效率,降低对本地的网络压力。保证快速访问缓存文件;2、Nginx的模块化高度模块化设计是Nginx的架构基础。Nginx严格遵循“高内聚、低耦合”的原则,将服务器设计成多个模块,每个模块都是一个独立的功能模块,只负责自己的功能。这5个模块从上到下按重要性降序排列。(1)核心模块核心模块是Nginx服务器正常运行不可或缺的模块,就像操作系统的内核一样。它提供了Nginx最基本的核心服务。像进程管理、权限控制、错误记录等;(2)标准HTTP模块标准HTTP模块支持标准HTTP功能;(3)可选的HTTP模块可选的HTTP模块主要用于扩展标准的HTTP功能,让Nginx可以处理一些特殊的服务;(4)邮件服务模块邮件服务模块主要用于支持Nginx邮件服务;(5)第三方模块第三方模块是对Nginx服务器应用进行扩展,完成开发者想要的功能;3.Nginx的Web请求处理机制在架构设计上,Nginx服务器是不同的。一是模块化设计;第二个也是更重要的一点在于它对客户端请求的处理机制。Nginx请求处理机制结合了多进程机制和异步非阻塞机制。1)multi-process多进程方式是指每当服务端收到客户端请求时,服务端主进程产生一个子进程与客户端建立连接进行交互,直到连接断开,子进程为超过。多进程方式的优点是设计简单,各个子进程相对独立,处理客户端请求时互不干扰;缺点是操作系统生成一个子进程,需要进行内存复制等操作,会在资源和时间上产生一定的开销;当有大量请求时,会导致减少在系统性能方面;2)异步非阻塞发送方向接收方发送请求后,无需等待响应即可继续其他工作;如果接收方在处理请求时执行的IO操作不能立即得到结果,没有必要等待,而是马上回去做其他事情。当IO操作完成后,会通知接收方完成状态和结果,接收方会响应发送方。4、Nginx服务器的事件驱动模型从上面我们可以知道,Nginx服务器的工作进程在调用IO之后,还会进行其他的工作;当IO调用返回时,会主动通知工作进程。select/poll/epoll等系统调用用于支持此解决方案。这些系统调用通常也称为事件驱动模型。它们提供了一种机制,只允许进程同时处理多个并发请求,而不关心IO调用的具体状态。IO调用完全由事件驱动模型管理。如上图所示,Nginx的事件驱动模型由三个基本单元组成:事件收集器、事件发送器和事件处理器。select、poll、epoll都是IO多路复用机制。I/O多路复用是一种机制,通过它一个进程可以监视多个描述符,一旦一个描述符就绪(通常是read-ready或write-ready),它可以通知程序执行相应的读写操作。select、poll、epoll本质上是同步I/O,因为它们都需要在读写事件就绪后负责读写,也就是说读写过程是阻塞的。5、Nginx服务器Master-Worker进程处理模型当Nginx服务器使用Master-Worker模型时,会涉及到master进程和worker进程之间的交互,以及worker进程之间的交互。两种类型的交互都依赖于管道机制。主从交互管道不同于普通管道。是master进程到work进程的单向管道,包括master进程发给work进程的指令,work进程ID等;同时,master进程通过信号与外界通信;Worker-Worker交互这种交互与Master-Worker交互基本相同,只是会经过主进程。工作进程之间是相互隔离的,所以当工作进程W1需要向工作进程W2发送指令时,它首先找到W2的进程ID,然后将正确的指令写入到指向W2的通道中。W2收到信号并采取相应措施。通过本文,我们对Nginx服务器的整体架构有了一个整体的了解。另外,建议大家多看看Nginx的源码,这样可以更好的理解Nginx的设计思想。
