为什么要支持 confd,老的应用配置管理模式是启动时读取配置文件,然后重新读取配置文件需要应用重启。一般的配置管理系统都是代码侵入性的,应用接入配置管理系统都需要使用对应的 SDK 来查询和监听数据的变更。对于一些已经成熟的系统来说,接入 SDK 来实现动态配置管理是很难实现的, Nacos 通过引入配置管理工具 confd 可以实现系统的配置变更做到无代码侵入性。
confd 是一个轻量级的配置管理工具,可以通过查询后端存储系统来实现第三方系统的动态配置管理,如 Nginx、Tomcat、hHaproxy、Docker 配置等。 confd 目前支持的后端有 etcd、Zookeeper 等,Nacos 1.1 版本通过对 confd 定制支持 Nacos 作为后端存储。
confd 能够查询和监听后端系统的数据变更,结合配置模版引擎动态更新本地配置文件,保持和后端系统的数据一致,并且能够执行命令或者脚本实现系统的 reload 或者重启。
confd 的安装可以通过源码安装方式,confd 基于 Go 语言编写,其编译安装依赖 Go,首先需要确保本地安装了 Go,版本不低于v1.10
创建 confd 目录,下载 confd 源码,编译生成可执行文件
mkdir -p $GOPATH/src/github.com/kelseyhightower
wget https://github.com/nacos-group/confd/archive/v0.18.0.tar.gz
tar -xvf v0.18.0.tar.gz
mv confd-0.18.0 confd
cd confd
make
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VKElIoh1-1571199842282)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NAZLtNmn-1571199842282)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
复制 confd 文件到 bin 目录下,启动 confd
sudo cp bin/confd /usr/local/bin
confd
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GE3YGuUs-1571199842282)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QvwccWve-1571199842283)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
本文介绍使用 Nacos 结合 confd 实现 Nginx 配置管理,为简单起见以 Nginx 的黑名单功能为演示示例,Nacos 使用官网部署的服务,域名为 console.nacos.io 。Nginx 的安装可以参考网上文章
1.创建 confd 所需目录
confd 配置文件默认在 /etc/confd 中,可以通过参数 -confdir 指定。目录中包含两个子目录,分别是:conf.d templates
mkdir -p /etc/confd/{conf.d,templates}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l5sXtXUn-1571199842284)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bdsCIo4w-1571199842284)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
2.创建 confd 配置文件
confd 会先读取 conf.d 目录中的配置文件(toml格式),然后根据文件指定的模板路径去渲染模板。
vim /etc/confd/conf.d/nginx.toml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-trPYfkWY-1571199842285)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4LjHmh9X-1571199842285)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
内容为如下,其中 nginx.conf.tmpl 文件为 confd 的模版文件,keys 为模版渲染成配置文件所需的配置内容,/usr/local/nginx/conf/nginx.conf 为生成的配置文件
[template]
src = " nginx.conf.tmpl"
dest = "/usr/local/nginx/conf/nginx.conf"
keys = [
"/nginx/conf",
]
check_cmd = "/usr/local/nginx/sbin/nginx -t -c {{.src}}"
reload_cmd = "/usr/local/nginx/sbin/nginx -s reload"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1zzgreYl-1571199842286)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dbbnBV9a-1571199842286)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
3.创建模版文件
拷贝 Nginx 原始的配置,增加对应的渲染内容
cp /usr/local/nginx/conf/nginx.conf /etc/confd/templates/nginx.conf.tmpl
vim /etc/confd/templates/nginx.conf.tmpl
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nBbpF0Ez-1571199842286)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DgVkwXRW-1571199842286)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
增加内容为:
···
{{$data := json (getv "/nginx/conf")}}
{{range $data.blackList}}
deny {{.}};
{{end}}
···
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lC6DGnQs-1571199842287)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RRWXY6WR-1571199842287)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
4.在 Nacos 上创建所需的配置文件
在 public 命名空间创建 dataId 为 nginx.conf 的配置文件,group 使用默认的 DEFAULT_GROUP 即可,配置内容为 json 格式
{
"blackList":["10.0.1.104","10.0.1.103"]
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IfRHfWVF-1571199842288)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OpfSFYDR-1571199842288)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
5. 启动confd
启动 confd,从 Nacos 获取配置文件,渲染 Nginx 配置文件。backend 设置成 Nacos,node 指定访问的 Nacos 服务地址,watch 让 confd 支持动态监听
confd -backend nacos -node http://console.nacos.io:80 -watch
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IB3Z3Lw9-1571199842289)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ApMyTiv-1571199842290)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
6.查看 Nginx 配置文件,验证 Nginx 启动
查看生成的 /usr/local/nginx/conf/nginx.conf 配置文件是否存在如下内容
...
deny 10.0.1.104;
deny 10.0.1.103;
...
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NgxJRM8O-1571199842290)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3GEC1a6r-1571199842290)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
curl 命令访问 Nginx,验证是否返回正常。http 响应状态码为 200 说明访问 Nginx 正常
curl http://$IP:8080/ -i
HTTP/1.1 200 OK
...
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F7VVJYNR-1571199842290)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cxz2JjOv-1571199842291)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
7.查看本机 Ip,加到 Nacos 配置文件黑名单中
假设本机的 Ip 为30.5.125.107,将本机的 Ip 加入到 Nginx 黑名单
{
"blackList":["10.0.1.104","10.0.1.103","30.5.125.107"]
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qCDIXDcK-1571199842291)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AkCgoHNz-1571199842291)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
8.查看 Nginx 配置文件,验证黑名单是否生效
查看生成的/usr/local/nginx/conf/nginx.conf配置文件是否存在如下内容
...
deny 10.0.1.104;
deny 10.0.1.103;
deny 30.5.125.107;
...
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-el7ZHOx7-1571199842292)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Xe7gf24-1571199842293)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
curl 命令访问 Nginx,访问应该被拒绝,返回 403
curl http://$IP:8080/ -i
HTTP/1.1 403 Forbidden
...
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I9p5KHsB-1571199842293)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HlUAo7Mp-1571199842293)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “点击并拖拽以移动”)]
本文介绍了使用 Nacos 结合 confd 来做自动化管理,confd 作为轻量级的配置管理工具可以做到对第三方系统无代码侵入性。本文只是简单使用 Nginx 的黑名单功能来演示 Nacos+confd 的使用方式,当然 Nginx 还具有限流、反向代理等功能以及其他的系统比如Haproxy、Tomcat、Docker 等也同样可以使用 Nacos+confd 做管理,大家可以到 Nacos官网贡献相应的 Demo 或者方案。
原文链接
本文为云栖社区原创内容,未经允许不得转载。