在Windows環境中使用Nginx, Consul, Consul Template搭建負載均衡和服務發現服務

搭建負載均衡和服務發現服務的目的

隨着網站業務的不斷提高,單個服務器的性能愈來愈難知足客戶的業務需求,因此不少狀況下,須要使用多服務器實例和負載均衡器來知足業務須要。html

Nginx

什麼是Nginx

Nginx一款高性能的Web服務器,它既能夠單獨使用,也能夠做爲負載均衡器與其餘Web服務器組合使用。
nginx

Nginx安裝

咱們可用從Nginx官網上(http://nginx.org/)下載最新的Windows版本壓縮包。
壓縮包解壓以後目錄結構以下:git

Nginx的配置

events {
    worker_connections 1024;
}


http {
    upstream backend
    {
        server 127.0.0.1:91 weight=1;
        server 127.0.0.1:92 weight=1;
    }
    server 
    {
        location / {
            proxy_pass http://backend;
        }
    }
}

其中upstream部分定義了對於HTTP請求的負載均衡。 當用戶發送請求到http://backend的時候,Nginx會將這個請求轉發到指定服務器IP列表中的一個。配置中的weight字段設置了指定服務器IP的權重,權重越高,轉發的可能性越高。github

常見問題

Nginx默認會佔用80端口,這個和IIS有衝突, 因此須要在nginx.conf中修改Nginx的默認端口web

events {
    worker_connections 1024;
}


http {
    upstream backend
    {
        server 127.0.0.1:92 weight=1;
        server 127.0.0.1:93 weight=1;
    }
    server 
    {
        listen 81;
        server_name localhost;

        location / {
            proxy_pass http://backend;
        }
    }
}

實例

當前網站有2個實例部署在IIS中,siteA IP 127.0.0.1:92, siteB IP 127.0.0.1:93。json

siteA和siteB都只有一個index.html頁面。
代碼以下:api

siteA瀏覽器

<!DOCTYPE html>
<html>
<head>
   <title>Nginx Sample</title>
</head>

<body>
    <h1>This is site A</h1>
</body>
</html>

siteB服務器

<!DOCTYPE html>
<html>
<head>
   <title>Nginx Sample</title>
</head>

<body>
    <h1>This is site B</h1>
</body>
</html>

Nginx服務器使用81端口。 咱們但願實現的效果是當用戶訪問http://127.0.0.1:81時,Nginx隨機將請求轉發到http://127.0.0.1:92或者http://127.0.0.1:93上負載均衡

siteA網站的index.html頁效果以下

siteB網站的index.html頁效果以下

實現步驟

a. 首先咱們修改Nginx的配置文件

events {
    worker_connections 1024;
}


http {
    upstream 127.0.0.1
    {
        server 127.0.0.1:91 weight=1;
        server 127.0.0.1:92 weight=1;
    }
    server 
    {
        listen 81;
        server_name localhost;

        location / {
            proxy_pass http://127.0.0.1;
        }
    }
}

b. 在命令行啓動NginX

c. 打開瀏覽器,輸入http://127.0.0.1:81, 反覆按F5刷新, 網站內容在siteA和siteB之間切換,這說明負載均衡已經成功啓用。

Consul

什麼是Consul

Consul是一款用高性能服務註冊/服務健康檢查組件

Consul安裝

咱們能夠從官網(https://www.consul.io/downloads.html) 中對應版本的32位或64位程序。下載以後就是一個可執行文件consul.exe

如何啓動Consul

使用命令consul agent -dev, consul就會已開發模式啓動(開發模式不會啓用持久化,程序關閉後全部配置會丟失

Consul服務後臺

Consul服務啓動以後,咱們能夠訪問,http://localhost:8500 來訪問Consul的管理後臺,界面以下。

在這個管理後臺中能夠查看Consul註冊的全部服務和全部主機節點。

註冊服務

Consul服務啓動以後,咱們能夠調用一些相應的Api來註冊服務(相關Api列表 https://www.consul.io/api/index.html)

繼續咱們的實例

如今咱們嘗試將以前的siteA, siteB註冊到Consul中。

a. 首先這裏咱們去下載一個Curl程序(https://curl.haxx.se/) 來調用Api(這裏能夠用POSTMAN代替)

b. 建立2個json文件siteA.json, siteB.json。其內容以下

siteA.json

{
    "ID":"webA",
    "Name":"web",
    "Tags":[],
    "Address":"127.0.0.1",
    "Port":92,
    "EnableTagOverride":false
}

siteB.json

{
    "ID":"webB",
    "Name":"web",
    "Tags":[],
    "Address":"127.0.0.1",
    "Port":93,
    "EnableTagOverride":false
}

這裏的Name就是服務名稱,ID就是該服務的一個實例ID。

c. 使用curl調用註冊服務Api,將siteA和siteB註冊到Consul中
curl --request PUT --data @siteA.json http://localhost:8500/v1/agent/service/register
curl --request PUT --data @siteB.json http://localhost:8500/v1/agent/service/register

d. 回到Consul管理頁面,咱們會發現服務列表中會出現一個名爲web的服務,這個服務有2個實例

若是看到以上結果,就說明2個Web服務實例註冊成功了。

添加服務健康檢查

將服務註冊到Consul以後,獲得的第一個好處就是能夠藉助Consul對每一個服務實例進行健康檢查。

繼續修改咱們的實例

a. 關閉以前打開的Consul服務,新開一個命令行窗口,使用consul agent -dev從新開啓一個新的Consul服務

b. 在siteA和siteB網站目錄中,分別添加一個healthcheck.html文件,其內容以下
<!DOCTYPE html>

<html>
<head>
   <title>Nginx Sample</title>
</head>
<body>
    <h1>This is health check page</h1>
</body>
</html>

c. 修改以前的siteA.json和siteB.json
siteA.json

{
    "ID":"webA",
    "Name":"web",
    "Tags":[],
    "Address":"127.0.0.1",
    "Port":92,
    "Checks":[{
        "http":"http://127.0.0.1:92/healthcheck.html",
        "interval":"5s"
    }],
    "EnableTagOverride":false
}

siteB.json

{
    "ID":"webB",
   "Name":"web",
    "Tags":[],
    "Address":"127.0.0.1",
    "Port":93,
    "Checks":[{
        "http":"http://127.0.0.1:93/healthcheck.html",
        "interval":"5s"
    }],
    "EnableTagOverride":false
}

d. 從新使用curl調用註冊服務Api, 將siteA和siteB註冊到Consul中

e. 打開siteA目錄,將healthcheck.html更名爲healthcheck1.html(這個操做至關於模擬siteA所在的服務器崩潰, consul請求不到healthcheck.html文件了)

f. 回到Consul管理界面,咱們看一下結果,它會顯示webA檢查失敗

g. 將healthcheck1.html更名會healthcheck.html, 等待5秒後,返回consul界面中,webA已經變回檢測經過狀態。

Consul Template

什麼是Consul Template

Consul Template是Consul的一個擴展組件,能夠讀取Consul中的服務配置,根據指定模板生成不一樣的配置文件。

因此這裏咱們就能夠組合使用Consul, Consul Template來動態生成Nginx的配置文件, 並自動重啓Nginx。

安裝Consul Template

咱們能夠從官網(https://releases.hashicorp.com/consul-template)中下載consul-template.exe

啓動Consul Template

consul-template -consul-addr 127.0.0.1:8500 -template "./2.tpl:./conf/nginx.conf:nginx -s reload"

這裏-consul-addr參數是指定consul服務的地址, -template是指定consul template使用的模板,生成的新文件地址,以及生成新文件以後的執行的命令。

繼續咱們的案例

如今咱們添加一個新的siteC, ip爲127.0.0.1:94, siteC中也只有index.html和healthcheck.html2個文件

a. 建立2.tpl, 文件內容以下, 這裏使用的是consul-template的模板語法(相應語法介紹能夠查看https://github.com/hashicorp/consul-template)

events {
    worker_connections 1024;
}


http {
   upstream 127.0.0.1{
        {{ range service "web" }}
    server {{ .Address }}:{{ .Port }} weight=1;{{ end }} 
    }
    server {
        listen       81;
        server_name  localhost;


        location / {
           proxy_pass http://127.0.0.1;
        }

    }
}

b. 使用命令consul-template -consul-addr 127.0.0.1:8500 -template "2.tpl:conf/nginx.conf:nginx -s reload" 啓動consul-template

c. 建立siteC.json, 使用curl將siteC註冊到consul中, siteC.json內容以下

{
    "ID":"webC",
    "Name":"web",
    "Tags":[],
    "Address":"127.0.0.1",
    "Port":94,
    "Checks":[{
        "http":"http://127.0.0.1:94/healthcheck.html",
        "interval":"5s"
    }],
    "EnableTagOverride":false
}

d. 打開瀏覽器,輸入http://localhost:81, 反覆按F5刷新,你會發現siteC已經加入到了Nginx負載均衡配置中。d

e. 而後咱們進行一個測試,咱們將siteA的healthcheck.html重命名爲healthcheck1.html

f. 回到剛纔頁面中繼續按F5刷新,咱們會發現如今只顯示siteB和siteC的內容了,這是由於siteA已經被consul認定爲不健康的服務,因此consul-template從新生成Nginx的配置文件,將siteA中配置文件中抹除,並從新啓動了Nginx。

相關文章
相關標籤/搜索