| 2012年10月31日
在nginx模块编写种主要会涉及到下面3个数据结构,这一篇我就先来看看这3个数据结构的作用和意义。
- ngx_command_t
- ngx_module_t
- ngx_http_module_t
前面这两个是定义在这个文件中:src/core/ngx_core.h
typedef struct ngx_module_s ngx_module_t;
typedef struct ngx_command_s ngx_command_t;
两个结构体是在这个文件中定义的:src/core/ngx_conf_file.h
先看:ngx_command_s 这个结构体是用来保存组织配置文件中各个配置字段的。
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; //暂时不知道做什么用
};
这里要提到的主要又这几个字段:type,set,conf,offset
type是标示这个配置字段的作用范围和参数设置,如:NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
这些宏是在src/http/ngx_http_config.h中定义的,首先nginx的配置文件的作用域又三个:main,server,local,分别指全局配置域,虚拟server配置域和localtion作用域,由大而小,所以在这里指定。
这里指定的还有一个就是这个配置字段有几个参数:
#define NGX_CONF_NOARGS 0x00000001 //没有参数
#define NGX_CONF_TAKE1 0x00000002 //一个参数
。。。。<
#define NGX_CONF_TAKE7 0x00000080 //7个参数
#define NGX_CONF_MAX_ARGS 8 //最大参数个数
set是一个函数指针,它主要从配置种返回这个命令字段的配置参数:
nginx系统提供了一些常用的设置函数
ngx_conf_set_flag_slot:针对于on和off这种标志处理
ngx_conf_set_str_slot: 对一般的字符串配置
ngx_conf_set_str_array_slot:对多参数处理
ngx_conf_set_keyval_slot:对于key-value类型参数处理
ngx_conf_set_num_slot:针对数字配置处理
这里还有好多,很多都没怎么用过
conf是nginx整体配置域的一个偏移量:
它的取值只有这样3个:
src/http/ngx_http_config.h
#define NGX_HTTP_MAIN_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, main_conf)
#define NGX_HTTP_SRV_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, srv_conf)
#define NGX_HTTP_LOC_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, loc_conf)
ngx_http_conf_ctx_t结构体是这样的,
typedef struct {
void **main_conf;
void **srv_conf;
void **loc_conf;
} ngx_http_conf_ctx_t;
这里的offsetof的一个gcc的一个宏,用来获取结构体内字段在结构体内的偏移量,和之前内核种常见的conten_of是一样的。原理:
#define offsetof(s, m) (size_t)&(((s *)0)->m)
offset是配置字段在配置结构体中的偏移量:
例如我定义了这样一个配置段结构体:
typedef struct {
ngx_str_t xlog_redis;
} ngx_log_redis_loc_conf_t;
那这里对xlog_redis配置的offset值就是offsetof(ngx_log_redis_loc_conf_t, xlog_redis)
关注「黑光技术」,关注大数据+微服务