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。