一、需求

我们使用Nginx做七层负载均衡,后端是Tomcat。项目采用灰度发布方式,每次项目升级,都要手动先从Nginx下摘掉一组,然后再升级这组,当项目快速迭代时,手动做这些操作显然会增加部署时间,于是就想通过脚本实现自动化管理Nginx配置文件。

当时考虑自己写Shell脚本对Nginx配置文件操作,需要用到sed流编辑器,sed本身没有条件判断语句,并不能灵活判断配置文件中要添加/删除位置,因此会增加配置错误风险。

在查资料无意间发现confd能自动管理配置文件,通过模板渲染生成配置文件,避免了配置错误风险,觉得挺好,就实验了下,于是就有了本章博文。

二、架构图

三、涉及软件

etcd:分布式KV存储系统,一般用于共享配置和服务注册与发现。是CoreOS公司发起的一个开源项目。 ETCD存储格式类似于文件系统,以根"/"开始下面一级级目录,最后一个是Key,一个key对应一个Value。

etcd集群:使用Raft协议保证每个节点数据一致,由多个节点对外提供服务。这里只用单台。

confd:管理本地应用配置文件,使用etcd或consul存储的数据渲染模板,还支持redis、zookeeper等。

confd有一个watch功能,通过HTTP API定期监测对应的etcd中目录变化,获取最新的Value,然后渲染模板,更新配置文件。

四、部署

环境说明:CentOS7,IP 192.168.1.99 # 为了试验服务都安装这台上。

4.1 下载软件包

https://github.com/coreos/etcd/releases/download/v3.1.4/etcd-v3.1.4-linux-amd64.tar.gz

https://github.com/kelseyhightower/confd/releases/download/v0.11.0/confd-0.11.0-linux-amd64

如果没翻墙可能下载不了,这个是我下载好的:http://pan.baidu.com/s/1c1M9kBm

4.2 安装Nginx并启动

