隨着網站業務的不斷提高,單個服務器的性能愈來愈難知足客戶的業務需求,因此不少狀況下,須要使用多服務器實例和負載均衡器來知足業務須要。html
Nginx一款高性能的Web服務器,它既能夠單獨使用,也能夠做爲負載均衡器與其餘Web服務器組合使用。
nginx
咱們可用從Nginx官網上(http://nginx.org/)下載最新的Windows版本壓縮包。
壓縮包解壓以後目錄結構以下:git
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是一款用高性能服務註冊/服務健康檢查組件
咱們能夠從官網(https://www.consul.io/downloads.html) 中對應版本的32位或64位程序。下載以後就是一個可執行文件consul.exe
使用命令consul agent -dev, 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的一個擴展組件,能夠讀取Consul中的服務配置,根據指定模板生成不一樣的配置文件。
因此這裏咱們就能夠組合使用Consul, Consul Template來動態生成Nginx的配置文件, 並自動重啓Nginx。
咱們能夠從官網(https://releases.hashicorp.com/consul-template)中下載consul-template.exe
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。