ITPub博客

首页 > > > 调用该函数-create_loc_conf

调用该函数-create_loc_conf

作者:longmanma 时间:2019-12-13 17:57:15 0 删除 编辑

create_loc_conf:

 调用该函数创建本模块位于location block的配置信息存储结构。每个在配置中指明的location创建一个。该函数执行成功,返回创建的配置对象。失败的话,返回NULL。

merge_loc_conf:与merge_srv_conf类似,这个也是进行配置值合并的地方。该函数成功的时候,返回NGX_CONF_OK。失败的话,返回NGX_CONF_ERROR或错误字符串。

Nginx里面的配置信息都是上下一层层的嵌套的,对于具体某个location的话,对于同一个配置,如果当前层次没有定义,那么就使用上层的配置,否则使用当前层次的配置。

这些配置信息一般默认都应该设为一个未初始化的值,针对这个需求,Nginx定义了一系列的宏定义来代表各种配置所对应数据类型的未初始化值,如下:

#define NGX_CONF_UNSET -1

#define NGX_CONF_UNSET_UINT (ngx_uint_t) -1

#define NGX_CONF_UNSET_PTR (void *) -1

#define NGX_CONF_UNSET_SIZE (size_t) -1

#define NGX_CONF_UNSET_MSEC (ngx_msec_t) -1

又因为对于配置项的合并,逻辑都类似,也就是前面已经说过的,如果在本层次已经配置了,也就是配置项的值已经被读取进来了(那么这些配置项的值就不会等于上面已经定义的那些UNSET的值),就使用本层次的值作为定义合并的结果,否则,使用上层的值,如果上层的值也是这些UNSET类的值,那就赋值为默认值,否则就使用上层的值作为合并的结果。对于这样类似的操作,Nginx定义了一些宏操作来做这些事情,我们来看其中一个的定义。

#define ngx_conf_merge_uint_value(conf, prev, default) \

if (conf == NGX_CONF_UNSET_UINT) { \

conf = (prev == NGX_CONF_UNSET_UINT) ? default : prev; \

}

显而易见,这个逻辑确实比较简单,所以其它的宏定义也类似,我们就列具其中的一部分吧。

ngx_conf_merge_valuengx_conf_merge_ptr_valuengx_conf_merge_uint_valuengx_conf_merge_msec_valuengx_conf_merge_sec_value

等等。

下面来看一下hello模块的模块上下文的定义,加深一下印象。

static ngx_http_module_t ngx_http_hello_module_ctx = {

NULL, /* preconfiguration */

ngx_http_hello_init, /* postconfiguration */

NULL, /* create main configuration */

NULL, /* init main configuration */

NULL, /* create server configuration */

NULL, /* merge server configuration */

ngx_http_hello_create_loc_conf, /* create location configuration */

NULL /* merge location configuration */

};

注意:这里并没有提供merge_loc_conf函数,因为我们这个模块的配置指令已经确定只出现在NGX_HTTP_LOC_CONF中这一个层次上,不会发生需要合并的情况。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2730/viewspace-3150965/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-12-18

  • 博文量
    492
  • 访问量
    12004