概述
struct ngx_command_s {
ngx_str_t name;
ngx_uint_t type;
char (set)(ngx_conf_t cf, ngx_command_t cmd, void conf);
ngx_uint_t conf;
ngx_uint_t offset;
void post;
};
解析:
1)ngx_str_t name
其中,name是配置项名称,
2)ngx_uint_t type
其中,type决定这个配置项可以在哪些块(如http、server、location、if、upstream块等) 中出现,以及可以携带的参数类型和个数等。表4-1列出了设置http配置项时type可以取的 值。注意,type可以同时取表4-1中的多个值,各值之间用|符号连接.附录1可见
3)关于set回调方法。
如果处理配置项,我们既可以自己实现一个回调方法来处理配置项,也可以使用Nginx预设的14个解析配置项方法,这会少写许 多代码,附录二
4)ngx_uint_t conf conf
用于指示配置项所处内存的相对偏移位置,仅在type中没有设置 NGX_DIRECT_CONF和NGX_MAIN_CONF时才会生效
对于HTTP模块,conf是必须要设置 的
conf在HTTP中的取值 | 意义 |
NGX_HTTP_MAIN_CONF_OFFSET | 使用create_main_conf方法产生的结构体来储存解析的配置参数 |
NGX_HTTP_SRV_CONF_OFFSET | 使用create_srv_conf方法产生的结构体来储存解析的配置参数 |
NGX_HTTP_LOC_CONF_OFFSET | 使用create_loc_conf方法产生的结构体来储存解析的配置参数 |
为什么HTTP模块一定要设置conf的值呢?因为HTTP框架可以使用预设的14种方法自动 地将解析出的配置项写入HTTP模块代码定义的结构体中,但HTTP模块中可能会定义3个结 构体,分别用于存储main、srv、loc级别的配置项(对应于create_main_conf、 create_srv_conf、create_loc_conf方法创建的结构体),而HTTP框架自动解析时需要知道应把 解析出的配置项值写入哪个结构体中,这将由conf成员完成 因此,对conf的设置是与ngx_http_module_t实现的回调方法(在4.2.1节中介绍)相关的。 如果用于存储这个配置项的数据结构是由create_main_conf回调方法完成的,那么必须把conf 设置为NGX_HTTP_MAIN_CONF_OFFSET。同样,如果这个配置项所属的数据结构是由 create_srv_conf回调方法完成的,那么必须把conf设置为NGX_HTTP_SRV_CONF_OFFSET。 可如果create_loc_conf负责生成存储这个配置项的数据结构,就得将conf设置为 NGX_HTTP_LOC_CONF_OFFSET。
5)ngx_uint_t offset offset
表示当前配置项在整个存储配置项的结构体中的偏移位置(以字节(Byte)为单 位)
例子:
typedef struct { int a; int b; int c; } test_stru;
如果要处理的配置项是由成员b来存储参数的,那么这时b相对于test_stru的偏移量就是 4;如果要处理的配置项由成员c来存储参数,那么这时c相对于test_stru的偏移量就是8设置offset有什么作用呢?如果使用Nginx预设的解析配置项方法,就必须设置offset,这 样Nginx首先通过conf成员找到应该用哪个结构体来存放,然后通过offset成员找到这个结构 体中的相应成员,以便存放该配置
6)void*post
如果自定义了配置项的回调方法,那么post指针的用途完全由用户来定义。如果不使用 它,那么随意设为NULL即可。如果想将一些数据结构或者方法的指针传过来,那么使用post 也可以。 如果使用Nginx预设的配置项解析方法,就需要根据这些预设方法来决定post的使用方式
附录一
type类型 | type取值 | 意义 |
处理配置项时获取当前配置块的方式 | NGX_DIRECT_CONF | 一般由NGx_CORE_MODULE类型的核心模块使用,仅与下面的NGX_MAIN_CONF同时设置,表示模块需要解析不属于任何{}内的全局配置项。它实际上会指定set方法里的第3个参数conf的值,使之指向每个模块解析全局配置项的配置结构体1 |
NGX_ANY_CONF | 无意义 | |
配置项可以出现在那些配置项中 | NGX_MAIN_CONF | 出现在全局配置中 |
NGX_EVENT_CONF | 出现event中 | |
NGX_MAIL_MAIN_CONF | 出现在mail{}中 | |
NGX_HTTP_MAIN_CONF | 出现在http{}中 | |
NGX_HTTP_SRV_CONF | 出现在server{}中但是server必须在http | |
NGX_HTTP_LOC_CONF | 同理出现location | |
NGX_HTTP_UPS_CONF | 同理出现在upstream | |
NGX_HTTP_SIF_CONF | 出现在server{}中if{} | |
NGX_HTTP_LIF_CONF | 出现在loctaion中if{} | |
配置项携带参数 | NGX_CONF_NOARGS | 不带参数 |
NGX_CONF_TAKE1 | 一个 | |
NGX_CONF_TAKEn | n代表个数 最大是7 可携带n个 | |
NGX_CONF_TAKEabc | abc分别代表数字 a|b|c个 | |
配置项参数后的出现形式 | NGX_CONF_ARGS_NUMBER | 无意义 |
NGX_CONF_BLOCK | 配置项定义了一种新的{}块。例如,http, server ,location等配置,它们的type都必须定义为NGx_CONF_BLOCK | |
NGX_CONF_ANY | 不验证配置项携带的参数个数 | |
NGX_CONF_FLAG | 配置项携带的参数只能是1个,并且参数的值只能是 on或者off | |
NGX_CONF_1MORE | 配置项携带的参数个数必须超过1 | |
NGX_CONF_2MORE | 配置项携带的参数个数必须超过2个 | |
NGx_CONF_MULTI | 表示当前配置项可以出现在任意块中(包括不属于任何块的全局配置),它仅用于配合其他配置项使用。type中未加NGx_CONF_MULTI 时,如果一个配置项出现在type成员未标明的配置块中,那么Nginx会认为该配置项非法,最后将导致Nginx启动失败。但如果type中加入了 NGX_CONF_MULTI,则认为该配置项一定是合法的,然而又会有两种不同的结果:①如果配置项出现在type指示的块中,则会调用set方法解析配置项;②如果配置项没有出现在 type指示的块中,则不对该配置项做任何处理。因此,NGx_CONF_MULTI会使得配置项出现在未知块中时不会出错日前,还沿有官方抉街用讨NGX CONF MULTI |
note1
每个进程中都有一个唯一的ngx_cycle_t核心结构体,它有一个成员conf_ctx维护着所有模块的配置结构体,其类型是void****。conf_ctx意义为首先指向一个成员皆为指针的数组, 其中每个成员指针又指向另外一个成员皆为指针的数组,第2个子数组中的成员指针才会指 向各模块生成的配置结构体。这正是为了事件模块、http模块、mail模块而设计的。这有利于不同NGX_CORE_MODULE类型的特定模块解析配置项。然而, NGX_CORE_MODULE类型的核心模块解析配置项时,配置项一定是全局的,不会从属于 任何{}配置块的,它不需要上述这种双数组设计。解析标识为NGX_DIRECT_CONF类型的 配置项时,会把void****类型的conf_ctx强制转换为void**,也就是说,此时,在conf_ctx指向 的指针数组中,每个成员指针不再指向其他数组,直接指向核心模块生成的配置结构体。因 此,NGX_DIRECT_CONF仅由NGX_CORE_MODULE类型的核心模块使用,而且配置项只 应该出现在全局配置
note2
如果HTTP模块中定义的配置项在nginx.conf配置文件中实际出现的位置和参 数格式与type的意义不符,那么Nginx在启动时会报错。
附录二
预设方法名 | 意义 |
ngx_conf_set_flag_slot | 如果nginx.conf文件中某个配置项的参数是on或者off(即希望配置项表达打开或者关闭某个功能的意思),而且在Nginx模块的代码中使用ngx_flag_t变量来保存这个配置项的参数,就可以将set回调方法设为ngx_conf_set_flag_slot。当nginx.conf文件中参数是on时,代码中的ngx_flag_t类型变量将设为1,参数为off时则设为0 |
ngx_conf_set_str_slot | 如果配置项后只有1个参数.同时在代码中我们希望用ngx_str_t类型的变量来保存这个配置项的参数,则可以使用ngx_conf_set_str_slot方法 |
npx_confset_str_array slot | 如果这个配置项会出现多次,每个配置项后面都跟着1个参数,而在程序中我们希望仅用一个ngx_array_t动态数组来存储所有的参数,且数组中的每个参数都以ngx_str_t来存储,那么预设的ngx_conf_set_str_array_slot方法可以帮我们做到 |
ngx_conf_set_keyval_slot | 与ngx_conf_set_str_array_slot类似,也是用一个ngx_array_t数组来存储所有同名配置项的参数。只是每个配置项的参数不再只是1个,而必须是两个,且以“配置项名关键字值;”的形式出现在nginx.conf文件中.同时,ngx_conf_set_keyval_slot将把这些配置项转化为数组,其中每个元素都存储着key/value键值对 |
ngx_conf_set_num_slot | 配置项后必须携带1个参数,且只能是数字。存储这个参数的变量必须是整型配置项后必须携带1个参数,表示空间大小,可以是一个数字,这时表示字节数(Byte)。如果数字后跟着k或者K,就表示 Kilobytc,1KB=1024B;如果数字后跟着m或者M,就表示Megabyte,1MB=1024KB。 |
ngx_conf_set_size_slot | ngx_conf_set_size_slot解析后将把配置项后的参数转化成以字节数为单位的数字 |
ngx_eonf set_off slot | 配置项后必须携带1个参数,表示空间上的偏移量。它与设置的参数非常类似,其参数是一个数字时表示 Byte,也可以在后面加单位,但与ngx_conf_set_sizeslot不同的是,数字后面的单位不仅可以是k或者K.m或者M,还可以是g或者G,这时表示 Gigabyte,1GB=1024MB。ngx_conf_set_off slot解析后将把配置项后的参数转化成以字节数为单位的数字 |
ngx_conf set_msec slot | 配置项后必须携带1个参数,表示时间。这个参数可以在数字后面加单位,如果单位为s或者没有任何单位,那么这个数字表示秒;如果单位为m,则表示分钟,1m=60s ;如果单位为h,则表示小时,1h-60m ;如果单位为d,则表示天,1d=24h ;如果单位为w,则表示周,!w=7d;如果单位为M,则表示月,IM=30d;如果单位为y,则表示年,Iy=365d。ngx_conf_set_msec_slot解析后将把配置项后的参数转化成以毫秒为单位的数字 |
ngx _conf set_sec_slot | ngx_conf_set_msec_slot 非常类似,唯一的区别是ngx_conf_set_msec_slot解析后将把配置项后的参数转化成以毫秒为单位的数字,而ngx_conf_set_ sec_slot解析后会把配置项后的参数转化成以秒为单位的数字 |
ngx_conf_ set_bufs _slot | 配置项后必须携带一两个参数、第1个参数是数字,第2个参数表示空间大小。例如,“gzip_buffers 4 8k;”(通常用来表示有多少个ngx_buf_t缓冲区),其中第1个参数不可以携带任何单位,第2个参数不带任何单位时表示 Byte,如果以k或者K作为单位,则表示 Kilobyte,如果以m或者M作为单位,则表示 Megabyte,ngx_conf_set_bufs_slot解析后会把配置项后的两个参数转化成ngx_bufs_t结构体下的两个成员。这个配置项对应于Nginx最喜欢用的多缓冲区的解决方案(如接收连接对端发来的TCP流) |
ngx_conf_set_enum_slot | 配置项后必须携带1个参数,其取值范围必须是我们设定好的字符串之一(就像C语言中的枚举一样)。首先,我们要用ngx_conf_enum_t结构定义配置项的取值范围,并设定每个值对应的序列号。然后,ngx_conf_set_enum_slot将会把配置项参数转化为对应的序列号 |
ngx_conf_set_access_slot | 这个方法用于设置目录或者文件的读写权限。配置项后可以携带1~3个参数,可以是如下形式: user:rw group:rw all:rw。注意,它的意义与Linux上文件或者目录的权限意义是一致的,但是user/group/all后面的权限只可以设为rw(读/写)或者r(只读),不可以有其他任何形式,如w或者rx等。ngx_conf_set_access_slot将会把这些参数转化为一个整型 |
ngx_conf_set _path_slot | 这个方法用于设置路径,配置项后必须携带1个参数,表示1个有意义的路径。ngx_conf_set_path_slot将会把参数转化为ngx_path_t结构 |
ngx_conf_set_bitmask_slot | 与ngx_conf_set_bitmask_slot类似,配置项后必须携带1个参数,其取值范围必须是设定好的字符串之一。首先,我们要用ngx_conf_bitmask_t结构定义配置项的取值范围,并设定每个值对应的比特位。注意,每个值所对应的比特位都要不同。然后ngx_conf_set_bitmask_slot将会把配置项参数转化为对应的比特位 |
附录三
post的使用方法 | 预设配置的解析方法 |
这个方法用于设置目录或者文件的读写权限。配置项后可以携带1~3个参数,可以是如下形式: user:rw group:rw all:rw。注意,它的意义与Linux上文件或者目录的权限意义是一致的,但是user/group/all后面的权限只可以设为rw(读/写)或者r(只读),不可以有其他任何形式,如w或者rx等。ngx_conf_set_access_slo将会把这些参数转化为一个整型 | ngx_conf_set_flag_slot ngx_conf_set_str_slot ngx_conf_set_str_array_slot ngx_conf_set_keyval_slot ngx_conf_set ngx_num_slot ngx_conf_set_size_slot ngx_conf_set_off_slot ngx_conf_set_msec_slot ngx conf set sec slot |
指向ngx_conf_enum_t数组,表示当前配置项的参数必须设置为ngx_conf_num_t规定的值(类似枚举)。注意,使用ngx_conf_set_enum_slot时必须设置定义1个ngx_conf_enum_t数组,并将post成员指向该数组 | ngx_conf_set_enum_solt |
指向ngx_conf_bitmask_t数组,表示当前配置项的参数必须设置为ngx_conf_bitmask_t规定的值(类似枚举)。注意,使用ngx_conf_set_bitmask_slot时必须设置定义1个ngx_conf_bitmask _t数组,并将post成员指向该数组 | ngx_conf_set_bitmask_solt |
无意义 | ngx_conf_set_bufs_slot ngx_conf_set_path_slot ngx_conf_set_access_slot |
note3:ngx_conf_post_t
typedef char (ngx_conf_post_handler_pt) (ngx_conf_t cf,void data, void *conf);
typedef struct {
ngx_conf_post_handler_pt post_handler;
} ngx_conf_post_t;
如果需要在解析完配置项后回调某个方法,就要实现 上面的ngx_conf_post_handler_pt,并将包含post_handler的ngx_conf_post_t结构体传给post指 针
最后
以上就是碧蓝冷风为你收集整理的深度解析ngx_command_t结构的全部内容,希望文章能够帮你解决深度解析ngx_command_t结构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复