注意,本篇文章爲負載均衡的理論篇,後續找個機會推出實戰篇。理論篇主要講述如何配置負載均衡,配置負載均衡不難。難的是真正的實戰,好比如何作到多服務器之間的數據共享(session,file等),多cache服務器如何作到命中率高等等問題web
上一篇文章中咱們經過反向代理了後端一臺服務器,但隨着網站訪問的人愈來愈多一臺服務器實在是頂不住,因而咱們加了多臺服務器,那麼多臺服務器又怎麼配置代理呢?算法
upstream test.com{ # ip_hash; server 192.168.10.13:80; server 192.168.10.14:80 down; server 192.168.10.15:8009 max_fails=3 fail_timeout=20s; server 192.168.10.16:8080; } server { location / { proxy_pass http://test.com; } }
實際上負載均衡也是經過反向代理的方式,可是proxy_pass
只能寫一個地址,因此咱們把某些地址經過upstream
做爲一個集合來作反向代理就實現了負載均衡;後端
upstream是Nginx的HTTP Upstream模塊,這個模塊經過一個簡單的調度算法來實現客戶端IP到後端服務器的負載均衡。在上面的設定中,經過upstream指令指定了一個負載均衡器的名稱test.com。這個名稱能夠任意指定,在後面須要用到的地方直接調用便可。緩存
Nginx的負載均衡模塊目前支持4種調度算法,下面進行分別介紹,其中後兩項屬於第三方調度算法。服務器
輪詢(默認)。每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端某臺服務器宕機,故障系統被自動剔除,使用戶訪問不受影響。Weight 指定輪詢權值,Weight值越大,分配到的訪問機率越高,主要用於後端每一個服務器性能不均的狀況下。session
ip_hash。每一個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個後端服務器,有效解決了動態網頁存在的session共享問題。負載均衡
fair。這是比上面兩個更加智能的負載均衡算法。此種算法能夠依據頁面大小和加載時間長短智能地進行負載均衡,也就是根據後端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx自己是不支持fair的,若是須要使用這種調度算法,必須下載Nginx的upstream_fair
模塊。性能
url_hash。此方法按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,能夠進一步提升後端緩存服務器的效率。Nginx自己是不支持url_hash的,若是須要使用這種調度算法,必須安裝Nginx的hash軟件包網站
在HTTP Upstream模塊中,能夠經過server指令指定後端服務器的IP地址和端口,同時還能夠設定每一個後端服務器在負載均衡調度中的狀態。經常使用的狀態有:url
注,當負載調度算法爲ip_hash時,後端服務器在負載均衡調度中的狀態不能是weight和backup。
upstream webservers { server 192.168.18.201 weight=1; server 192.168.18.202 weight=1; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://webservers; proxy_set_header X-Real-IP $remote_addr; } }
注,upstream是定義在server{ }以外的,不能定義在server{ }內部。定義好upstream以後,用proxy_pass引用一下便可。
若是定義在server內部就會報錯:
"upstream" directive is not allowed here in xxxxxx
重啓之後不斷刷新208就會發現,是201和202的內容交替出現,而後分別查看其日誌,達到了負載均衡輪詢的效果;