如何自定义配置项处理办法和合并

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 如何自定义配置项处理办法和合并,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1自定义配置项处理方法

例子:

假设我们要处理的配置项名称是test_config,它接收1个或者2个参数,且第1个参数类型 是字符串,第2个参数必须是整型:

typedef struct {
ngx_str_t my_config_str;
ngx_int_t my_config_num;
} ngx_http_mytest_conf_t;

command的set方法

static char* ngx_conf_set_myconfig(ngx_conf_t cf, ngx_command_t cmd, void *conf)

自定义自己的结构体

static  ngx_conf_set_myconfig(ngx_conf_t cf,ngx_command_t cmd,void* conf)
{
    /*注意,参数conf就是HTTP框架传给用户的在ngx_http_mytest_create_loc_conf回调方法中
    分配的结构体ngx_http_mytest_conf_t*/
    ngx_http_mytest_conf_t mycf = conf;
    /* cf->args是1个ngx_array_t队列,它的成员都是ngx_str_t结构。我们用value指向ngx_array_t的
elts内容,其中value[1]就是第1个参数,同理,value[2]是第2个参数*/
    ngx_str_t value=cf->args->elts;

    if(cf->args->nlts>1)
    {
        mycf->my_config_str=value[1];
    }
    if(cf->args->nlts>2)
    {
      mycf->my_config_num = ngx_atoi(value[2].data, value[2].len);
      if(mycf->my_config_num == NGX_ERROR)
      {
        return "invaild number";      }
        
    }
    return NGX_CONF_OK;

参数解析:

1.参数conf就是HTTP框架传给用户的在ngx_http_mytest_create_loc_conf回调方法中分配的结构体ngx_http_mytest_conf_t(相当一座桥梁)

2.cf->args是1个ngx_array_t队列,它的成员都是ngx_str_t结构。我们用value指向ngx_array_t的
elts内容,其中value[1]就是第1个参数,同理,value[2]是第2个参数 (int main(char*arg….))

效果:

location{
      test_myconfig jordan 23;
}

my_config_str的值是jordan,而
my_config_num的值是23

合并配置项

背景:

一个test_str配置同时在http{…}、server{…}、location/url1{…} 中出现时,到底以哪一个为准?

下面是一个 ngx_http_module_t 结构:

typedef struct {
…
void (create_loc_conf)(ngx_conf_t cf);
char (*merge_loc_conf)(ngx_conf_t cf, void prev, void *conf);
…
} ngx_http_module_t;

1.上面这段代码定义了create_loc_conf方法,意味着HTTP框架会建立loc级别的配置

2.如果没有 merge函数 server块或者http块内出现的配置项都不会 生效。如果我们希望在server块或者http块内的配置项也生效,那么可以通过merge_loc_conf 方法来实现。merge_loc_conf会把所属父配置块的配置项与子配置块的同名配置项合并

解析

第1个参数仍然是ngx_conf_t*cf,提供一些基本的数据结构, 如内存池、日志等。第2、第3个参数

其中第2个参数void*prev是指解析 父配置块时生成的结构体,

而第3个参数void*conf则指出的是保存子配置块的结构体

示例:

static char *
ngx_http_mytest_merge_loc_conf(ngx_conf_t cf, void parent, void *child)
{
ngx_http_mytest_conf_t prev = (ngx_http_mytest_conf_t )parent;
ngx_http_mytest_conf_t conf = (ngx_http_mytest_conf_t )child;
ngx_conf_merge_str_value(conf->my_str,
prev->my_str, "defaultstr");
return NGX_CONF_OK;
}

1.引进一个宏ngx_conf_merge_str_value

#define ngx_conf_merge_str_value(conf, prev, default) \
// 当前配置块中是否已经解析到test_str配置项
if (conf.data == NULL){ 
// 父配置块中是否已经解析到test_str配置项
if (prev.data) { \
// 将父配置块中的
//test_str参数值直接覆盖当前配置块的test_str
conf.len = prev.len; \
conf.data = prev.data; \
} else { \
/*如果父配置块和子配置块都没有解析到
test_str,以
default参数作为默认值传给当前配置块的
test_str*/
conf.len = sizeof(default) - 1; \
conf.data = (u_char *) default; \
} \
}

2.效果

只需要按照自己的需求将父配置块的值赋予子配置块即可,这时表示父配置
块优先级更高

附录 关于十种配置项合并宏()

配置项合并宏 意义
ngx_conf_merge_value 合并可以使用等号(=)直接赋值的变量,并且该变量在 create_loc_conf等分配方法中初始化为NGX_CONF_UNSET,这样类型的成员可以使用ngx_conf_merge_value合并宏(预值处理项)
ngx_conf_merge ptr_value 合并指针类型的变量,并且该变量在create_loc_conf等分配方法中初始化为NGX_CONF_UNSET_PTR,这样类型的成员可以使用ngx_conf_merge_ptr_value合并宏
ngx_conf_merge_uint_value 合并整数类型的变量,并且该变量在create_loc_conf等分配方法中初始化为NGX_CONF_UNSET_UINT,这样类型的成员可以使用ngx_conf_merge_uint_value合并宏
ngx_conf_merge_msec_value 合并表示毫秒的ngx_msec_t类型的变量,并且该变量在create_loc_conf等分配方法中初始化为NGX_CONF_UNSET_MSEC,这样类型的成员可以使用ngx_conf merge_msec_value合并宏
ngx_conf_merge_sec_value 合并表示秒的time_t类型的变量,并且该变量在create_loc_conf等分配方法中初始化为NGX_CONF_UNSET,这样类型的成员可以使用ngx_conf_merge_sec_value合并宏
ngx_conf_merge_size_value 合并size_t等表示空间长度的变量,并且该变量在 create_loc_conf等分配方法中初始化为NGX_CONF_UNSET_SIZE,这样类型的成员可以使用ngx_conf_merge_size_value合并宏
ngx_conf_merge_off_value 合并off_t等表示偏移量的变量,并且该变量在create_loc_conf等分配方法中初始化为NGX_CONF_UNSET,这样类型的成员可以使用ngx_conf_merge_off_value合并宏
ngx_conf_merge_bufs_value ngx_bufs_t类型的成员可以使用ngx_conf_merge_bufs_value合并宏,这时传入的default参数是两个,因为ngx_bufs_t类型有两个成员,所以需要传入两个默认值
ngx_conf_merge_bitmask_value 以二进制位来表示标志位的整型成员,可以使用ngx_conf_merge_bitmask_value合并宏

note:

参照1:一文读懂14种预设方法解析配置项_编程界的谢菲尔德的博客-CSDN博客

注意:除了ngx_conf_merge_bufs_value 外,它们都将接收3个参数,分别表示父配置块参数、子配置块参数、默认值。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/129612.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!