【Linux网络编程】Nginx -- Nginx 架构基础知识点总结
【1】Nginx 模块化简介
Nginx 模块化特点
- 模块化设计
- 高度抽象的模块接口
- 模块接口简单,具有很高的灵活性
- 配置模块的设计
- 核心模块接口的简单化
- 多层次、多类别的模块设计
Nginx 整体架构示意图
Nginx 模块的构成
- 核心模块 : 为其他模块提供基本功能,如字符串处理、时间管理、文件读写等功能;
- 配置解析模块 : 主要包括文件语法检查、配置参数解析、参数初始化等功能;
- 内存管理模块 : 内存池管理、共享内存的分配、缓冲区管理等功能;
- 事件驱动模块 : 进程创建与管理、信号接收与处理、所有事件驱动模型的实现、高级 IO 等功能;
- 日志管理模块 : 错误日志的生成与管理、任务日志的生成与管理等功能;
- HTTP 服务模块 : 提供 Web 服务,包括客户端连接管理、客户端请求处理、虚拟主机管理、服务器组管理等功能;
- Mail 服务模块 : 邮件协议的支持;
【2】Nginx 事件驱动架构简介
Nginx 不使用进程或线程来作为事件消费者,Nginx 中的事件消费者只能是某个模块;只有事件收集、分发器才会占用进程资源,并会在分发某个事件时调用事件消费模块使用当前占用的进程资源;事件消费者只是被事件分发者进程短期调用而已,注意每个事件消费者都不能有阻塞行为,否则将会由于长时间占用事件分发者进程而导致其他事件得不到及时响应;
图 8-4 中列出了 5 个不同的事件,在事件收集、分发者进程的一次处理过程中,这 5 个事件按照顺序被收集后,将开始使用当前进程分发事件,从而调用相应的事件消费者模块来处理事件;当然,这种分发、调用也是有序的;
【3】请求处理简介
请求多阶段异步处理
把一个请求的处理过程按照事件的触发方式划分为多个阶段,每个阶段都可以由事件收集、分发器来触发;当一个事件被分发到事件消费者中进行处理时,事件消费者处理完这个事件只相当于处理完 1 个请求的某个阶段;当下一次事件出现时,epoll 等事件分发器将会获取到通知,再继续调用事件消费者处理请求;
请求多阶段异步处理优势
能够极大地提高网络性能,同时使得每个进程都能全力运转,不会或者尽量少地出现进程休眠状况;因为一旦出现进程休眠,必然减少并发处理事件的数目,必然会降低网络性能,同时会增加请求处理时间的平均时延;
处理阶段划分原则
- 将阻塞进程的方法按照相关的触发事件分解为两个阶段
- 一个阻塞进程的方法调用时可以划分为两个阶段 :
- 第一阶段,阻塞方法改为非阻塞方法调用,调用非阻塞方法并将进程归还给事件分发器的阶段;
- 第二阶段,增加新的处理阶段用于处理非阻塞方法最终返回的结果,这里的结果返回事件就是第二阶段的触发事件;
- 将阻塞方法调用按照时间分解为多个阶段的方法调用
- 在“无所事事”且必须等待系统的响应,从而导致进程空转时,使用定时器划分阶段
- 如果阻塞方法完全无法继续划分,则必须使用独立的进程执行这个阻塞方法
【4】Nginx 进程管理简介
管理进程 (Master) 多工作进程 (Worker) 设计
设计优势
- 利用多核系统的并发处理能力
- 负载均衡
- 管理进程会负责监控工作进程的状态,并负责管理其行为
【5】Nginx 源码基本结构
├── core : Nginx 的核心源代码,包括常用数据结构的以及 Nginx 内核实现的核心代码
├── event : Nginx 事件驱动模型,以及定时器的实现相关代码
├── http : Nginx 实现 http 服务器相关的代码
├── mail : Nginx 实现邮件代理服务器相关的代码
├── misc : 辅助代码,测试 C++ 头的兼容性,以及对 Google_PerfTools 的支持
├── os : 不同体系统结构所提供的系统函数的封装,提供对外统一的系统调用接口
└── stream : 实现四层协议的转发、代理或者负载均衡等功能
参考致谢
本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。
【1】深入理解 Nginx 模块开发与架构解析
【2】理解 Nginx 源码