环境:
CentOS 6/7 x64
Python: 2.7.6
Etcd: 3.2.18
Confd: 0.16.0
Nginx: 1.12.1
etcd:分布式KV存储系统,一般用于共享配置和服务注册与发现。是CoreOS公司发起的一个开源项目。 ETCD存储格式类似于文件系统,以根"/"开始下面一级级目录,最后一个是Key,一个key对应一个Value。
etcd集群:使用Raft协议保证每个节点数据一致,由多个节点对外提供服务。这里只用单台。
confd:管理本地应用配置文件,使用etcd或consul存储的数据渲染模板,还支持redis、zookeeper等。
confd有一个watch功能,通过HTTP API定期监测对应的etcd中目录变化,获取最新的Value,然后渲染模板
Nginx: Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件代理服务器,并在一个BSD-like协议下发行。由俄罗斯的程序设计师lgor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
环境说明: 建议使用 Cento7.X X64
1)安装etcd(这里安装的单机,集群环境根据自己的需求选取)
# yum install etcd -y
# sed -i 's/localhost/0.0.0.0/g' /etc/etcd/etcd.conf #配置监听地址
# systemctl start etcd && systemctl enable etcd #启动服务设置开机动
2)安装nginx
#cd /usr/local/src
#wget http://nginx.org/download/nginx-1.12.1.tar.gz
#git clone https://github.com/yaoweibin/nginx_upstream_check_module.git
#tar -zxvf nginx-1.12.1.tar.gz
#cd nginx-1.12.1
#patch -p1 </usr/local/src/nginx_upstream_check_module/check_1.12.1+.patch
#./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/nginx_upstream_check_module/
make && make install
#mkdir /usr/local/nginx/conf/vhost/
Nginx主配置文件修改为这个样子,增加include目录配置
#vi /usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
include vhost/*.conf;
}
3)安装confd
下载地址https://github.com/kelseyhightower/confd/releases
下载完毕丢到系统里面
# cp confd /usr/bin/confd
# which confd
/usr/bin/confd
4)创建配置文件目录
# mkdir -p /etc/confd/{conf.d,templates}
conf.d # 资源模板,下面文件必须以toml后缀
templates # 配置文件模板,下面文件必须以tmpl后缀
5)创建confd配置文件
# 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 = [
"/Shopping", #监测的key
]
reload_cmd ="/usr/local/nginx/sbin/nginx -s reload" #最后执行的命令
6)创建confd模板
# vi /etc/confd/templates/app01.conf.tmpl
upstream {{getv "/Shopping/nginx/cluster1/proxy_name"}} {
{{range getvs "/Shopping/nginx/cluster1/upstream/*"}}
server {{.}};
{{end}}
check interval=5000 rise=1 fall=5 timeout=4000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
server_name {{range getvs "/Shopping/nginx/cluster1/server_name/*"}} {{.}} {{end}};
location / {
proxy_pass http://{{getv "/Shopping/nginx/cluster1/proxy_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;
}
location /status {
check_status;
access_log off;
}
}
7)启动confd并设置开机启动
开机启动脚本会随文档附带
拷贝至/etc/init.d/confd ,只需要更改etcd 的连接地址即可
#/etc/init.d/confd start && chkconfig --add confd && chkconfig confd on