溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

nginx-template如何實現(xiàn)動態(tài)更新Nginx upstream

發(fā)布時間:2021-11-23 21:41:25 來源:億速云 閱讀:342 作者:柒染 欄目:云計算

這篇文章將為大家詳細講解有關(guān)nginx-template如何實現(xiàn)動態(tài)更新Nginx upstream,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

Consul Template 提供一個方便的方式從Consul服務(wù)獲取數(shù)據(jù)通過consul-template的后臺程序保存到文件系統(tǒng),這個后臺進程監(jiān)控Consul中數(shù)據(jù)的變化并更新任意數(shù)量的模板到文件系統(tǒng)。模板更新完成后consul-template也可以觸發(fā)相關(guān)的指令或者腳本,此處通過簡單的實踐動態(tài)更新Nginx的upstream server并且觸發(fā)reloadnginx服務(wù)。當然對于小規(guī)模下的應(yīng)用場景還有很多,比如Haproxy配置文件動態(tài)更新等。

這里小小的做個調(diào)查,你使用過以下那種方案:

下面,我們就開始今天的實踐目的吧,通過consul-template與consul完成nginx配置文件的自動更新:

Docker部署Consul集群

實驗版本信息:

軟件版本
主機CentOS Linux 7 (Core)
內(nèi)核3.10.0-1160.15.2.el7.x86_64
docker20.10.4
Consul鏡像consul:latest -> 1.9.1
Consul-template0.20.0

準備consul集群,你也可以使用單獨的一個consul實例做基礎(chǔ)環(huán)境的支撐,可以參考通過Docker一鍵部署consul集群

nginx-template如何實現(xiàn)動態(tài)更新Nginx upstream  
Docker一鍵部署Consul集群原文
 

安裝consul-template以及基礎(chǔ)環(huán)境

此處,安裝下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中獲取到數(shù)據(jù)的更新后,觸發(fā)該腳本運行nginx_operator.sh,實現(xiàn)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指定根據(jù)模板渲染后生成的配置文件存儲的路徑位置,最后一個command就是當完成一次渲染后,要觸發(fā)的動作,這里是一個腳本,就是會觸發(fā)該腳本的內(nèi)容。

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要監(jiān)聽的模板文件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語法,這里實現(xiàn)的比較簡單,只是做了upstream.server的渲染,對于實際使用來說,可以把模板文件中的nginx1server_name渲染的數(shù)據(jù)也存在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拿到變化后的數(shù)據(jù),將數(shù)據(jù)成功的渲染到配置文件之后,我們可以通過www.kubeamster.top能正常訪問upstream后的服務(wù),所以還需要準備一個上游服務(wù),這里直接使用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服務(wù)往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如何實現(xiàn)動態(tài)更新Nginx upstream  
通過hostctl增加一條本地DNS解析

最后,我們通過瀏覽器訪問一下http://www.kubemaster.top查看返回的內(nèi)容就是nginx1的服務(wù)。這說明consul-template按照預期完成了工作。

nginx-template如何實現(xiàn)動態(tài)更新Nginx upstream  
Access Backend server by consul-template

到這里,基本上完成了使用consul-template與consul實現(xiàn)nginx配置文件的自動更新。

關(guān)于nginx-template如何實現(xiàn)動態(tài)更新Nginx upstream就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI