nginx源码开发-在nginx.conf中添加自定义配置

《音视频应用开发系列文章目录》

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
---

 

你可能感兴趣的:(音视频应用开发)