Haproxy 基礎詳解及動靜分離配置
阿新 • • 發佈:2017-12-13
haproxy 動靜分離 haproxy 介紹
1 工作在ISO 七層 根據http協議(或者工作在ISO四層 根據tcp協議) 提供web服務的負載均衡調度器
負載均衡調度器分類 工作在四層: # lvs 工作在七層: # nginx (web,http reverse proxy,cache) # haproxy (http reverse proxy,tcp proxy) # tcp: 實現MySQL的讀寫中讀的負載均衡 # ats (apache traffic server) # perlbal # pound # squid # varnish 以上程序都可以實現服務的向外拓展;
haproxy特性
haproxy 當前版本為1.3 1.4,下面我們介紹1.4版本的特性
# 客戶端側的長連接(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.eu
haproxy 架構圖
haproxy.cfg 配置文件詳解
安裝 # yum inistall haproxy -y 配置文件路徑 /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調整
調度方法的使用總結 #1、調度眾多的MySQL從服務器,用什麽調度方法? leastconn #2、調度web圖片服務器組,用什麽調度方法? roundrobin #3、調度web圖片服務器組,用什麽調度方法? source 或者 cookie #4、調度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 /images /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 動靜分離的實現
架構圖
1、 環境配置
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
2、 安裝配置haproxy
# yum install haproxy -y 安裝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
3、 客戶端測試
此時說明 haproxy服務器將客戶的請求以roundrobin算法 反向代理給後端的服務器!
4、啟用全局日誌功能
(一)編輯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
6、基於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的會話綁定。
7、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路徑
8、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 /images /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 顯示。
Haproxy 基礎詳解及動靜分離配置