Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

How to implement dynamic updating Nginx upstream by nginx-template

2025-01-18 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Servers >

Share

Shulou(Shulou.com)05/31 Report--

这篇文章将为大家详细讲解有关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_64docker20.10.4Consul镜像consul:latest -> 1.9.1Consul-template0.20.0

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

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的渲染,对于实际使用来说,可以把模板文件中的nginx1与server_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解析

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

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

Access Backend server by consul-template

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

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

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Servers

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report