上一篇文章我们介绍了 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 了。