由于开发需要,我需要在nginx的server块中一个命令,对应对各值,而且数量并不确定,于是乎,开始了漫长的寻找资料之旅,可是,一而再,再而三的失败,只能借助于手中的源代码了,悲哀阿,捷径是没有了,整理如下
/***********************************************************
****作者:周建业
****功能:获取server模块的配置命令
****时间:2014-10-28
***********************************************************/
#include<ngx_config.h>
#include<ngx_core.h>
#include<ngx_http.h>
/* moudle config data config*/
typedef struct
{
/****存放链接数据库的用户名********************************/
ngx_array_t* DBUNameList;
/****存放链接数据库的密码*********************************/
ngx_array_t* DBPwdList;
/****存放链接数据库的数据库名称*****************************/
ngx_array_t *DBSourceList;
/****存放链接数据库的数据库地址*****************************/
ngx_array_t *DBServerAddList;
/****存放提供web服务的地址*********************************/
ngx_array_t *IISServerList;
}ngx_dbcommandList;
#define NGX_MAX_SERVER_COUNT 10
#define NGX_MAX_CHAR_LEN 50
/***********函数声明部分*****************************************/
static char *
ngx_zjy_dbname(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
static char *
ngx_zjy_dbpwd(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
static char *
ngx_zjy_dbsource(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
static char *
ngx_zjy_dbaddress(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
static char *
ngz_zjy_iisserver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
static void *
ngx_zjy_create_srv_conf(ngx_conf_t *cf);
/**********ngx处理命令列表**************************************/
static ngx_command_t ngx_zjy_commands[]={
{
ngx_string("dbname"),
NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
ngx_zjy_dbname,
NGX_HTTP_SRV_CONF_OFFSET,
offsetof(ngx_dbcommandList,DBUNameList),
NULL
},
{
ngx_string("dbpwd"),
NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
ngx_zjy_dbpwd,
NGX_HTTP_SRV_CONF_OFFSET,
offsetof(ngx_dbcommandList,DBPwdList),
NULL
},
{
ngx_string("dbsource"),
NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
ngx_zjy_dbsource,
NGX_HTTP_SRV_CONF_OFFSET,
offsetof(ngx_dbcommandList,DBSourceList),
NULL
},
{
ngx_string("dbaddress"),
NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
ngx_zjy_dbaddress,
NGX_HTTP_SRV_CONF_OFFSET,
offsetof(ngx_dbcommandList,DBServerAddList),
NULL
},
{
ngx_string("iisserver"),
NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,
ngz_zjy_iisserver,
NGX_HTTP_SRV_CONF_OFFSET,
offsetof(ngx_dbcommandList,IISServerList),
NULL
},
ngx_null_command
};
static ngx_http_module_t ngx_zjy_moudle_ctx={
NULL,
NULL,
NULL,
NULL,
ngx_zjy_create_srv_conf,//创建srv的时候调用,为我们需要的开辟空间
NULL,
NULL,
NULL
};
/************************moudle info*********************************/
ngx_module_t ngx_zjy_moudle={
NGX_MODULE_V1,
&ngx_zjy_moudle_ctx,
ngx_zjy_commands,
NGX_HTTP_MODULE,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NGX_MODULE_V1_PADDING
};
///
///函数名称:ngx_zjy_create_srv_conf
///函数描述:为我们存放命令项开辟内存空间
///
static void *
ngx_zjy_create_srv_conf(ngx_conf_t *cf)
{
ngx_dbcommandList* cmdList=NULL;
cmdList=ngx_pcalloc(cf->pool,sizeof(ngx_dbcommandList));
//检测是否分配成功
if(cmdList==NULL)
{
return NULL;
}
//初始化每个数组
cmdList->DBUNameList=ngx_array_create(cf->pool,NGX_MAX_SERVER_COUNT,NGX_MAX_CHAR_LEN);
if(cmdList->DBUNameList==NULL)
{
return NGX_CONF_ERROR;
}
cmdList->DBPwdList=ngx_array_create(cf->pool,NGX_MAX_SERVER_COUNT,NGX_MAX_CHAR_LEN);
if(cmdList->DBPwdList==NULL)
{
return NGX_CONF_ERROR;
}
cmdList->DBSourceList=ngx_array_create(cf->pool,NGX_MAX_SERVER_COUNT,NGX_MAX_CHAR_LEN);
if(cmdList->DBSourceList==NULL)
{
return NGX_CONF_ERROR;
}
cmdList->DBServerAddList=ngx_array_create(cf->pool,NGX_MAX_SERVER_COUNT,NGX_MAX_CHAR_LEN);
if(cmdList->DBServerAddList==NULL)
{
return NGX_CONF_ERROR;
}
cmdList->IISServerList=ngx_array_create(cf->pool,NGX_MAX_SERVER_COUNT,NGX_MAX_CHAR_LEN);
if(cmdList->IISServerList==NULL)
{
return NGX_CONF_ERROR;
}
ngx_log_stderr(0,"Initialize Sucessfully!");
return cmdList;
}
///
///函数结束
///
///
///函数名称:ngx_zjy_dbname
///函数描述:开始解析我们填入的数据库用户名
///
static char *
ngx_zjy_dbname(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_log_stderr(0,"we begin to get dbname");
ngx_dbcommandList* cmdList=conf;
ngx_str_t *value;
value=cf->args->elts;
ngx_uint_t i=1;
//我们i必须从1开始,因为0是命令项的名字
for( i=1;i<cf->args->nelts;i++)
{
ngx_str_t* sn=NULL;
sn=ngx_array_push(cmdList->DBUNameList);
if(sn==NULL)
{
ngx_log_stderr(0,"ngx_array_push error");
return NGX_CONF_ERROR;
}
sn->data=value[i].data;
sn->len=value[i].len;
ngx_log_stderr(0,"the %d dbname is:%s",i,sn->data);
}
return NGX_CONF_OK;
}
///
///函数结束
///
///
///函数名称:ngx_zjy_dbpwd
///函数描述:开始解析我们填入的数据库密码
///
static char *
ngx_zjy_dbpwd(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_log_stderr(0,"we begin to get dbpwd");
ngx_dbcommandList* cmdList=conf;
ngx_uint_t i=0;
ngx_str_t* value=cf->args->elts;
for(i=1;i<cf->args->nelts;i++)
{
ngx_str_t* sn=NULL;
sn=ngx_array_push(cmdList->DBPwdList);
sn->data=value[i].data;
sn->len=value[i].len;
ngx_log_stderr(0,"the %d dbpwd is:%s",i,sn->data);
}
return NGX_CONF_OK;
}
///
///函数结束
///
///
///函数名称:ngx_zjy_dbsource
///函数描述:开始解析我们填入的数据库名称
///
static char *
ngx_zjy_dbsource(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_log_stderr(0,"we begin to get dbsource");
ngx_dbcommandList* cmdList=conf;
ngx_uint_t i=0;
ngx_str_t* value=cf->args->elts;
for( i=1;i<cf->args->nelts;i++)
{
ngx_str_t* sn=NULL;
sn=ngx_array_push(cmdList->DBSourceList);
sn->data=value[i].data;
sn->len=value[i].len;
ngx_log_stderr(0,"the %d dbsource is:%s",i,sn->data);
}
return NGX_CONF_OK;
}
///
///函数结束
///
///
///函数名称:ngx_zjy_dbaddress
///函数描述:开始解析我们填入的数据库ip地址
///
static char *
ngx_zjy_dbaddress(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_log_stderr(0,"we begin to get dbaddress");
ngx_dbcommandList* cmdList=conf;
ngx_uint_t i=0;
ngx_str_t* value=cf->args->elts;
for(i=1;i<cf->args->nelts;i++)
{
ngx_str_t* sn=NULL;
sn=ngx_array_push(cmdList->DBServerAddList);
sn->data=value[i].data;
sn->len=value[i].len;
ngx_log_stderr(0,"the %d dbaddress is:%s",i,sn->data);
}
return NGX_CONF_OK;
}
///
///函数结束
///
///
///函数名称:ngz_zjy_iisserver
///函数描述:开始解析我们填入的web服务器地址
///
static char *
ngz_zjy_iisserver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_log_stderr(0,"we begin to get iisserver");
ngx_dbcommandList* cmdList=conf;
ngx_uint_t i=0;
ngx_str_t* value=cf->args->elts;
for( i=1;i<cf->args->nelts;i++)
{
ngx_str_t* sn=NULL;
sn=ngx_array_push(cmdList->IISServerList);
sn->data=value[i].data;
sn->len=value[i].len;
ngx_log_stderr(0,"the %d IISServerList is:%s",i,sn->data);
}
return NGX_CONF_OK;
}
///
///函数结束
///
整个过程,其实就两个,一个是在create srv过程中分配内存,一个是在解析的时候的使用,好了,一天就这样过去了,不过还有收获阿,哈哈,测试通过