一.測試環境html
OS: rhel6nginx
Lib1: 192.168.20.106 A服務器算法
Lib2: 192.168.20.107 B服務器vim
Lib3: 192.168.20.108 C服務器後端
部署: A服務器作爲主服務器,域名直接解析到A服務器(192.168.20.106)上,由A服務器負載均衡到B服務器(192.168.20.107)與C服務器(192.168.20.108)上。緩存
upstream是Nginx的HTTP Upstream模塊,這個模塊經過一個簡單方法來實如今輪詢和客戶端IP之間的後端服務器負荷平衡。默認是以輪詢的方式實現負載均衡,這種方式中,每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。服務器
upstream支持的負載均衡算法:session
Nginx的負載均衡模塊目前支持4種調度算法,下面分別進行介紹,其中後兩項屬於第三方調度算法負載均衡
1.輪詢(默認) 每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端的某個服務器宕機,故障系統被自動剔除,使用戶的訪問不受影響,weight 指定輪詢的權值 weight值越大,分配的訪問的機率越高 主要用於後端的每一個服務器性能不均的狀況下ide
2.ip_hash:每一個請求按訪問Ip的hash結果分配,這樣來自同一個Ip的訪客固定訪問到一個後端服務器,有效的解決了動態網頁存在的session共享問題
3.fair:這是個比上面兩個更加智能的負載均衡算法,此算法能夠依據頁面的大小和加載時間長短智能的進行負載均衡,也就是根據後端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx自己不支持fair的,若是須要使用這種調度算法,必須下載Nginx的upstream_fair模塊
4.url_hash:按訪問的url的hash結果來分配請求,使每一個url定向到同一個後端服務器,能夠進一步提升後端緩存服務器的效率,Nginx自己是不支持url_hash的,若是須要使用這種調度算法,必須安裝Nginx的hash軟件包
upstream支持的狀態參數在HTTP Upstream模塊中,能夠經過server指令來指定後端服務器的Ip地址和端口,同時還能夠設定每一個後端服務器
在負載均衡調度中的狀態,經常使用的狀態有:
down: 表示當前的server暫時不參與負載均衡
backup: 預留的備份機器,當其餘全部的非backup機器出現故障或忙碌時,纔會請求backup的後端主機,所以
這臺服務器的壓力最小
max_fails: 容許請求失敗的次數,默認爲1,當超過最大的次數時,返回proxy_next_upstream模塊定義的錯誤
fail_timeout: 在經歷max_fails次失敗後,暫停服務的時間,
PS: 當負載調度算法爲ip_hash時,後端服務器在負載均衡調度中的狀態不能是weight和backup。
max_fails能夠和fail_timeout參數一塊兒使用,能夠進行健康狀態檢查。
二.以輪詢算法配置nginx負載均衡
1.這裏關於nginx的安裝再也不作贅述
2.# vim /etc/nginx/nginx.conf ##在A服務器上進行配置
upstream 配置在server段外
upstream backend {
server 192.168.20.107 weight=2 max_fails=2 fail_timeout=2
server 192.168.20.108 weight=2 max_fails=2 fail_timeout=2
}
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
}
3.配置域名,修改hosts文件在最後一行添加 (宿主機)
192.168.20.106 www.luochen.com
4.修改server段server_name (A服務器)
server_name www.luochen.com
5.# service nginx restart
6.修改B,C服務器的配置文件在日誌文件中顯示真實的客戶端ip(在B,C服務器上操做)
在server段內添加:
set_real_ip_from 192.168.20.0/24;
real_ip_header X-Real-IP; ##在編譯時須要安裝http_realip_module模塊
real_ip_recursive on;
7.修改配置文件後重啓下服務
# service nginx restart
8.在宿主機上進行測試,看每次訪問是否是以輪詢的方式響應
9.查看B,C服務器上的日誌文件
# tail /var/log/nginx/access.log ##若是ip是宿主機ip則配置成功
三.以ip_hash算法配置nginx負載均衡
1.# vim /etc/nginx/nginx.conf ##在A服務器上進行配置
upstream 配置在server段外
upstream backend {
ip_hash; ###與上面的配置同樣的只須要在這裏加上這一行便可
server 192.168.20.107 weight=2 max_fails=2 fail_timeout=2
server 192.168.20.108 weight=2 max_fails=2 fail_timeout=2
}
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
}
2.配置域名,修改hosts文件在最後一行添加 (宿主機)
192.168.20.106 www.luochen.com
3.修改server段server_name (A服務器)
server_name www.luochen.com
4.# service nginx restart
5.修改B,C服務器的配置文件在日誌文件中顯示真實的客戶端ip(在B,C服務器上操做)
在server段內添加:
set_real_ip_from 192.168.20.0/24;
real_ip_header X-Real-IP; ##在編譯時須要安裝http_realip_module模塊
real_ip_recursive on;
6.修改配置文件後重啓下服務
# service nginx restart
7.在宿主機上進行測試,看每次訪問是否是以輪詢的方式響應
8.查看B,C服務器上的日誌文件
# tail /var/log/nginx/access.log ##若是ip是宿主機ip則配置成功
PS: 使用ip_hash後會一直用同一臺服務器來響應同一ip的請求
四.猜測下是否有這樣的狀況,當全部的後端服務器都宕機了,該怎麼響應用戶???
1.配置backup服務器 (A服務器)
upstream backend {
server 192.168.1.111 weight=2 max_fails=2 fail_timeout=2;
server 192.168.1.113 weight=2 max_fails=2 fail_timeout=2;
server 127.0.0.1:8080 backup; ###關鍵是這一行
}
2.修改配置文件添加一個虛擬主機
server {
listen 8080;
server_name localhost;
root html;
index index.html index.htm;
}
3.# service nginx restart
4.# service nginx stop (B,C服務器)
5.再在宿主機上訪問測試看看