# yum install -y gcc gcc-c++ make openssl-devel pcre-devel
# useradd nginx -s/sbin/nologin
# wget http://nginx.org/download/nginx-1.10.3.tar.gz
# tar zxvf nginx-1.10.3.tar.gz
# cd nginx-1.10.3
# ./configure--prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module--with-http_gzip_static_module --with-http_realip_module--with-http_stub_status_module
# make && make install
独立出来虚拟主机:
# mkdir /usr/local/nginx/conf/vhost
# vi /usr/local/nginx/conf/nginx.conf # 在http{}段中末尾添加包含虚拟主机配置文件
http {
includevhost/*.conf;
}
# /usr/local/nginx/sbin/nginx # 启动Nginx
 

4.3 安装etcd并启动

# tar zxvf etcd-v3.1.4-linux-amd64.tar.gz
# mv etcd etcdctl /usr/bin/ # etcd提供封装好的包,直接使用即可
# nohup etcd--data-dir /var/lib/data.etcd --listen-client-urls http://192.168.1.99:2379--advertise-client-urls http://192.168.1.99:2379 &>/var/log/etcd.log &
 

4.4 安装confd

confd也是一个封装好的包,直接使用即可。

# mv confd-0.11.0-linux-amd64 /usr/bin/confd
 

key规划:

key

value

/nginx/www/server_name

域名

/nginx/www/upstream/server01

节点01

/nginx/www/upstream/server02

节点02

/nginx/www/upstream/server03

节点03

创建配置目录

# mkdir -p /etc/confd/{conf.d,templates}
conf.d # 资源模板,下面文件必须以toml后缀
templates # 配置文件模板,下面文件必须以tmpl后缀
 

创建资源模板

# vi /etc/confd/conf.d/app01.conf.toml
[template]
src = "app01.conf.tmpl" # 默认在/etc/confd/templates目录下
dest = "/usr/local/nginx/conf/vhost/app01.conf" # 要更新的配置文件
keys = [
"/nginx", # 监测的key
]
reload_cmd ="/usr/local/nginx/sbin/nginx -s reload" # 最后执行的命令
 

创建Nginx配置文件模板

# vi /etc/confd/templates/app01.conf.tmpl
upstream www.{{getv "/nginx/www/server_name"}} {
{{range getvs "/nginx/www/upstream/*"}}
server ``.``;
`end`
} server {
server_name www.{{getv "/nginx/www/server_name"}};
location / {
proxy_pass http://www.{{getv "/nginx/www/server_name"}};
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
 

博客地址:http://lizhenliang.blog.51cto.com

QQ群:323779636(Shell/Python运维开发群)

五、测试

使用etcdctl客户端操作etcd,常用的几个选项如下:

USAGE:
etcdctl [global options] command [command options] [arguments...]
COMMANDS:
ls retrieve a directory
get retrieve the value of a key
set set the value of a key
rm remove a key or a directory
GLOBAL OPTIONS:
--peers, -C a comma-delimited list of machine addresses in the cluster (default: "http://127.0.0.1:2379,http://127.0.0.1:2379")
 

5.1 向etcd添加k/v

# etcdctl -C http://192.168.1.99:2379 set domain.com
domain.com
# etcdctl -C http://192.168.1.99:2379 set /nginx/www/upstream/server01 "192.168.1.10:80"
192.168.1.10:80
# etcdctl -C http://192.168.1.99:2379 set /nginx/www/upstream/server02 "192.168.1.11:80"
192.168.1.11:80
 

5.2 启动confd监测etcd中的keys

当你启动后,confd就会从etcd获取key的值并填充到Nginx配置文件模板,并更新到/usr/local/nginx/conf/vhost/app01.conf,并nginx reload。

5.3 近一步测试

向etcd中/nginx/www/upstream/再添加一个节点:

OK!这样就实现了自动管理Nginx配置文件,无感知加入后端节点。

六、etcd Rest API使用

curl -X PUT http://192.168.1.99:2379/v2/keys/test/a_key -d value="789"  # 增改key
curl -X DELETE http://192.168.1.99:2379/v2/keys/test/a_key # 删除key
curl http://192.168.1.99:2379/v2/keys/test/a_key # 查询key的值
curl -X PUT http://192.168.1.99:2379/v2/keys/dir -d dir=true # 创建目录
curl http://192.168.1.99:2379/v2/keys # 查看所有keys
curl -X PUT http://192.168.1.99:2379/v2/keys/ttlvar -d value="ttl_value" -d ttl=10 # 创建过期时间的key,单位秒
curl http://192.168.1.99:2379/version # 查看etcd版本
curl http://192.168.1.99:2379/v2/members # 列出所有集群成员
curl http://192.168.1.99:2379/v2/stats/leader # 查看leader
curl http://192.168.1.99:2379/v2/stats/self # 节点自身信息
curl http://192.168.1.99:2379/v2/stats/store # 查看集群运行状态
 

七、总结

总体来说,etcd+confd要比自己写脚本管理Nginx配置文件更方便!当然,增加一套组件也会增加一点运维成本。

当初始化一台Web节点,可以增加一步操作去把自己信息注册到etcd,从而实现自动加入节点。

如果应用在生产环境,有些功能需要更加完善些,比如向etcd添加数据用Rest API或者用Python封装接口,confd写一个后台进程脚本运行等。

如果线上已经有redis或者zookeeper的话,那么就可以直接作为k/v存储信息,而不需要再搭建一套etcd集群!

由于keys的每次更新confd都会Nginx reload,在高并发访问量会有一点影响,比较好的解决方案就是写lua去动态加载Nginx参数。但应付中小规模还是可以的!

由此看来,confd不但局限管理Nginx配置文件,对于其他应用软件也是可以的,比如Haproxy,LVS等。

confd使用文档:

https://github.com/kelseyhightower/confd/blob/master/docs/quick-start-guide.md

资源模板其他参数:

https://github.com/kelseyhightower/confd/blob/master/docs/template-resources.md

Etcd+Confd实现Nginx配置文件自动管理的更多相关文章

  1. 【转载】Etcd+Confd实现Nginx配置文件自动管理

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lizhenliang.blog.51cto.com/7876557/191015 ...

  2. Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现

    前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇到一个问题,jenkins构建出来的镜像部署后,需要通过ip:port去访问,有什么更好的 ...

  3. 使用etcd+confd管理nginx配置

    1.前言 最近在项目中用nginx做反向代理,需要动态生成nginx的配置.大概流程是用户在页面上新增域名.http或https协议以及端口信息,后台会根据域名自动生成一个nginx的server配置 ...

  4. 利用etcd及confd实现配置自动管理

    ETCD etcd 架设etcd集群 静态启动etcd集群需要每个成员在集群中知道另一个成员.在许多情况下,集群成员的IP可能提前未知.在这种情况下,可以使用etcd集群的自动发现服务.一旦etcd集 ...

  5. Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件

    一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...

  6. Ansible 使用 Playbook 管理 Nginx 配置文件

    前面我们已经安装完 Nginx,但是在日常维护中经常需要修改配置文件,并重新加载配置文件,因此来写一个管理 Nginx 配置文件的 Playbook: [root@localhost ~]$ mkdi ...

  7. 15、基于consul+consul-template+registrator+nginx实现自动服务发现

    一.架构图 二.组件介绍 1.Registrator Registrator:一个由Go语言编写的,针对docker使用的,通过检查本机容器进程在线或者停止运行状态,去注册服务的工具.所以我们要做的实 ...

  8. 【转】【linux系统】nacos + confd配置nginx

    为什么要支持confd,老的应用配置管理模式是启动时读取配置文件,然后重新读取配置文件需要应用重启.一般的配置管理系统都是代码侵入性的,应用接入配置管理系统都需要使用对应的SDK来查询和监听数据的变更 ...

  9. supervisor开机自动启动脚本+redis+MySQL+tomcat+nginx进程自动重启配置

    [root@mongodb-host supervisord]# cat mongo.conf [program:mongo]command=/usr/local/mongodb/bin/mongod ...

随机推荐

  1. 让人非常easy误解的TCP拥塞控制算法

    正文 非常多人会觉得一个好的TCP拥塞控制算法会让连接加速,这样的观点是错误的.恰恰相反,全部的拥塞控制算法都是为了TCP能够在贪婪的时候悬崖勒马,大多数时候.拥塞控制是减少了数据发送的速度. 我在本 ...

  2. BigDecimal四舍五入保留两位小数

    import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public c ...

  3. vue 更新了vue-cli到最新版本后引发的问题: require和import、vue-loader的问题

    "vue-loader": "^12.1.0", "vue-loader": "^12.1.0", "vue- ...

  4. Centos下Yum安装PHP 5.5、5.6、7.0

    Centos系统自带的php版本很低,如果我们需要使用高版本的php,可以不用编译安装,直接用yum安装会非常省时省力. 1.检查当前安装的PHP包yum list installed | grep ...

  5. 掌握Docker命令-Docker for Web Developers(4)

    1.管理镜像命令 获取镜像 docker push ubuntu:14:04 查看镜像列表 docker images 重命名image docker tag IMAGE-NAME NEW-IMAGE ...

  6. Basic SAP Data Types

    Basic SAP Data Types 6 out of 11 rated this helpful - Rate this topic The parameter types that the M ...

  7. [INS-20802] Oracle Net Configuration Assistant failed

    [INS-20802] Oracle Net Configuration Assistant failed.在安装Oracle 11g R2时出现了该错误提示.以前安装的时候没有碰到过类似的错误.原来 ...

  8. @Transactional(rollbackFor = Exception.class)

    @Transactional(rollbackFor = Exception.class)这个注解只有在出异常时才会回滚,需要回滚时没有异常也要人为制造异常(自定义异常)所以,如果使用了异常捕获,很有 ...

  9. Go指南练习_Reader

    https://tour.go-zh.org/methods/22 一.题目描述 实现一个 Reader 类型,它产生一个 ASCII 字符 'A' 的无限流. 二.题目分析 io 包指定了 io.R ...

  10. (原)使用TortoiseGit提交代码push的时候报错:HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large

    今天我想rk的sdk包里面的一些东西提交到我的git服务器上,结果,总是报错,折腾了一下午,结果才解决. 首先看看我提交代码的时候,报错的信息: git.exe push --progress &qu ...