通过nacos+confd实现Nginx配置文件动态更新
为什么要支持confd,老的应用配置管理模式是启动时读取配置文件,然后重新读取配置文件需要应用重启。 一般的配置管理系统都是代码侵入性的,应用接入配置管理系统都需要使用对应的SDK来查询和监听数据的变更。对于一些已经成熟的系统来说,接入SDK来实现动态配置管理是很难实现的,Nacos通过引入配置管理工具confd可以实现系统的配置变更做到无代码侵入性。
confd是一个轻量级的配置管理工具,可以通过查询后端存储系统来实现第三方系统的动态配置管理,如Nginx、Tomcat、Haproxy、Docker配置等。
confd目前支持的后端有etcd、ZooKeeper,nacos,redis等。
confd能够查询和监听后端系统的数据变更,结合配置模版引擎动态更新本地配置文件,保持和后端系统的数据一致,并且能够执行命令或者脚本实现系统的reload或者重启。
nacos和confd的部署方法参考链接:https://blog.ywdevops.cn/index.php/2021/04/30/nacos/
本例子以修改nginx的servername为例子,原理图如下:

1、 创建confd所需目录:
confd配置文件默认在/etc/confd中,可以通过参数-confdir指定。目录中包含两个子目录,分别是:conf.d templates ,本例子就以默认目录为例子,执行命令创建两个子目录,如下:
mkdir -p /etc/confd/{conf.d,templates}
2、 创建confd配置文件 :
confd会先读取conf.d目录中的配置文件(toml格式),然后根据文件指定的模板路径去渲染模板。
vim /etc/confd/conf.d/nginx.toml
添加内容如下:

说明:
- template:表示用来渲染模板的,此处为固定写法不可更改
- src:表示模板文件名称,模板文件在templates目录下,模板名字和src指定名字一样
- keys表示为模版渲染成配置文件所需的配置内容,此键值要和nacos上面写的进行匹配
- check_cmd:表示检查nginx配置文件是否正常
- reload_cmd:表示重新加载nginx配置文件
针对上面的keys写法说明如下:
从上图可以看出,keys的值设置为/nginx/conf,那么nacos界面的Dataid的值要设置为nginx.conf,如图:

如果将键值设置为/etc/nginx/conf,如图:

那么将nacos上面的Dataid的值就要设置为etc.nginx.conf,如图:

3、 创建模版文件:
拷贝nginx的原始配置文件并修改名称为nginx.conf.tmpl,注意此名称为上面的模板配置文件中指定的名称,如图:

编辑模板文件,在server_name位置添加内容如下:

此时编辑nacos中的etc.nginx.conf文件,添加内容如下:

注意:上图中的server_name后面需要设置的内容为文本类型的,因此在nacos中选择TEXT格式,并写入要设置的域名即可
设置完成后,再次查看nginx.conf可以看到配置文件已经更新(需要先启动confd),如图:

附加
上图中只是修改配置文件中的一个位置,那么如果要修改多个位置呢,此时可以通过配置多个keys的方式来执行,首先先在配置文件中,增加一个keys,名称为/etc/nginx/conf1,如图:

然后修改模板文件nginx.conf.tmpl,修改root位置,如图:

然后在nacos中新建配置文件etc.nginx.conf 添加内容如下:

再次查看配置文件可以发现已经更新(需要先启动confd),如图:

4、启动confd:

说明:
- -backend用于指定后端的存储应用为nacos
- -node用于执行nacos的节点地址
- -watch表示confd支持动态监听
启动后,修改nacos的内容后,可以看到配置文件已经动态更新
备注:
上面nacos的内容为手动编辑进去,还可以通过curl的方式通过post请求过去,例如:
curl -X POST “http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=etc.nginx.conf&group=test&content=www.baidu.com”
说明:
- dataId:和手动添加的时候名称一样,注意Id的第一个字母大写
- group:表示设置的组名称,不写默认为DEFAULT_GROUP
- content:表示里面的内容,上面例子为www.baidu.com,格式为文本文档
也可以通过post方式推送json格式内容,只需要修改content后面的内容格式即可,如图:

其他用于可以参考官方文档https://nacos.io/zh-cn/docs/quick-start.html


