您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(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ā)reload
nginx服務(wù)。當然對于小規(guī)模下的應(yīng)用場景還有很多,比如Haproxy
配置文件動態(tài)更新等。
這里小小的做個調(diào)查,你使用過以下那種方案:
下面,我們就開始今天的實踐目的吧,通過consul-template與consul完成nginx配置文件的自動更新:
實驗版本信息:
軟件 | 版本 |
---|---|
主機 | CentOS Linux 7 (Core) |
內(nèi)核 | 3.10.0-1160.15.2.el7.x86_64 |
docker | 20.10.4 |
Consul鏡像 | consul:latest -> 1.9.1 |
Consul-template | 0.20.0 |
準備consul集群,你也可以使用單獨的一個consul實例做基礎(chǔ)環(huán)境的支撐,可以參考通過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)reload
nginx的配置文件。
#!/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
的渲染,對于實際使用來說,可以把模板文件中的nginx1
與server_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解析
最后,我們通過瀏覽器訪問一下http://www.kubemaster.top
查看返回的內(nèi)容就是nginx1的服務(wù)。這說明consul-template按照預期完成了工作。
到這里,基本上完成了使用consul-template與consul實現(xiàn)nginx配置文件的自動更新。
關(guān)于nginx-template如何實現(xiàn)動態(tài)更新Nginx upstream就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(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)容。