千家信息网

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

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章将为大家详细讲解有关nginx-template如何实现动态更新Nginx upstream,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Co
千家信息网最后更新 2025年12月02日nginx-template如何实现动态更新Nginx upstream

这篇文章将为大家详细讲解有关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集群

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解析

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

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

Access Backend server by consul-template

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

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

文件 更新 模板 配置 运行 数据 集群 服务 脚本 准备 动态 内容 就是 后台 基础 文章 更多 版本 环境 知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 sql数据库数据怎么查写入时间 阿里云的数据库能干什么 吉首网络技术招聘 计算机网络技术基础是学什么 重庆定制软件开发排行榜 地下城服务器喇叭怎么出售 南京网络安全运维平台 vb 数据库更新 龙猫互联网科技是干嘛的 服务器中转无法获取ip地址 能源数据库建设国内外现状 浪潮服务器代理商地址在哪里 端口号后面的是数据库名吗 镇江百事通网络技术有限公司 网络安全管理人员保密协议 数据库中隔离性怎么用代码 以下哪些不是网络安全法 达内网络安全课程靠谱吗 网络安全教育培训制度 国网南瑞网络安全 网上书店数据库设计报告总结 中央办公厅网络安全敬兵 网络安全素质教育考试时间 玩暗影格斗的服务器 北京服务器机柜厂商有哪些 软件开发阶段需求变更 广西定时模块服务器 服务器集群分类 软件开发公司目标 大华联动报警服务器无法启动
0