本节主要讲述一下nginx module的实现。
1. 当前nginx的signature
当前nginx模块共有34个signature,动态添加进入的模块(通过load_module
指令添加)的signature必须和这里的signature一致,否则会添加失败。
首先NGX_MODULE_SIGNATURE_0
是最基本的signature,基本反映了当前nginx可执行文件所匹配的机器字长、原子整形数据字长以及time_t
数据类型长度。 当前这些长度在我们32为Ubuntu系统上都是4。
剩余的一些特性我们这里并不详细介绍。
2. nginx module相关宏定义
这里我们简要介绍一下这两个宏定义:
3. ngx_module_s数据结构
ngx_module_s
数据结构是对Nginx 模块的一个抽象。下面我们简要介绍一下各字段的含义:
-
ctx_index
: 分类的模块计数器。nginx模块可以分为四种: core、event、http和mail,每个模块都会有各自计数,ctx_index就是每个模块在其所属类组的计数。
-
index
: 用于指定本模块在ngx_modules
数组中的索引值
-
name
: 用于指示模块的名称
-
spare0/spare1
: 暂时保留,不做使用
-
version
: 用于指定版本号,当前值为1010003
,即1.10.3
版本
-
commands
: 用于指定该模块的指令集
-
type
: 用于指定模块的类型
-
init_master
: 初始化master时执行的回调函数,当前在系统中并未有任何地方用到
-
init_module
: 在对module执行初始化时执行, 当前会在ngx_init_modules()
函数调用时用到
-
init_process
: 在子进程初始化时,会调用module的init_process回调函数
-
init_thread
: 在线程初始化时,执行本回调函数, 当前在系统中并未有任何地方用到
-
exit_thread
: 在线程退出时,执行本回调函数,当前在系统中并未有任何地方用到
-
exit_process
: 在子进程退出时,会执行本回调函数
-
exit_master
: 在master进程退出时,会执行本回调函数。当前在系统ngx_master_process_exit()函数中会被调用。
-
spare_hook0/1/2/3/4/5/6/7
: 其他一些hook函数,当前在系统中暂未被使用到
4. ngx_core_module_t数据结构
此数据结构作为核心模块的一个context类型,即ngx_module_s.ctx
。对于core、event、http和mail, 其都属于核心模块,各自都拥有一个context对象。下面介绍一下本数据结构的各字段:
-
name
: context名称。对于core模块,本字段取值一般为core
,对于event模块,本字段取值一般为events
。
-
create_conf
: 一般在系统初始化调用本回调函数创建相应的上下文结构。例如在整个系统初始化时,会分别调用core、event、http、mail等核心模块的create_conf函数; 在解析到events
指令时, 又会调用本函数创建整个events模块的上下文结构。
-
init_conf
: 一般在解析完成相应的指令后,调用本回调函数对一些配置中未设置的变量完成相应的初始化
5. 相关函数声明
6. 相关变量声明
下面我们简要介绍一下各变量:
-
ngx_modules
: 全局变量,在nginx编译时将当前所有编译到的模块添加到该数组中
-
ngx_max_module
: 当前最大模块数,包括编译时所有的静态模块数以及后续可添加的最大动态模块数。
-
ngx_module_names
: 全局变量,在Nginx编译时将当前所有编译到的模块的名称存放到该数组中
[参看]
- nginx-module-t数据结构