haproxy 介紹javascript
1 工做在ISO 七層 根據http協議(或者工做在ISO四層 根據tcp協議) 提供web服務的負載均衡調度器php
負載均衡調度器分類 工做在四層: # lvs 工做在七層: # nginx (web,http reverse proxy,cache) # haproxy (http reverse proxy,tcp proxy) # tcp: 實現MySQL的讀寫中讀的負載均衡 # ats (apache traffic server) # perlbal # pound # squid # varnish 以上程序均可以實現服務的向外拓展;
haproxy特性css
haproxy 當前版本爲1.3 1.4,下面咱們介紹1.4版本的特性html
# 客戶端側的長鏈接(client-side keep-alive) # TCP加速(TCP speedups) # 響應池(response buffering) # RDP協議 # 基於源的粘性(source-based stickiness) # 更好的統計數據接口(a much better stats interfaces) # 更詳細的健康狀態檢測機制(more verbose health checks) # 基於流量的健康評估機制(traffic-based health) # 支持HTTP認證 # 服務器管理命令行接口(server management from the CLI) # 基於ACL的持久性(ACL-based persistence) # 日誌分析器
官網站點:haproxy.1wt.eujava
haproxy 架構圖node
haproxy.cfg 配置文件詳解mysql
安裝 linux
#yum -y inistall haproxynginx
配置文件路徑 git
/etc/haproxy/haproxy.cfg
(1)配置由兩部分組成 #global settings: 對haproxy進程自身屬性的設定----------全局設定段 #proxies: 對代理的設定 -----------------代理設定段 defaults frontend backend listen 其中defaults爲proxies提供默認屬性,frontend接受客戶端的請求,backend鏈接後端的上游服務器(相似於nginx的upstream),listen是特定的frontend與backend的組合 (2)定義一個完整的代理的方式: frontend backend listen (3)defaults段分析 # option httpclose:使用短鏈接 # option redispath:使用cookie保持會話,若是後端的server宕機,則使用redispath 重定向另外一個路徑繼續保持會話; # option http-server-close :當keep-alive超時時,使用該選項在服務器上關閉會話 # timeout connect :haproxy轉發到後邊upstream server 時等待的時長 # timeout client :客戶端非活動狀態的超時時長 # timeout server : haproxy和後邊的服務器段保持一個會話,當後臺服務器down掉後,haproxy等待的超時時間 # timeout-keep-alive:定義保持鏈接模式的超時時長 # timeout-check : 創建狀態檢測時間的超時時間 # maxconn :每個server最大併發鏈接數
負載均衡調度方法
格式:balance roundrobin| static-rr| leastconn | source | uri | uri_param | hdr(<name>) | rdp-cookie(name)
調度方法解析 #roundrobin :屬於加權輪詢 (動態) 支持服務器活動時修改其權重,服務器下線後從新上線時支持慢啓動 #static-rr : 屬於加權輪詢(靜態)不支持服務器活動時修改,須要重啓服務才能生效 # 老服務器從新上線上時,馬上會收到大批量的請求 #leastconn :支持動態修改權重,慢啓動 #source :默認爲(靜態)方法,hash/ 源ip 取模算法,支持hash-type調整爲動態 #uri :默認爲(靜態)方法,hash/weight 取模算法,支持hash-type來調整 #url-params:默認爲(靜態)方法,hash/wgith 算法,支持hash-type調整 #hdr (<name>):默認爲靜態方法, 先對<name>作hash計算而後 hash/weight 計算,支持hash-type調整
調度方法的使用總結 #一、調度衆多的MySQL從服務器,用什麼調度方法? leastconn #二、調度web圖片服務器組,用什麼調度方法? roundrobin #三、調度web圖片服務器組,用什麼調度方法? source 或者 cookie #四、調度web緩存服務器組,用什麼調度方法? uri hash-type: map-based (默認的靜態的hash表) consistent(動態的一致性hash) ---------在後端的cache服務器上使用,不然會致使服務器的加入或者退出時 服務器羣癱瘓
haproxy 的工做模式 (使用mode參數)
http :http協議 --------haproxy的價值體現於此 # 對應用層數據作深刻分析,所以支持7層的過濾、處理、轉換等機制; tcp :haproxy在客戶端和upstream server之間創建一個全雙工的鏈接 # 不會對應用層協議作任何檢查 # SSL 、MySQL、SSL等都應該使用此模式; # 默認模式!
指定haproxy日誌
# log global : 使用全局配置中定義的日誌服務器; # log <address> <facility> [<level> [<minlevel>]] # capture request header <HEADER> len <LENGTH> # capture resopense header <HEADER> len <LENGTH> 實例:在frontend中定義一個日誌 (1)編輯rsyslog.conf #vim /etc/rsyslog.conf 在日誌服務器上先定義一個日誌 local3.* /var/log/hawebsrv.log #service rsyslog restart (2)編輯haproxy.cfg #vim /etc/haproxy/haproxy.cfg frontend websrv log 127.0.0.1 local3 bind *:80 default_backend webservers #serivce haproxy reload (3)haproxy服務器測試 #tail /var/log/hawebsrv.log
haproxy中的ACL
格式:acl <aclname> <criterion> [flags] [oprator] <value> value: 支持整數或者整數範圍 支持字符串 支持正則表達式 支持ip地址和網絡地址
ACL例子 # acl url_static path_beg /static /p_w_picpaths /img /css # acl url_static path_end .gif .png .jpg .css .js # acl host_www hdr_beg(host) -i www # acl host_static hdr_beg(host) -i img. video. download. ftp. # use_backend static if host_static or host_www or url_static # use_backend www if host_www
實現訪問控制 http-request:7層過濾 (藉助於定義好的acl實現) tcp-request: 4層過濾 (藉助於定義好的acl實現)
haproxy 動靜分離的實現
架構圖
一、 環境配置
haproxy服務器配置 外網網卡 #ifconfig eth0 172.16.13.2/16 up #route add default gw 172.16.0.1 內網網卡 #ifconfig eth1 192.168.20.1/24 up 兩臺上游服務器配置 server1 配置 #ifconfig eth0 192.168.20.11/24 #route add default gw 192.168.20.1 提供頁面 #vim /var/www/html/index.html <h1>node1.linux.com</h1> #service httpd start server2配置 #ifconfig eth0 192.168.20.12/24 up #route add default gw 192.168.20.1 提供頁面 #vim /var/www/html/index.html <h1>node2.linux.com<h1> #service httpd start
二、 安裝配置haproxy
# yum -y install haproxy 安裝haproxy #vim /etc/haproxy/haproxy.cfg 編輯配置文件自定義一個backend和frontend,註釋原有的內容 frontend websrv *:80 default_backend webservers backend webservers balance roundrobin server node1 192.168.20.11:80 check server node2 192.168.20.12:80 check
三、 客戶端測試
此時說明 haproxy服務器將客戶的請求以roundrobin算法 反向代理給後端的服務器!
四、啓用全局日誌功能
(一)編輯rsyslog.conf #vim /etc/rsyslog.conf 開啓以下行 # Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 # Provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514 添加日誌 local2.* /var/log/haproxy.log #service rsyslog restart 重啓服務 (二)編輯haproxy.cfg # vim /etc/haproxy/haproxy.cfg 開啓以下行 log 127.0.0.1 local2 # service haproxy restart 重啓服務 (三)日誌查看 #tail -f /var/log/haproxy.log
接下來讓咱們來拓展haproxy的功能
5 、調度算法 uri的實現
1)後端服務器 server1 與 server2 同時建立多個頁面 server1 #cd /var/www/html/ # for i in {1..10}; do echo "<h1>node1.test$i</h1>" > test$i.html; done server2 方法同server1 2)更改haproxy.cfg的配置文件中的調度算法 balance uri 3)客戶端測試 # http://172.16.13.2/test1.html
基於172.16.13.2/test1.html 該uri,haproxy服務器反向代理至後臺服務器至同一臺服務器server2
六、基於cookie實現會話綁定
1)編輯haproxy.cfg配置文件 #vim /etc/haproxy/haproxy.cfg 內容以下 frontend websrv bind *:80 default_backend webservers backend webservers cookie node insert nocache balance roundrobin server node1 192.168.20.11:80 check cookie node1 server node2 192.168.20.12:80 check cookie node2 2)客戶端測試 #http://172.16.13.2/test1.html
上圖可見,基於cookie實現了客戶端的請求與後端服務器server2的會話綁定
七、haproxy管理界面---stats enable
#vim /etc/haproxy/haproxy.cfg 增長一個listen段,以下所示 listen statspage bind *:8009 -------偵聽端口 stats enable -------開啓stats stats hide-version -----隱藏版本 stats auth admin:admin ----登陸驗證信息 stats admin if TRUE ----實如今管理界面上對全部backend服務器管理 stats uri /admin?stats ----登陸的uri路徑
八、haproxy動靜分離的實現
1)server2 服務器安裝php #yum -y install php php-mysql 提供php動態頁面 #vim /var/www/html/index.php <h1>node2.linux.com</h1> <?php phpinfo(); ?> 2)從新配置haproxy配置文件 #vim /etc/haproxy/haproxy.cfg 定義frontend 和 backend frontend websrvs bind *:80 acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js .html acl host_static hdr_beg(host) -i img. video. download. ftp. imags. videos. acl url_php path_end -i .php use_backend static if url_static or host_static use_backend dynamic if url_php default_backend dynamic backend static balance roundrobin server node1 192.168.20.11:80 check maxconn 30000 backend dynamic balance roundrobin server node2 192.168.20.12:80 check maxconn 1000 # service haproxy restart 3) 客戶端測試 動靜分離
如圖所示:靜態頁面代理至server1服務器,動態頁面代理至server2 服務器,實現
PS: 我的水平有限,不足之處請指出。關於更多信息請參考haproxy官方網站。