傳統的負載均衡,若是Upstream參數發生變化,每次都須要從新加載nginx.conf文件,html
所以擴展性不是很高,因此咱們能夠採用動態負載均衡,實現Upstream可配置化、動態化,無需人工從新加載nginx.conf。node
這相似分佈式的配置中心linux
每次發現配置更改須要raload nginx,重啓Nginx。nginx
常見服務發現框架 Consul、Eureka、 ZooKeeper以及Etcd ZooKeeper是這種類型的項目中歷史最悠久的之一,它起源於Hadoop。它很是成熟、可靠,被許多大公司(YouTube、eBay、雅虎等)使用。git
etcd是一個採用HTTP協議的健/值對存儲系統,它是一個分佈式和功能層次配置系統,可用於構建服務發現系統。其很容易部署、安裝和使用,提供了可靠的數據持久化特性。它是安全的而且文檔也十分齊全。github
Consul是一款開源的分佈式服務註冊與發現系統,經過HTTP API可使得服務註冊、發現實現起來很是簡單,它支持以下特性。算法
服務註冊:服務實現者能夠經過HTTP API或DNS方式,將服務註冊到Consul。後端
服務發現:服務消費者能夠經過HTTP API或DNS方式,從Consul獲取服務的IP和PORT。瀏覽器
故障檢測:支持如TCP、HTTP等方式的健康檢查機制,從而當服務有故障時自動摘除。tomcat
K/V存儲:使用K/V存儲實現動態配置中心,其使用HTTP長輪詢實現變動觸發和配置更改。
多數據中心:支持多數據中心,能夠按照數據中心註冊和發現服務,即支持只消費本地機房服務,使用多數據中心集羣還能夠避免單數據中心的單點故障。
Raft算法:Consul使用Raft算法實現集羣數據一致性。
經過Consul能夠管理服務註冊與發現,接下來須要有一個與Nginx部署在同一臺機器的Agent來實現Nginx配置更改和Nginx重啓功能。咱們有Confd或者Consul-template兩個選擇,而Consul-template是Consul官方提供的,咱們就選擇它了。其使用HTTP長輪詢實現變動觸發和配置更改(使用Consul的watch命令實現)。也就是說,咱們使用Consul-template實現配置模板,而後拉取Consul配置渲染模板來生成Nginx實際配置。
1.下載consul_0.7.5_linux_amd64.zip
wget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip |
2.解壓consul_0.7.5_linux_amd64.zip
unzip consul_0.7.5_linux_amd64.zip |
若是解壓出現該錯誤
-bash: unzip: 未找到命令
解決辦法
yum -y install unzip
3. 執行如下 ./consul 出現如下信息就說明安裝成功
[root@localhost soft] ./consul usage: consul [--version] [--help] <command> [<args>] Available commands are: agent Runs a Consul agent configtest Validate config file event Fire a new event exec Executes a command on Consul nodes force-leave Forces a member of the cluster to enter the "left" state info Provides debugging information for operators join Tell Consul agent to join cluster keygen Generates a new encryption key keyring Manages gossip layer encryption keys kv Interact with the key-value store leave Gracefully leaves the Consul cluster and shuts down lock Execute a command holding a lock maint Controls node or service maintenance mode members Lists the members of a Consul cluster monitor Stream logs from a Consul agent operator Provides cluster-level tools for Consul operators reload Triggers the agent to reload configuration files rtt Estimates network round trip time between nodes snapshot Saves, restores and inspects snapshots of Consul server state version Prints the Consul version watch Watch for changes in Consul |
4.啓動consul
個人linux Ip地址192.168.212.131
./consul agent -dev -ui -node=consul-dev -client=192.168.212.131
5.臨時關閉防火牆systemctl stop firewalld
6.瀏覽器訪問192.168.212.131:8500
7.使用PostMan 註冊Http服務
http://192.168.212.131:8500/v1/catalog/register
參數1
{"Datacenter": "dc1", "Node":"tomcat", "Address":"192.168.5.165","Service": {"Id" :"192.168.5.165:8080", "Service": "itmayiedu","tags": ["dev"], "Port": 8080}} |
參數2
{"Datacenter": "dc1", "Node":"tomcat", "Address":"192.168.5.165","Service": {"Id" :"192.168.5.165:8081", "Service": "itmayeidu","tags": ["dev"], "Port": 8081}} |
Datacenter指定數據中心,Address指定服務IP,Service.Id指定服務惟一標識,Service.Service指定服務分組,Service.tags指定服務標籤(如測試環境、預發環境等),Service.Port指定服務端口。
7.發現Http服務
http://192.168.212.131:8500/v1/catalog/service/item_jd_tomcat
注意:清除以前Nginx環境,從新安裝。
Upsync是新浪微博開源的基於Nginx實現動態配置的三方模塊。Nginx-Upsync-Module的功能是拉取Consul的後端server的列表,並動態更新Nginx的路由信息。此模塊不依賴於任何第三方模塊。Consul做爲Nginx的DB,利用Consul的KV服務,每一個Nginx Work進程獨立的去拉取各個upstream的配置,並更新各自的路由。
wget http://nginx.org/download/nginx-1.9.10.tar.gz
做用:實現反向代理、負載負載庫
wget https://releases.hashicorp.com/consul/0.7.1/consul_0.7.1_linux_amd64.zip
做用:對動態負載均衡均配置實現註冊
wget https://github.com/weibocom/nginx-upsync-module/archive/master.zip
做用:nginx動態獲取最新upstream信息
unzip master.zip unzip consul_0.7.1_linux_amd64.zip |
若是解壓出現該錯誤
-bash: unzip: 未找到命令
解決辦法
yum -y install unzip
tar -zxvf nginx-1.9.10.tar.gz |
groupadd nginx useradd -g nginx -s /sbin/nologin nginx mkdir -p /var/tmp/nginx/client/ mkdir -p /usr/local/nginx |
cd nginx-1.9.0
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre --add-module=../nginx-upsync-module-master make && make install |
編譯的是報錯
./configure: error: SSL modules require the OpenSSL library.
解決辦法
yum -y install openssl openssl-devel
##動態去consul 獲取註冊的真實反向代理地址 upstream itmayiedu{ server 127.0.0.1:11111; upsync 192.168.212.134:8500/v1/kv/upstreams/itmayiedu upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off; upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf; }
server { listen 80; server_name localhost;
location / { proxy_pass http://itmayiedu; index index.html index.htm; } } |
upsync指令指定從consul哪一個路徑拉取上游服務器配置;upsync_timeout配置從consul拉取上游服務器配置的超時時間;upsync_interval配置從consul拉取上游服務器配置的間隔時間;upsync_type指定使用consul配置服務器;strong_dependency配置nginx在啓動時是否強制依賴配置服務器,若是配置爲on,則拉取配置失敗時nginx啓動一樣失敗。upsync_dump_path指定從consul拉取的上游服務器後持久化到的位置,這樣即便consul服務器出問題了,本地還有一個備份。
注意:替換 consul 註冊中心地址
mkdir /usr/local/nginx/conf/servers/
upsync_dump_path指定從consul拉取的上游服務器後持久化到的位置,這樣即便consul服務器出問題了,本地還有一個備份。
臨時關閉防火牆systemctl stop firewalld
個人linux Ip地址192.168.212.131
./consul agent -dev -ui -node=consul-dev -client=192.168.212.131
1.使用linux命令方式發送put請求
curl -X PUT http://192.168.212.134:8500/v1/kv/upstreams/itmayiedu/192.168.212.1:8081
curl -X PUT http://192.168.212.134:8500/v1/kv/upstreams/itmayiedu/192.168.212.1:8081
2.使用postmen 發送put請求
http://192.168.212.134:8500/v1/kv/upstreams/itmayiedu/192.168.212.1:8081 http://192.168.212.134:8500/v1/kv/upstreams/itmayiedu/192.168.212.1:8081
負載均衡信息參數
{"weight":1, "max_fails":2, "fail_timeout":10, "down":0}
Nginx