Nginx快速入门-3:工作流程和模块化
1.工作流程
Nginx 在处理客户端请求时,每个连接仅由一个进程进行处理,每个请求仅运行在一个工作流中,工作流被划分为多个阶段(见下图),请求在不同阶段由功能模块进行数据处理,处理结果异常或结束则将结果返回客户端,否则将进入下一阶段。工作进程维护工作流的执行,并通过工作流的状态推动工作流完成请求操作的闭环。
2.模块化
Nginx 一直秉持模块化的理念,其模块化的架构中,除了少量的主流程代码,都是模块。模块代码包括核心模块和功能模块两个部分:
- 核心模块负责维护进程的运行、内存及事件的管理;
- 功能模块则负责具体功能应用的实现,包括路由分配、内容过滤、网络及磁盘数据读写、代理转发、负载均衡等操作。
① 核心模块(core)
- 该模块提供了 Nginx 服务运行的基本功能,如 Nginx 的进程管理、CPU 亲缘性、内存管理、配置文件解析、日志等功能。
② 事件模块(event)
- 该模块负责进行连接处理,提供对不同操作系统的 I/O 网络模型支持和自动根据系统平台选择最有效 I/O 网络模型的方法。
③ HTTP模块(http)
- 该模块提供 HTTP 处理的核心功能和部分功能模块,HTTP 核心功能维护了 HTTP 多个阶段的工作流,并实现了对各种 HTTP 功能模块的管理和调用。
④ Mail模块(mail)
- 该模块实现邮件代理功能,代理 IMAP、POP3、SMTP 协议。
⑤ Stream模块(stream)
- 该模块提供 TCP/UDP 会话的代理和负载相关功能。
⑥ 第三方模块
- 第三方模块即非 Nginx 官方开发的功能模块,据统计,在开源社区发布的第三方模块已经达到 100 多个,其中 lua-resty、nginx-module-vts 等模块的使用度非常高
Nginx 早期版本在进行模块编译时,通过编译配置(configure)选项 --with_module 和 --without-module 决定要编译哪些模块,被选择的模块代码与 Nginx 核心代码被编译到同一个 Nginx 二进制文件中,Nginx 文件每次启动时都会加载所有的模块。这是一种静态加载模块的方式。
随着第三方模块的增多和 Nginx Plus 的推出,模块在不重新编译 Nginx 的情况下被动态加载成为迫切的需求。Nginx 从 1.9.11 版本开始支持动态加载模块的功能,该功能使 Nginx 可以在运行时有选择地加载 Nginx 官方或第三方模块。为使动态模块更易于使用,Nginx 官方还提供了 pkg-oss 工具,该工具可为任何动态模块创建可安装的动态模块包。在 Nginx 开源版本的代码中,编译配置选项中含有=dynamic选项,表示支持动态模块加载。