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

标签