- 模块化结构
- 什么是模块化结构
- 模块化设计支持分布式开发;
- 模块化设计支持团队协同合作;
- 模块化设计支持应用扩展和升级;
- Nginx 模块化结构
- Nginx 模块分为:核心模块、标准模块、HTTP 模块,可选 HTTP 模块、邮件服务模块及第三方模块五大类。
- 核心模块
- 核心模块为 Nginx 运行时必不可少的模块,为 Nginx 提供了最基本最核心的服务。
- 在编译后的 objs 目录中包含了核心模块和标准 HTTP 模块,在此目录的 ngx_modules.c文件中包含了此版本快速编译后包括所有固有模块的声明
- 核心模块主要包含两类功能,一类是主体功能,包括进程管理,权限控制,错误日志记录,配置解析等。另外一类是用于响应请求事件必须的功能,包括事件驱动机制,正则表达式等。
- 标准 http 模块
- 可选 HTTP 模块
- 邮件服务模块
- 第三方模块
- Nginx 服务器的 web 请求处理机制。
- 多进程处理方式
- 多进程方式指:服务器每当接收到一个客户端时,就有服务器主进程生成一个子进程出来和该客户建立连接进行交互,知道连接断开。
- 优点:设计和实现相对简单,各个子进程之间相互独立。请求过程彼此不受干扰,互不影响。
- 缺点:生成一个子进程时需要进行内存复制等操作,资源和时间上产生额外的开销,对系统资源造成压力。性能下降。
- 多线程方式
- 服务器每当接受到一个客户端时,会由服务器主进程派生一个线程出来和该客户端进行交互。
- 优点:由于系统产生一个线程的开销远远小于产生一个进程的开销,减轻了 web服务器对系统资源的要求。
- 缺点:多个线程位于同一个进程内,可以访问彼此的内存空间,彼此之间相互影响,开发过程中需要开发者自己对内存管理,增加出错的风险。
- 异步方式
- 同步机制:发送方发送请求后,需要等待接受方发回的响应后,才接着发送下个请求。
- 异步机制:发送一个请求后,不等接收方回应,就继续发送下一个请求。
- 阻塞:Socket 的阻塞调用方式为,调用结果返回之前,当前线程从运行状态被挂起,一致等到调用结果返回之后才进入就绪状态
- 非阻塞,如果调用结果不能马上返回,当前线程不会被挂起,而是执行下一个调用。
- 异步非阻塞方式:发送方向接受方发送请求后,不用等待响应,可以继续其他工作,接收方处理请求时进行的 IO 操作如果不能马上得到结果,也不等待,而是马上去做其他事情。
- Nginx 如何处理请求.
- Nginx 结合多进程机制与异步非阻塞方式对外提供服务。
- 优势:不增长对系统资源的压力,不降低对请求的处理能力。
- Nginx 服务器的事件处理机制
- IO调用在完成后主动通知工作进程
- select/poll/epoll/kqueue 等这样的调用,称为事件驱动模型
- Nginx 的事件驱动模型.
- 事件驱动模型的基本单元
- 事件收集器:负责收集所有的事件
- 事件发送器:负责将收集到的事件发送到目标对象中
- 事件处理器:负责具体事件的响应工作
- Nginx 设计架构概览
- Nginx服务器的进程.
- 三大类进程:主进程,工作进程,缓存索引进程.
- 主进程
- 读取 Nginx 配置文件并校验其正确性
- 建立,绑定,和关闭 Socket。
- 按照配置生成、管理和结束工作进程。
- 接受外界指令,比如重启,升级及退出服务器指令。
- 不中断服务,实现平滑重启、应用新配置。
- 不中断服务,实现平滑升级,升级失败进行回滚处理。
- 开启日志文件,获取文件描述符。
- 编译和处理 Perl 脚本。
- 工作进程
- 接收客户端请求
- 将请求依次送入各个功能模块进行过滤处理
- IO调用
- 与后端服务进行通讯,接收后端服务器处理结果
- 数据缓存,访问缓存索引,查询和调用缓存数据。
- 发送请求结果,相应客户端请求。
- 接收主程序指令,比如重启、升级、和退出。
- 缓存索引重建及管理进程。
- 缓存索引重建:根据本地磁盘上的缓存文件在内存中建立索引元数据。
- 缓存索引管理进程:主要负责在索引元数据更新完成后,对元数据是否过期做出判断
- 进程交互
- Nginx 在使用 master-Worker 模型时,会涉及到主进程与工作进程之间的交互,工作进程间的交互。依赖于管道机制