在負載均衡的調度器中,有個lvs,nginx,haproxy,lvs的搭建相比後兩者較困難些,而nginx的主要用處是輕量級的web服務器,haproxy是一種很好的高可用軟件,它可以基於4層和7層做高可用,分別表現在TCP上和http上,下面我們就通過一幅圖來了解haproxy的工作原理。
haproxy的工作模式:調度時發生的協議層次
http:僅用於調度http協議的服務器,7層
會對應用層數據做深入分析,因此支持7層過濾、處理、轉換等機制
tcp:非http協議的服務器調度,包含https,4層
通過在客戶端和後端的backend server之間建立一個全雙工的連接
後端提供兩個web服務器的節點,並且提供主頁以示區分,兩個節點的網段調爲自定義的vnet2
node1:
<h1>web1 test page</h1>
node2:
<h1>this is web2</h1>
然後,給這兩臺主機規劃IP地址
node1:211.70.160.15 node2:211.70.160.16 [root@node1 ~]ifconfig eth0 211.70.160.15/24 up [root@node2 ~]ifconfig eth0 211.70.160.16/24 up
此時,我們就可以將兩個節點上的web服務啓動了
[root@node1 ~]service httpd start
安裝haproxy軟件
[root@localhost ~]# yum install -y haproxy
將haproxy的日誌定向到rsyslog中,在rsyslog的配置文件中更改如下
# Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 # Provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514 local2.* /var/log/haproxy.log #將haproxy的日誌發往local2設施上
然後,重啓我們的rsyslog服務
[root@localhost ~]# service rsyslog restart
查看514端口是否在監聽
更改haproxy的配置文件,並且備份一份原有配置
[root@localhost haproxy]# cp haproxy.cfg haproxy.cfg.bak
刪除defaults段落後的所有內容,添加如下
frontend main *:80 default_backend webs backend webs balance roundrobin server s1 211.70.160.15:80 check server s2 211.70.160.16:80 check 或者修改爲listen形式 listen main *:80 balance roundrobin server s1 211.70.160.15:80 check server s2 211.70.160.16:80 check
啓動haproxy服務
[root@localhost haproxy]# service haproxy start
此時,haproxy的主機上已經監聽了80端口,可以使用ss查看
在我們的瀏覽器中進行驗證
刷新一次後,根據輪詢效果,會返回後端的node1和node2的網站主頁
使用基於source方法的haproxy調度
配置文件更改,只改了調度算法
frontend main *:80 default_backend webs backend webs balance source server s1 211.70.160.15:80 check server s2 211.70.160.16:80 check
重啓服務
[root@localhost haproxy]# service haproxy restart
再回到瀏覽器中查看
無論刷新多少次,出來的網頁都是node2節點上提供的web2的主網頁
使用基於cookie算法的haproxy
更改配置:
frontend main bind :80 default_backend webs backend webs balance source cookie web insert nocache #inset插入到http首部,nocache是中間的緩存服務器不允許緩存數據 server s1 211.70.160.15 server s2 211.70.160.16
重啓haproxy服務
[root@localhost haproxy]# service haproxy restart
然後在瀏覽器中訪問我們的地址,並且查看http首部信息
實現cookie綁定的效果
將我們的調度算法改爲roundrobin輪詢,更改配置文件爲
frontend main bind :80 default_backend webs backend webs balance roundrobin cookie web insert nocache server s1 211.70.160.15 cookie s1 #指定server的名稱,實現cookie綁定 server s2 211.70.160.16 cookie s2 [root@localhost haproxy]# service haproxy reload
再爲後端的兩個web節點提供網頁
node1上:
[root@node1~ ]cat /var/www/html/test.html <h1>hello node1 test</h1>
node2上:
[root@node2~ ]cat /var/www/html/test.html <h1>hello node2 test</h1>
訪問我們的資源
無論我們怎麼刷新網頁,返回的都是node1上提供的網頁,因爲這裏的cookie實現了綁定的效果
啓動haproxy的狀態頁:stats
修改haproxy的配置文件,使之支持stats狀態頁顯示
frontend main maxconn 4000 bind :80 default_backend webs backend webs balance roundrobin server s1 211.70.160.15 check port 80 server s2 211.70.160.16 check port 80 server b1 127.0.0.1:8080 backup stats enable #開啓stats
此時,將後端的node1的web服務上線
[root@node1 ~]service httpd start
重新加載配置文件,在瀏覽器中訪問狀態也地址
[root@localhost haproxy]# service haproxy reload
圖示,node1的web服務在線,node2在線,但是web服務沒有啓動
active:後端服務器中的active server
backup:後端服務器中的backup server
將backup主機加入健康監測,更改下面選項
server b1 127.0.0.1:8080 backup check port 8080
重新加載配置文件
[root@localhost haproxy]# service haproxy reload
對stats網頁做網頁訪問控制
stats hide-version #隱藏版本號 stats scope . #當前的作用範圍 stats uri /haproxyadmin?stats #自定義stats頁面的uri stats realm haproxy\ statistics #用於下面選項,提示用戶輸入用戶名密碼的顯示 stats auth statsadmin:password #基於用戶名和密碼的認證
修改配置文件,使其具有認證功能,在backend中添加
stats enable stats hide-version stats uri /hap?stats stats scope . stats realm INPUT\ your name & password stats auth admin:admin
重新加載配置,在瀏覽器中驗證
[root@localhost haproxy]# service haproxy reload
啓用stats的管理接口
stats admin if TRUE #添加此項
重新加載配置
[root@localhost haproxy]# service haproxy reload
再次訪問
也可以將stats單獨放置在一個段落中,不在backend中了,雖然,這樣安全了,但是,看不到後端服務器的狀態了