凯的BLOG

confd+etcd实现nginx配置管理

·

confd是一个轻量级的配置管理工具,可以通过查询后端存储系统来实现第三方系统的动态配置管理,如NginxTomcatHAproxyDocker配置等。

confd能够查询和监听后端系统的数据变更,结合配置模版引擎动态更新本地配置文件,保持和后端系统的数据一致,并且能够执行命令或者脚本实现系统的reload或者重启。

1、创建confd所需目录 #

confd配置文件默认在/etc/confd中,可以通过参数-confdir指定。目录中包含两个子目录,分别是:conf.dtemplates

mkdir -p /etc/confd/{conf.d,templates}
2、创建confd配置文件 #

confd会先读取conf.d目录中的配置文件(toml格式),然后根据文件指定的模板路径去渲染模板。

vim /etc/confd/conf.d/nginx.toml

内容为如下,其中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"
3、创建模板文件 #

拷贝Nginx原始的配置,增加对应的渲染内容

cp /usr/local/nginx/conf/nginx.conf /etc/confd/templates/nginx.conf.tmpl
vim /etc/confd/templates/nginx.conf.tmpl

增加内容为:

...
{{- $data := json(getv "/nginx/conf")}}
{{- range $data.blackList}}
deny {{.}};
{{- end}}
...
4、在etcd上创建所需的配置 #

使用etcdctl添加配置如下:

etcdctl set /nginx/conf {"blackList":["10.0.1.104","10.0.1.103"]}
5、启动confd #

启动confd,从etcd获取配置,渲染Nginx配置文件。backend设置成etcdnode指定访问的etcd服务地址,watch让confd支持动态监听

confd -backend etcd -node http://127.0.0.1:2379 -watch
6、查看Nginx配置文件,验证Nginx启动 #

查看生成的/usr/local/nginx/conf/nginx.conf配置文件是否存在如下内容

...
deny 10.0.1.104;
deny 10.0.1.103;
...

curl命令访问Nginx,验证是否返回正常。http响应状态码为200说明访问Nginx正常

curl http://$IP:8000/ -i
HTTP/1.1 200 ok
...
7、查看本机IP,加到etcd配置文件黑名单中 #

假设本机IP为10.1.70.20,将本机的IP加入到Nginx黑名单

etcdctl set /nginx/conf {"blackList":["10.0.1.104","10.0.1.103","10.1.70.20"]}
8、查看Nginx配置文件,验证黑名单是否生效 #

查看生成的/usr/local/nginx/conf/nginx.conf配置文件是否存在如下内容

...
deny 10.0.1.104;
deny 10.0.1.103;
deny 10.1.70.20;
...

curl命令访问Nginx,访问应该被拒绝,返回403

curl http://$IP:8080/ -i
HTTP/1.1 403 Forbidden
...