《音视频应用开发系列文章目录》
nginx的配置内容都在nginx.conf中,nginx已经预定义了许多的配置选项,比如worker_processes,error_log,user等等···,那么如何在nginx添加自定义的配置呢!
比如现在要在nginx.conf下添加rabbitmq的配置内容:
配置名称 | MQ-IP | MQ-PORT | MQ-USER | MQ-PASSWORD | MQ-VH | MQ-EXCHANGE | MQ-ROUTING_KEY |
rabbitmq_config | 192.168.66.88 | 5672 | kaychan | root | / | xxx_exchange | xxx_key |
在nginx.conf中添加配置
worker_processes 1;
error_log logs/error.log debug;
rabbitmq_config 192.168.66.88 5672 kaychan root / xxx_exchange xxx_key;
events {
worker_connections 1024;
}
···
···
···
那么如何在源码中加载解析并使用呢!
打开nginx.c,找到数组变量static ngx_command_t ngx_core_commands[],在数组最后添加一个ngx_command_t的新命令配置rabbitmq_config
static ngx_command_t ngx_core_commands[] = {
{ ngx_string("daemon"),
NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
0,
offsetof(ngx_core_conf_t, daemon),
NULL },
{ ngx_string("master_process"),
NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
0,
offsetof(ngx_core_conf_t, master),
NULL },
···
···
···
{ ngx_string("load_module"),
NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
ngx_load_module,
0,
0,
NULL },
// 在最后添加我们自定义的core command
{ ngx_string("rabbitmq_config"), // command name,这个名字和nginx.conf的配置名称保持一致
NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE7, // 这边说一下最后一个参数NGX_CONF_TAKE7,表示rabbitmq_config后面
// 跟着7个配置变量(如果只有5个就是NGX_CONF_TAKE5,3个就是NGX_CONF_TAKE3)
// 看宏定义好像最多是NGX_CONF_TAKE7,如果超过这么多配置变量则再增加一个
// 配置command即可,这里刚好是7个所以选择NGX_CONF_TAKE7
ngx_load_rabbitmq_config, // 配置项读取设置回调函数,加载模块的时候会调用这个回调,我们可以在该函数中解析配置变量并保存
0, // 模仿上面即可
0, // 模仿上面即可
NULL }, // 大部分为NULL
ngx_null_command
};
定义MQ配置结构体并创建MQ配置全局变量用于存储配置变量
typedef struct rabbitmq_config_s{
char *server_ip;
unsigned short server_port;
char *user;
char *password;
char *vh;
char *exchange;
char *routing_key;
}rabbitmq_config_t;
rabbitmq_config_t g_mq_conf;
创建command设置回调函数static char *ngx_load_rabbitmq_config(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);,在回调函数ngx_load_rabbitmq_config中解析配置变量并保存待使用
static char *
ngx_load_rabbitmq_config(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
// 配置变量以ngx_str_t链表的形式存储于cf->args->elts
ngx_str_t *value;
value = cf->args->elts; // 获取链表头
// 判断配置参数的有效性,为什么是8呢,因为配置名称也存在链表中加上7个实际的配置变量所以是8
for(int i = 1; i < 8; i++){
if(!value[i].data) {
return "rabbitmq-config invalid value";
}
}
// 配置有效则存储配置
g_mq_conf.server_ip = (char *)value[1].data;
g_mq_conf.server_port = ngx_atoi(value[2].data, value[2].len);
g_mq_conf.user = (char *)value[3].data;
g_mq_conf.password = (char *)value[4].data;
g_mq_conf.vh = (char *)value[5].data;
g_mq_conf.exchange = (char *)value[6].data;
g_mq_conf.routing_key = (char *)value[7].data;
return NGX_CONF_OK;
}
在需要的地方使用g_mq_conf即可获取,比如在main中读取配置内容
char mqcfg[512] = {0};
sprintf(mqcfg,
"---\nserver_ip: %s\nserver_port: %d\nuser: %s\npassword: %s\nvh: %s\nexchange: %s\nrouting_key: %s\n---",
g_mq_conf.server_ip, g_mq_conf.server_port, g_mq_conf.user, g_mq_conf.password,
g_mq_conf.vh, g_mq_conf.exchange, g_mq_conf.routing_key);
rabbitmq_write_log(mqcfg, "a");
在日志中输出内容为以下说明加载读取配置成功
---
server_ip: 192.168.66.88
server_port: 5672
user: kaychan
password: root
vh: /
exchange: xxx_exchange
routing_key: xxx_key
---