标签:style class blog code http com
同一个配置项可以同时出现多个块内,例如HTTP块、server块、location块。一个配置项到底是取哪个块中的值完全有我们定义的模块决定。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
标签:style class blog code http com
原文地址:http://blog.csdn.net/nestler/article/details/32985511