深度解析ngx_command_t结构

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_TAKEnn代表个数 最大是7 可携带n个
NGX_CONF_TAKEabcabc分别代表数字 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_slotngx_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_slotngx_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指 针

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ngx_mail_module_t 是 Nginx 邮件模块的结构体类型,定义在 ngx_mail.h 文件中。它是 Nginx 邮件模块的入口点,包含了邮件模块的各种配置信息和处理函数指针,可以通过该结构体来扩展 Nginx 的邮件功能。具体而言,ngx_mail_module_t 结构体包括以下成员: - ngx_str_t name:邮件模块的名称; - void *(*create_conf)(ngx_conf_t *cf):邮件模块的配置创建函数,用于创建一个新的 ngx_mail_conf_t 配置结构体; - char *(*init_conf)(ngx_conf_t *cf, void *conf):邮件模块的配置初始化函数,用于初始化 ngx_mail_conf_t 配置结构体; - void *(*create_ctx)(ngx_mail_session_t *s):邮件模块的上下文创建函数,用于创建一个新的 ngx_mail_core_srv_conf_t 上下文结构体; - void (*init_session)(ngx_mail_session_t *s, ngx_connection_t *c):邮件模块的会话初始化函数,用于初始化 ngx_mail_session_t 会话结构体; - ngx_int_t (*parse_command)(ngx_mail_session_t *s):邮件模块的命令解析函数,用于解析客户端发送的命令; - ngx_int_t (*handle_command)(ngx_mail_session_t *s):邮件模块的命令处理函数,用于处理客户端发送的命令; - void (*finalize_session)(ngx_mail_session_t *s):邮件模块的会话清理函数,用于清理 ngx_mail_session_t 会话结构体。 通过 ngx_mail_module_t 结构体,我们可以自定义邮件模块的各种处理逻辑和配置信息,从而扩展 Nginx 的邮件功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值