上一篇文章我们介绍了 ETCD 的容器化,搞这件事情的主要目的其实是要动态更新 Nginx 的配置
这一章我们就来配置 confd 和 Nginx,来达到动态更新 Nginx 配置的目的
一、安装配置confd
下载并安装:
wget https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64
mv confd-0.16.0-linux-amd64 /usr/sbin/confd
chmod +x /usr/sbin/confd
生成配置文件:
我们在 etcd 中存放的格式如下
etcdctl set /nginx/app01/subdomain app1
etcdctl set /nginx/app01/upstream/app01_1 "192.168.0.1:5601"
/nginx/app01/subdomain "app01"
/nginx/app01/upstream/app01_1 "192.168.0.1:5601"
/nginx/app01/upstream/app01_2 "192.168.0.2:5601"
那么,我们先生成 confd 的配置文件:
mkdir -p /etc/confd/{conf.d,templates}
cat <<EOF>>/etc/confd/conf.d/nginx.toml
[template]
src = "nginx.conf.tmpl"
dest = "/etc/nginx/conf.d/nginx-auto.conf"
keys = [
"/nginx/app01/subdomain",
"/nginx/app01/upstream",
]
check_cmd = "/usr/sbin/nginx -t"
reload_cmd = "/usr/sbin/nginx -s reload"
EOF
cat <<EOT>>/etc/confd/templates/nginx.conf.tmpl
upstream {{getv "/nginx/app01/subdomain"}} {
{{range getvs "/nginx/app01/upstream/*"}}
server {{.}};
{{end}}
}
server {
server_name {{getv "/nginx/app01/subdomain"}}.example.com;
location / {
proxy_pass http://{{getv "/nginx/app01/subdomain"}};
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;
}
}
EOT
confd 会根据 etcd 的值,结合 nginx.conf.tmpl ,生成 nginx-auto.conf,然后 nginx -t 验证通过后,执行 nginx -s rolad。
注意:nginx的配置中必须有 include /etc/nginx/conf.d/*.conf;
二、运行confd
# 只处理一次
confd -onetime -backend etcd -node http://etcd-svc.default:2379
# 按时间轮询
confd -interval=60 -backend etcd -node http://etcd-svc.default:2379 &
这样就可以动态更新 Nginx 了。