typedef struct
{
ngx_str_t my_str;
ngx_int_t my_num;
ngx_flag_t my_flag;
size_t my_size;
ngx_array_t* my_str_array;
ngx_array_t* my_keyval;
off_t my_off;
ngx_msec_t my_msec;
time_t my_sec;
ngx_bufs_t my_bufs;
ngx_uint_t my_enum_seq;
ngx_uint_t my_bitmask;
ngx_uint_t my_access;
ngx_path_t* my_path;
ngx_str_t my_config_str;
ngx_int_t my_config_num;
} ngx_http_mytest_conf_t;typedef struct {
ngx_int_t (*preconfiguration)(ngx_conf_t *cf); // 解析配置文件前调用
ngx_int_t (*postconfiguration)(ngx_conf_t *cf); // 解析完配置文件后调用
void *(*create_main_conf)(ngx_conf_t *cf); // 创建存储直属于http{}的配置项的结构体
char *(*init_main_conf)(ngx_conf_t *cf, void *conf); // 初始化main级别配置项
void *(*create_srv_conf)(ngx_conf_t *cf); // 创建存储直属于srv{}的配置项的结构体
char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf); // 合并main级别和srv级别的同名配置项
void *(*create_loc_conf)(ngx_conf_t *cf); // 创建存储直属于loc{}的配置项的结构体
char *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf); // 合并srv级别和loc级别的同名配置项
} ngx_http_module_t;static void* ngx_http_mytest_create_loc_conf(ngx_conf_t *cf)
{
ngx_http_mytest_conf_t *mycf;
mycf = (ngx_http_mytest_conf_t *)ngx_pcalloc(cf->pool, sizeof(ngx_http_mytest_conf_t));
if (mycf == NULL)
return NULL;
mycf->my_flag = NGX_CONF_UNSET;
mycf->my_num = NGX_CONF_UNSET;
mycf->my_str_array = NGX_CONF_UNSET_PTR;
mycf->my_keyval = NULL;
mycf->my_off = NGX_CONF_UNSET;
mycf->my_msec = NGX_CONF_UNSET_MSEC;
mycf->my_sec = NGX_CONF_UNSET;
mycf->my_size = NGX_CONF_UNSET_SIZE;
return mycf;
}struct ngx_command_s {
ngx_str_t name; // 配置项名称
ngx_uint_t type; // 配置项类型,包括该配置项可以出现的位置和可以携带参数的个数
// 出现name配置项后,调用此方法解析配置项参数
char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
ngx_uint_t conf; // 配置文件中的偏移量,确定将该配置项放入哪个存储结构体中
ngx_uint_t offset; // 将该配置项放在存储结构体的哪个字段
void *post; // 配置项读取后的处理方法
};{
ngx_string("test_flag"),
NGX_HTTP_LOC_CONF | NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_mytest_conf_t, my_flag),
NULL
},static char* 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;
//ngx_array_t的nelts表示参数的个数
if (cf->args->nelts > 1)
mycf->my_config_str = value[1];
if (cf->args->nelts > 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; //返回成功
}
{
ngx_string("test_myconfig"),
NGX_HTTP_LOC_CONF | NGX_CONF_TAKE12,
ngx_conf_set_myconfig,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL
},static char * ngx_http_mytest_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
{
/* parent指向父配置块对应结构体,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;
/* conf = prev或"defaultstr" */
ngx_conf_merge_str_value(conf->my_str, prev->my_str, "defaultstr");
/* conf = prev或0 */
ngx_conf_merge_value(conf->my_flag, prev->my_flag, 0);
return NGX_CONF_OK;
}【Nginx】如何处理HTTP配置,布布扣,bubuko.com
原文:http://blog.csdn.net/nestler/article/details/32985511