主要内容:
1. 模块化结构的相关知识
2. Nginx如何处理web请求
3. Nginx的事件驱动模型
4 .Nginx设计架构的概览
一、Nginx的模块化结构
1.1 核心模块:对两类功能的支持
主体功能:包括进程管理,权限控制,错误日志记录,配置解析等;
响应请求功能:包括事件驱动机制,正则表达式解析等。
1.2 标准HTTP模块
ngx_http_core: 配置端口、URI解析、服务器响应错误处理,别名控制以及其他HTTP核心事物;
ngx_http_access_module: 基于IP地址的访问控制(允许/拒绝);
ngx_http_auth_basic_module: 基于HTTP的身份认证。
...
1.3 可选http模块:能够处理一些特殊的http请求。
1.4 邮件服务模块:支持Nginx的邮件。
1.5 第三方模块:扩展应用。
二、Nginx的web请求处理机制
首先,Nginx的一个显著优势就是能够同时处理大量并发请求;Nginx采用的是多进程+异步非阻塞机制。
2.1 多进程
Nginx服务器的三大类进程(主进程与工作进程通过管道机制通信,工作进程之间通过主进程进行交互)。
(1)主进程(Master Process):对外通信 及 对内管理;
(2)工作进程(Worker Process):由主进程生成,数量由配置文件指定;
主要工作:1. 接收客户端请求;
2.将请求送入各个功能模块过滤;
3.IO调用,获取响应数据;
4.与后端服务器通信,接收后端服务器处理结果;
5.数据缓存,发送请求结果,响应客户端;
6.接收主程序指令,如果重启、升级、退出等。
(3)缓存索引重建及管理进程(Cache Loader & Cache Manager)。
2.2 异步非阻塞
发送方:发送请求后,不用等待响应,而去继续其他工作;(是为异步);
接收方:处理请求时进行的IO操作如果不能马上获取结果,则不等待,而去继续其他工作。当IO操作完成后,将完成状态和结果通知接收方,接收方在响应发送方。(是为非阻塞)。
三、Nginx服务器的事件驱动模型
IO调用时如何把自己的状态通知给工作进程的呢?
3.1 事件驱动模型概述
(1)组成:事件收集器、事件发送器和事件处理器三部分组成。
(2)Nginx 的常用事件驱动模型
1.select库:首先,创建所关注事件的三种事件描述符集合:
(1)读事件(Read)的描述符;(2)写事件(Write)描述符;(3)异常发生(Exception)事件。
其次,调用底层提供的select()函数,等待事件发生;
然后,轮询所有事件描述符集合中的每一个时间描述符,检查是否有相应的时间发生,有则处理 。
(Nginx编译过程中若没有指定其他高性能的事件驱动模型库,则自动编译该库)。
2.poll库:poll库和select库基本工作方式相同;poll是select库的优化。
区别: select库分别为读、写和异常分别创建描述集合,轮询也是分别轮询三个集合;而poll库只创建一个集合,最后轮询可以同时检查者三种事件是否发生。
3.epoll库:首先,通过相关调用通知内核创建一个有N个描述符的事件列表;
其次,给这些描述符设置所关注的事件,并把它添加到内核的事件列表中去;
然后,epoll库开始等待内核通知事件发生,发生后,内核将发生的事件的描述符列表上报给epoll库,得到时间列表的epoll库就可以进行事件处理了。
区别:由进程轮询事件集合描述符,变为把描述符列表交给内核管理,一旦有事件发生就将发生事件的描述符列表通知给进程,这样就避免了轮询整个描述符列表,特别适用于高性能事件的实现。