nginx.conf文件由指令组成;
指令分两种类型:block指令和非block指令;
block指令后面带一对大括号,大括号中可以包含多个指令;
ngx_modules数组包含所有注册模块,每个模块可以有一组指令;
ngx_conf_t::ctx是一个指针:
该指针指向一个数组,数组元素是指向void *数组的指针;
含义类似void **context_array[N],N为context类型数;
context_array[i]是指向大小为X的void *数组,X为子模块数目;
以events为例,N=1,即其为void **类型;
以http模块为例,N=3:
17 typedef struct { 18 void **main_conf; /* main conf类型数组 */ 19 void **srv_conf; /* server conf类型数组 */ 20 void **loc_conf; /* location conf类型数组 */ 21 } ngx_http_conf_ctx_t;
指令定义如下;
78 struct ngx_command_s {
79 ngx_str_t name;
80 ngx_uint_t type;
81 char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
82 ngx_uint_t conf;
83 ngx_uint_t offset;
84 void *post;
85 };
name是指令名字,全局唯一;
type是指令类型,通过其控制指令的使用域,在加载配置时,将其和ngx_conf_t::cmd_type进行匹配过滤,达到选择性加载目的;
set是回调函数;
conf是指出该指令操作的struct所处的数组的偏移量,即(void **)(((char *)ctx) + conf)),再加上其所属模块的ctx_index就可以定位其操作的struct;
offset是指该指令操作的数据在struct中的偏移量;
post在不同命令中有不同含义,可以是一个回调函数,在命令执行完毕后调用,也可以是一个enum数组;
在解析配置时,设置ngx_conf_t::module_type和ngx_conf_t::cmd_type来限定合法指令集;
上级模块通过设置ngx_conf_t::module_type来加载其子模块;