1、目標
一、Nginx實現負載均衡
二、consul-template動態維護Nginx裏面的server
三、consul-template監控Consul集羣
四、每一個服務配置Consul作服務發現
五、最終目的,當服務(Consul)Down機時;Nginx中的Server被Consul-template實時刪除,並從新加載(Nginx -s reload)配置文件html
2、主要用到的工具
一、功能實現:Nginx、 Consul、 Consul-template
二、配合工具:docker(用來搭建Consul羣集 、 提供服務) node
3、原理
一、Nginx自身的負載均衡功能
二、consul-template的Config功能實時監控Consul集羣的節點
三、實時的把consul節點的信息替換到Nginx配置文件、從新加載配置文件nginx
4、配置步驟
第一步:搭建consul集羣
第二步:部署服務consul客戶端(consul + webServer)使用config指定服務IP & Port
第三步:部署Nginx
第四步:搭建consul-template監聽consul客戶端的config文件
第五步:consul-template綁定Nginx配置文件web
5、過程
方案一:
寫在前面:由於要使用多個單獨的服務,使用Docker來作隔離
一、consul服務端集羣3個節點
二、consul客戶端(service)2個節點
三、Nginx + consul-template部署到同一個主機(本機)docker
不少Dockers的配置,先不記錄。
------------------------------------------------------------------------------------
方案二:
使用物理機
192.168.102.134 本機(Windows物理機)
192.168.102.207 CentOS(本機上的虛擬機)
192.168.102.234 CentOS(物理機)bootstrap
192.168.102.134 做爲Leader
192.168.102.207 做爲Client(consul + tomcat)
192.168.102.234 做爲consul-template + nginx服務
具體配置以下:tomcat
【leader 192.168.102.134】cookie
由於這個是Windows不適合作服務(主要緣由:服務檢測check沒找到實現辦法)負載均衡
consul.exe agent -server -node leader -dc dc1 -data-dir c:\tmp -ui -client 0.0.0.0 -bind=192.168.102.134 -advertise 192.168.102.134 -bootstrap-expect 1
【consul client 192.168.102.207】curl
一、服務部署:tomcat 8080
啓動一個Tomcat服務(任意內容)做爲服務
二、Config文件,服務檢查 check : curl localhost:8080
{"service": {"name": "web", "tags": ["fyh"], "port": 8080, "check": {"script": "curl localhost:8080 >/dev/null 2>&1", "interval": "10s"}}}
三、啓動consul並join到leader下
./consul agent -data-dir /opt/consulData -config-dir /opt/consulConfig/ -advertise 192.168.102.207 -join 192.168.102.134
【consul-template 192.168.102.234】
一、Nginx配置
(1)默認Nginx.conf中增長include ***/test.conf(曲線救國,直接映射到nginx.conf中不生效,include中間文件方法在服務全掉的時候沒法reload成功,由於upstream中server爲空)
(2)test.conf內容爲空(等待Template寫入)
(3)要求安裝nginx正確,支持./nginx -s reload命令進行從新加載
二、Template配置
(1)Template文件內容(/opt/consulTemplate/test.ctmpl)
upstream web { ip_hash; # Refer: http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream # least_conn; # least_time; {{range service "web"}} server {{.Address}}:{{.Port}} fail_timeout=0; {{end}} server 127.0.0.1 fail_timeout=0; keepalive 64; } server { listen 80; server_name ipaddress; location / { client_max_body_size 0; proxy_connect_timeout 300s; proxy_send_timeout 900; proxy_read_timeout 900; proxy_buffer_size 32k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_redirect off; proxy_hide_header Vary; proxy_set_header Accept-Encoding ''; proxy_set_header Host $host; proxy_set_header Referer $http_referer; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_size 6400; proxy_pass http://web; } }
(2)啓動consul-template
nohup ./consul-template -consul 192.168.102.134:8500 -template /opt/consulTemplate/test.ctmpl:/usr/local/nginx/conf/conf.d/test.conf:"/usr/local/nginx/sbin/nginx -s reload" 2>&1 >/opt/consul-template.log &
6、驗證
方案一驗證:
查看template中獲取到的service 數量
中止web服務,consul的Config中配置的check是否能發現並把consul的服務狀態置爲高危不可用(critical)
直接kill consul進程,查看service數量
最終仍是查看最上層的服務提供nginx的服務狀態
方案二驗證:
方案二隻有一個consul客戶端
驗證兩個環境搭建後是否可用
tomcat服務中止時是Consul狀態是否爲critical,重啓tomcat服務後,服務正常
中止consul客戶端查看狀態
其中Consul服務端暫時未搭建集羣未進行測試。
7、附錄
[consul服務端]:
./consul agent -server -data-dir /tmp/data -ui -client 0.0.0.0 -advertise 192.168.102.134 -bootstrap-expect 1
[consul客戶端]:
nohup ./consul agent -config-dir=/usr/local/config -join 192.168.102.134 -data-dir /data 2>&1 &
[consul-template]:./consul-template -consul 192.168.102.134:8500 -template /usr/local/nginx/conf/myserver.conf.d/test.ctmpl:/usr/local/nginx/conf/nginx.conf:"/usr/local/nginx/sbin/nginx -s reload" -dry [Consul查詢]: http://192.168.102.207:8500/v1/catalog/service/web http://192.168.102.207:8500/v1/catalog/nodes http://192.168.102.207:8500/v1/kv/key2?flags=42 設置key2=42 http://192.168.102.207:8500/v1/kv/key2 查詢kv值