nginx模块编程学习笔记3–模块主要数据结构

在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)

Leave a Reply

Your email address will not be published. Required fields are marked *