需求
使用Nginx做七層負(fù)載均衡办悟,后端是Tomcat躬厌。每次項目升級铛碑,都要停機(jī)發(fā)布或者手動先從Nginx下摘掉一組狠裹,然后再升級這組,這些操作顯然會增加部署時間汽烦,于是就想實現(xiàn)動態(tài)管理Nginx配置文件涛菠。
架構(gòu)圖
軟件
- etcd:分布式KV存儲系統(tǒng),一般用于共享配置和服務(wù)注冊與發(fā)現(xiàn)。是CoreOS公司發(fā)起的一個開源項目碗暗。 ETCD存儲格式類似于文件系統(tǒng)颈将,以根"/"開始下面一級級目錄,最后一個是Key言疗,一個key對應(yīng)一個Value晴圾。
- confd:管理本地應(yīng)用配置文件,使用etcd或consul存儲的數(shù)據(jù)渲染模板噪奄,還支持redis死姚、zookeeper等。confd有一個watch功能勤篮,通過HTTP API定期監(jiān)測對應(yīng)的etcd中目錄變化都毒,獲取最新的Value,然后渲染模板碰缔,更新配置文件账劲。
配置etcd
# 安裝etcd
yum install etcd
# 啟動
systemctl start etcd
# 設(shè)置key
etcdctl set /nginx/www/server_name backend
etcdctl set /nginx/www/upstream/server01 192.168.0.1
etcdctl set /nginx/www/upstream/server02 192.168.0.2
配置confd
# 下載confd并移到bin目錄下
mv confd-0.11.0-linux-amd64 /usr/bin/confd
# 創(chuàng)建配置目錄
# mkdir -p /etc/confd/{conf.d,templates}
conf.d # 配置文件,里面的文件必須以toml后綴
templates # 模板金抡,里面的文件必須以tmpl后綴
# 創(chuàng)建配置文件模板
# vi /etc/confd/templates/app01.conf.tmpl
upstream {{getv "/nginx/www/server_name"}} {
{{range getvs "/nginx/www/upstream/*"}}
server {{.}};
{{end}}
}
server {
server_name localhost;
location / {
proxy_pass http://{{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;
}
}
# 創(chuàng)建confd配置文件
# vi /etc/confd/conf.d/app01.conf.toml
[template]
src = "app01.conf.tmpl" # 默認(rèn)在/etc/confd/templates目錄下
dest = "/usr/local/nginx/conf/vhost/app01.conf" # 渲染后的模板文件位置(要更新的配置文件)
keys = [
"/nginx", # 監(jiān)測的key
]
reload_cmd ="/usr/local/nginx/sbin/nginx -s reload" # key更新后執(zhí)行的命令
測試
etcdctl set /nginx/www/upstream/server03 192.168.0.3 # 添加后端服務(wù)器
etcdctl rm /nginx/www/upstream/server01 192.168.0.1 #刪除
restapi操作etcd
curl -X PUT http://127.0.0.1:2379/v2/keys/nginx/www/upstream/server01 -d value="789" # 增改key
curl -X DELETE http://127.0.0.1:2379/v2/keys/nginx/www/upstream/server01 # 刪除key
curl http://127.0.0.1:2379/v2/keys/nginx/www/upstream/server01 # 查詢key的值
一臺主機(jī)tomcat
[root@web12 ~]# etcdctl get /app01/vacc/11
["server 192.168.140.11:7080","server 192.168.140.11:7081"]
# {{- }} 不換行輸出
{{- range getvs "/nginx/app01/*" }}
{{- range jsonArray . }}
{{if eq . "server 192.168.140.11:7080" }}#{{.}} weight=5 max_fails=3 fail_timeout=30s;{{else}}{{.}} weight=5 max_fails=3 fail_timeout=30s;{{end}}
{{- end}}
{{- end}}