【Nginx】如何使用http配置
处理http配置项可以分为下面4个步骤:
1)创建数据结构用于存储配置项对应的参数
2)设定配置项在nginx.conf中出现时的限制条件与回调方法
3)实现第2步中的回调方法,或者使用Nginx框架预设的14个回调方法
4)合并不同级别的配置块中出现的同名配置项
一、分配用于保存配置参数的数据结构
创建结构体(命名例子:ngx_http_mytest_conf_t)来存储配置项的参数值,使用ngx_http_module_t中的create_main_conf,create_srv_conf、create_loc_conf这三个回调方法把我们分配的用于保存配置项的结构体传递给http框架,即生成结构体。
使用结构体来存储配置项的参数值的原因:多个location块(http块、server块)中的相同配置项是允许同时生效的,即刚刚定义的结构体在Nginx的内存中会保存许多份,所以不能使用全局变量。
定义三个回调方法的原因:
http框架定义了3个级别的配置main、srv、loc,分别表示直接出现在http{}、server{}、location{}块内的配置项。当遇到http{}配置块时,http框架会调用以上三个方法;当遇到server{}块时会再次调用所有http模块的create_srv_conf,create_loc_conf回调方法;当遇到location{}时会调用create_loc_conf回调方法。
一个create_loc_conf方法的例子:
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->test_flag=NGX_CONF_UNSET;
mycf->test_num=NGX_CONF_UNSET;
//...类似上面的赋值
return mycf;
}
二、设定配置项的解析方法
使用ngx_command_t结构来配置配置项:
struct ngx_command_s
{
ngx_str_t name;//配置项名称
ngx_uint_t type;//决定配置项可以在哪些块出现,以及可以携带的参数类型和个数
char *(*set)(ngx_conf_t *cf,ngx_command_t *cmd,void *conf);//使用14种预设方法解析配置项
ngx_uint_t conf;
ngx_uint_t offset;
void *post;
}ngx_command_t;
例子:使用14种预设的方法解析配置项
假设nginx.conf中有个配置项名称为test_flag,后面携带一个参数,取值必须是on或者off,故使用ngx_http_mytest_conf_t结构体中的ngx_flag_t my_flag成员来保存。
static ngx_command_t ngx_http_mytest_commands[]=
{
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},
ngx_null_command
};
三、自定义配置项处理方法
先自定义结构体存储配置项参数值,再编写set方法。
四、合并配置项
调用ngx_http_module_t结构体中的merge_loc_conf方法,如何合并取决于具体的merge_loc_conf实现