nginx动态修改配置文件基于confd
大纲
- 使用场景
- confd简介
- confd安装
- 使用场景
- 基于file
- 基于etcd
- 基于consul
使用场景
在系统发布的时候可能需要动态的修改nginx配置,让后端的负载均衡动态改变
confd原理
confd 可以利用自己的配置文件模板生成对应真实程序需要的配置文件,监听数据是否变化,然后触发reload
confd简介
confd 是一个可以动态修改配置文件的工具,不仅限于nginx 任何使用配置文件的程序都可以使用
例如:nginx 修改配置后 reload 如果有多台机器手动修改比较麻烦不利于管理可以使用confd 接收一个统一的管理服务在修改模板触发nginx reload
官方地址:https://github.com/kelseyhightower/confd
使用说明地址(国内镜像): https://gitee.com/mirrors/confd/blob/master/docs/quick-start-guide.md
confd安装
Setp1 下载confd
wget https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64
github外网的原因速度很慢,对应的confd-0.16.0-linux-amd64 已经上传到百度云盘(目前最新版是0.16.0): 常用软件/confd文件夹
Setp2 修改权限和PATH
#重命名二进制文件,并移动到PATH的目录下 (也可以不放在path 但是加入到path路径中 修改/etc/profile)
mv confd-0.16.0-linux-amd64 /usr/local/bin/confd
#修改权限
chmod +x /usr/local/bin/confd
Setp3 验证是否安装成功
confd --help
使用场景
confd 支持多种后端数据源
- etcd
- consul
- vault
- environment variables
- file (.yaml)
- redis
- zookeeper
- dynamodb
- rancher
- ssm (AWS Simple Systems Manager Parameter Store)
基于file
基于数据文件(.yml)的变化实现动态修改配置nginx文件
基于file的方式需要准备三个文件
- 1 confd配置文件 .toml:主要是配置各种使用到的key,以及程序的配置文件模板的地址
- 2 程序的配置文件模板 .tmpl: 主要是利用一些变量来实现动态配置
- 3 变量文件 .yml: 主要是key=value对应的文件**
以上文件中 .toml .tmpl是基于任何后端数据都必须要的配置文件 (例如 redis etcd 等 都需要配置.toml .tmpl文件)
**注意:confd默认搜索模板和配置文件的文件夹路径是/etc/confd/conf.d/xxx.toml /etc/confd/templates/xxx.tmpl 主要是要自己创建conf.d文件夹和templates文件夹 , 可以使用命令参数 -confdir 切换HOME路径 **
**例如 -confdir /data/confd 那么搜索路径变为 /data/confd/conf.d/xxx.toml /data/confd/templates/xxx.tmpl **
注意xxx.toml 配置文件上需要写入[template]
Setp1 创建资源文件夹
创建一个文件夹 例如/medcrab/tmp/fileconf 来保存两种配置文件
/medcrab/tmp/fileconf 文件夹下面在创建conf.d templates两个文件夹
Setp2 创建.toml confd配置文件
注意:
- 1 需要在/medcrab/tmp/fileconf/conf.d 文件夹下创建
- 2 .toml文件首部需要加上[template]
主要配置说明如下:
[template] 必要在文件首加上
dest 根据模板生产的文件地址
keys 模板中使用的key 注意key对应的value配置在.yml文件 redis etcd中
src 模板文件名 【 直接将.tmpl文件放入templates】中即可 不需要完整路径
# 以上三个必须
reload_cmd 重新加载文件命令 例如 nginx -s reload -c /xxx/nginx.conf
check_cmd 重新加载前执行的命令 nginx -t -c /xxx/nginx.conf
注意key对应的value配置在.yml文件 redis etcd中
Setp2 创建.tmpl 模板文件
模板文件基本上就是复制程序的配置文件:例如复制nginx的配置文件,然后将需要动态修改的地方使用变量
主要是用到了golang/text-template模板语言
Setp3 运行confd
confd运行有三种方式
- confd -interval 60 按时间间隔来定时更新模板 (适合于一些中间件结合,中间件数据改了 自动触发)
- confd -onetime 只执行一次 (适合自动化部署脚本启动触发)
- confd -watch 监控数据文件是否变化(实际测试异常)
主要参数:
- -interval 时间间隔
- -backend 指定数据源, 数据源的种类有file etcd redis 这里用file
- -file 指定数据源文件地址
- -confdir 指定配置文件的路径
confd -interval 10 /data/confd -backend file -file ./myapp.yaml
confd -onetime -confdir /data/confd -backend file -file ./myapp.yaml
confd -watch -confdir /data/confd -backend file -file ./myapp.yaml