nginx-template如何实现动态更新Nginx upstream

发布时间:2021-11-23 21:41:25 作者:柒染
来源:亿速云 阅读:307

这篇文章将为大家详细讲解有关nginx-template如何实现动态更新Nginx upstream,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Consul Template 提供一个方便的方式从Consul服务获取数据通过consul-template的后台程序保存到文件系统,这个后台进程监控Consul中数据的变化并更新任意数量的模板到文件系统。模板更新完成后consul-template也可以触发相关的指令或者脚本,此处通过简单的实践动态更新Nginx的upstream server并且触发reloadnginx服务。当然对于小规模下的应用场景还有很多,比如Haproxy配置文件动态更新等。

这里小小的做个调查,你使用过以下那种方案:

下面,我们就开始今天的实践目的吧,通过consul-template与consul完成nginx配置文件的自动更新:

Docker部署Consul集群

实验版本信息:

软件版本
主机CentOS Linux 7 (Core)
内核3.10.0-1160.15.2.el7.x86_64
docker20.10.4
Consul镜像consul:latest -> 1.9.1
Consul-template0.20.0

准备consul集群,你也可以使用单独的一个consul实例做基础环境的支撑,可以参考通过Docker一键部署consul集群

nginx-template如何实现动态更新Nginx upstream  
Docker一键部署Consul集群原文
 

安装consul-template以及基础环境

此处,安装下consul-template,然后运行一个nginx容器,并且把nginx配置文件挂载到宿主机上:

wget https://releases.hashicorp.com/consul-template/0.20.0/consul-template_0.20.0_linux_amd64.zip
unzip consul-template_0.20.0_linux_amd64.zip
chmod +x consul-template
mv consul-template /usr/local/bin/
docker run -d --name nginx --restart=always -p 80:80 nginx:1.18
docker cp nginx:/etc/nginx /tmp/nginx
docker stop nginx && docker rm nginx
docker run -d --name nginx --restart=always -p 80:80 -v /tmp/nginx:/etc/nginx nginx:1.18
 

准备一个脚本文件,当consul-template从consul中获取到数据的更新后,触发该脚本运行nginx_operator.sh,实现reloadnginx的配置文件。

#!/bin/sh
docker ps -aq --filter "name=nginx"
if [ $? -ne 0 ]; then
 echo "Starting Nginx Server..."
 docker run -d --name nginx --restart=always -p 80:80 -v /tmp/nginx:/etc/nginx nginx:1.18
 echo "nginx start done."
else
 echo "Reloading nginx..."
 docker exec -it nginx nginx -s reload;
 echo "nginx reloading done."
fi
 

接下来准备consul-template运行的配置文件nginx.hcl,里面通过source指定了我们要使用的模板文件,以及destination指定根据模板渲染后生成的配置文件存储的路径位置,最后一个command就是当完成一次渲染后,要触发的动作,这里是一个脚本,就是会触发该脚本的内容。

wait {
  min = "3s"
  max = "9s"
}

syslog {
  enabled = true
  facility = "LOCAL5"
}

consul {
  address = "192.168.99.3:8500"
}

template {
  source = "/tmp/nginx/conf.d/consul/backend_nginx.ctmpl"
  destination = "/tmp/nginx/conf.d/consul/nginx01.conf"
  command = "/root/start_nginx.sh"
}
 

然后,需要准备一下consul-template要监听的模板文件backend_nginx.ctmpl,consul-template可以同时指定多个模板文件,如下所示:

consul-template \
  -consul $consul_cluster_address:8500 \
  -template "$template1:$file1:$command1" \
  -template "$template2:$file2:$comand2" \
  -template "$template3:$file3"
 

此处只用一个模板做一下测试,模板的中的语法是go template语法,这里实现的比较简单,只是做了upstream.server的渲染,对于实际使用来说,可以把模板文件中的nginx1server_name渲染的数据也存在consul集群中,这样也是可以渲染的。

upstream nginx1 {
    server 127.0.0.1:2000 down;
    {{ range service "local.www@dc1" }}
    server {{.Address}}:{{.Port}} weight=1;
    {{end}}
}

server {
     listen 80;
     server_name www.kubemaster.top;
     location / {
         proxy_pass http://nginx1;
     }
}
 

在这个实验中,consul-template通过consul拿到变化后的数据,将数据成功的渲染到配置文件之后,我们可以通过www.kubeamster.top能正常访问upstream后的服务,所以还需要准备一个上游服务,这里直接使用docker快速的运行一个即可

docker run -d --name nginx1 -p 8081:80 nginx:1.18
docker exec -it nginx1 bash
echo "backend server for consul-template" > /usr/share/nginx/html/index.html
 

此时,我们就可以把consul-template运行起来,作为后端进程运行着:

[root@node1 consul]# consul-template -config "nginx.hcl" --log-level=info
2021/03/04 19:25:21 [DEBUG] (logging) enabling syslog on LOCAL5
2021/03/04 11:25:21.098622 [INFO] consul-template v0.20.0 (b709612c)
2021/03/04 11:25:21.098767 [INFO] (runner) creating new runner (dry: false, once: false)
2021/03/04 11:25:21.099244 [INFO] (runner) creating watcher
2021/03/04 11:25:21.101210 [INFO] (runner) starting
...
 

最后我们通过curl或者postman把运行的nginx1服务往consul集群中注册一下

curl --location --request PUT 'http://192.168.99.3:8500/v1/catalog/register' \
--header 'Content-Type: application/json' \
--data-raw '{"Datacenter": "dc1","Node": "721d401b9555","Address": "192.168.99.3","Service": { "Id": "172.17.0.12:80", "Service": "www","tags": [ "local" ],"Port": 8081}}'
 

通过hostctl增加一条本地DNS解析

nginx-template如何实现动态更新Nginx upstream  
通过hostctl增加一条本地DNS解析

最后,我们通过浏览器访问一下http://www.kubemaster.top查看返回的内容就是nginx1的服务。这说明consul-template按照预期完成了工作。

nginx-template如何实现动态更新Nginx upstream  
Access Backend server by consul-template

到这里,基本上完成了使用consul-template与consul实现nginx配置文件的自动更新。

关于nginx-template如何实现动态更新Nginx upstream就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

推荐阅读:
  1. Nginx_upstream
  2. 如何使用Nginx实现灰度发布

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

nginx upstream

上一篇:如何实现灵活的K8S基础架构

下一篇:c语言怎么实现含递归清场版扫雷游戏

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》