4.2.4 自定义配置项处理方法

除了使用Nginx已经实现的14个通用配置项处理方法外,还可以自己编写专用的配置项处理方法。事实上,3.5节中的ngx_http_mytest就是自定义的处理mytest配置项的方法,只是没有去处理配置项的参数而已。本节举例说明如何编写方法来解析配置项。

假设我们要处理的配置项名称是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;


其中,my_config_str存储第1个字符串参数,my_config_num存储第2个数字参数。

首先,我们按照4.2.2节ngx_command_s中的set方法指针格式来定义这个配置项处理方法,如下所示。


static charngx_conf_set_myconfig(ngx_conf_tcf,ngx_command_tcmd,voidconf);


接下来定义ngx_command_t结构体,如下所示。


static ngx_command_t ngx_http_mytest_commands[]={

……

{ngx_string("test_myconfig"),

NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,

ngx_conf_set_myconfig,

NGX_HTTP_LOC_CONF_OFFSET,

0,

NULL},

ngx_null_command

};


这样,test_myconfig后就必须跟着1个或者2个参数了。现在开始实现ngx_conf_set_myconfig处理方法,如下所示。


static charngx_conf_set_myconfig(ngx_conf_tcf,ngx_command_tcmd,voidconf)

{

/注意,参数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;

//ngx_array_t的nelts表示参数的个数

if(cf->args->nelts>1)

{

//直接赋值即可,ngx_str_t结构只是指针的传递

mycf->my_config_str=value[1];

}

if(cf->args->nelts>2)

{

//将字符串形式的第2个参数转为整型

mycf->my_config_num=ngx_atoi(value[2].data,value[2].len);

/如果字符串转化整型失败,将报“invalid number”错误,Nginx启动失败/

if(mycf->my_config_num==NGX_ERROR){

return"invalid number";

}

}

//返回成功

return NGX_CONF_OK;

}


假设nginx.conf中出现test_myconfig jordan 23;配置项,那么my_config_str的值是jordan,而my_config_num的值是23。