HAproxy功能配置

HAporxy簡介

HAProxy 是一款高性能TCP/HTTP 反向代理負載均衡服務器,具有如下功能:

  • 根據(jù)靜態(tài)分配的cookies完成HTTP請求轉(zhuǎn)發(fā)
  • 在多個服務器間實現(xiàn)負載均衡,并且根據(jù)HTTP cookies 實現(xiàn)會話粘性
  • 主備服務器切換
  • 接受訪問特定端口實現(xiàn)服務監(jiān)控
  • 實現(xiàn)平滑關(guān)閉服務,不中斷已建立連接的請求響應,拒絕新的請求
  • 在請求或響應HTTP報文中添加,修改,或刪除首部信息
  • 根據(jù)正則規(guī)則阻斷請求
  • 提供帶有用戶認證機制的服務狀態(tài)報告頁面

HAProxy特別適用于那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在時下的硬件上,完全可以支持數(shù)以萬計的 并發(fā)連接。并且它的運行模式使得它可以很簡單安全的整合進您當前的架構(gòu)中, 同時可以保護你的web服務器不被暴露到網(wǎng)絡上。

HAProxy 實現(xiàn)了一種事件驅(qū)動、單一進程模型,此模型支持非常大的并發(fā)連接數(shù)。多進程或多線程模型受內(nèi)存限制 、系統(tǒng)調(diào)度器限制以及無處不在的鎖限制,很少能處理數(shù)千并發(fā)連接。事件驅(qū)動模型因為在有更好的資源和時間管理的用戶端(User-Space) 實現(xiàn)所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統(tǒng)上,這些程序通常擴展性較差。這就是為什么他們必須進行優(yōu)化以 使每個CPU時間片(Cycle)做更多的工作。

HAProxy實際工作中,它占用用戶空間時間要比內(nèi)核運行時間少20倍,所以對系統(tǒng)參數(shù)調(diào)優(yōu)是十分必要的一項工作。

HAproxy功能配置

環(huán)境

前端HAProxy 172.16.253.108
后端web1    172.16.253.105
后端web2    172.16.252.1
client      172.16.253.177

安裝HAproxy

HAproxy

[root@HAProxy ~]# yum install haproxy -y
[root@HAProxy ~]# rpm -ql haproxy
[root@HAProxy ~]# iptables -F
[root@HAProxy ~]# setenforce 0
[root@HAProxy ~]# systemctl enable haproxy
[root@HAProxy ~]# cp /etc/haproxy/haproxy.cfg{,.bak}
[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg

web1

[root@web1 ~]# yum -y install httpd
[root@web1 ~]# vim /var/www/html/index.html 
<h1> Backend Server 1 </h1>
[root@web1 ~]# cd /var/www/html/
[root@web1 html]# for i in {1..10}; do echo "Test Page $i @BES 1" > test$i.html;done
[root@web1 html]# ls
index.php    test1.html  test3.html  test5.html  test7.html  test9.html
index.html  test10.html  test2.html  test4.html  test6.html  test8.html
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# setenforce 0
[root@web1 ~]# iptables -F

web2

[root@web2 ~]# yum -y install httpd
[root@web2 ~]# vim /var/www/html/index.html 
<h1> Backend Server 2 </h1>
[root@web2 ~]# cd /var/www/html/
[root@web2 html]#  for i in {1..10}; do echo "Test Page $i @BES 1" > test$i.html;done
[root@web2 html]# ls
index.html   test1.html  test3.html  test5.html  test7.html  test9.html
test10.html  test2.html  test4.html  test6.html  test8.html
[root@web2 ~]# service httpd start 
[root@web2 ~]# setenforce 0
[root@web2 ~]# iptables -F

啟用HAproxy的日志功能

HAproxy

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    log  127.0.0.1 local2  \\日志的設備管道為local2,需在rsyslog配置文件中定義local2的日志設備
[root@HAProxy ~]# vim /etc/rsyslog.conf     
    $ModLoad imudp  \\啟用UDP協(xié)議接收日志
    $UDPServerRun 514 \\UDP端口為514
    
    local2.*    /var/log/haproxy.log  \\定義local2日志設備的文件為/var/log/haproxy.log 
[root@HAProxy ~]# systemctl restart rsyslog.service 
  • 重新配置frontend和backend字段

配置HAproxy

roundrobin算法 
[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb  \\定義HAProxy前段主機為myweb
        bind *:80  \\監(jiān)聽主機上所有IP的80端口
        default_backend websrvs \\默認后端主機為websrvs

    backend websrvs \\定義后端主機組
        balance roundrobin  \\調(diào)度算法為動態(tài)輪詢
        server srv1 172.16.253.105:80 check maxconn 3 \\172.16.253.105:80端口為后端主機srv1,check為檢查服務器健康狀態(tài),maxconn 3最大并發(fā)連接數(shù)為3
        server srv2 172.16.252.1:80 check \\定義172.16.252.1為websrv后端主機組中的srv2主機

uri算法
[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb  \\定義HAProxy前段主機為myweb
        bind *:80  \\監(jiān)聽主機上所有IP的80端口
        default_backend websrvs \\默認后端主機為websrvs

    backend websrvs \\定義后端主機組
        balance uri \\調(diào)度算法為uri
        server srv1 172.16.253.105:80 check maxconn 3 \\172.16.253.105:80端口為后端主機srv1,check為檢查服務器健康狀態(tài),maxconn 3最大并發(fā)連接數(shù)為3
        server srv2 172.16.252.1:80 check \\定義172.16.252.1為websrv后端主機組中的srv2主機
        hash-type consistent \\hash算法一致性
        
hdr算法(同一個瀏覽器訪問相同的后端服務器)
[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb 
    frontend myweb
        bind *:80
        default_backend websrvs

    backend websrvs
        balance hdr(User-Agent)
        server srv1 172.16.253.105:80 check
        server srv2 172.16.252.1:80 check
        hash-type consistent

[root@HAProxy ~]# systemctl start haproxy
[root@HAProxy ~]# systemctl enable haproxy
[root@HAProxy ~]# ss -tnl  \\80端口以打開

client

訪問HAProxy代理服務端

roundrobin算法 
[root@client ~]# for i in {1..10};do curl http://172.16.253.108;done
<h1> Backend Server 1 </h1>
<h1> Backend Server 2 </h1>
<h1> Backend Server 1 </h1>
<h1> Backend Server 2 </h1>
<h1> Backend Server 1 </h1>
<h1> Backend Server 2 </h1>
<h1> Backend Server 1 </h1>
<h1> Backend Server 2 </h1>
<h1> Backend Server 1 </h1>
<h1> Backend Server 2 </h1>

uri算法,consistent hash類型
[root@client ~]# for i in {1..10};do curl 172.16.253.108/test1.html;done
Test Page 1 @BES 1
Test Page 1 @BES 1
Test Page 1 @BES 1
Test Page 1 @BES 1
Test Page 1 @BES 1
Test Page 1 @BES 1
Test Page 1 @BES 1
Test Page 1 @BES 1
Test Page 1 @BES 1
Test Page 1 @BES 1
[root@client ~]# for i in {1..10};do curl 172.16.253.108/test3.html;done
Test Page 2 @BES 1
Test Page 2 @BES 1
Test Page 2 @BES 1
Test Page 2 @BES 1
Test Page 1 @BES 1

啟用壓縮功能

HAproxy

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg    
    frontend myweb
        bind *:80
        default_backend websrvs
        compression algo gzip \\啟動壓縮功能,壓縮類型為gzip
        compression type text/html text/plainhtml,  application/xml\\壓縮文件的類型為文本文件,plainhtml純文本文件

    backend websrvs
        balance roundrobin
        server srv1 172.16.253.105:80 check
        server srv2 172.16.252.1:80 check

定義check檢查的時間間隔

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb
        bind *:80
        default_backend websrvs
    backend websrvs
        balance roundrobin
        # option httpchk \\啟用七層代理向主頁發(fā)送請求
        option httpchk GET /test1.html HTTP/1.0 \\啟用七層代理,當使用GET命令,使用HTTP1.0協(xié)議向test1.txt頁面發(fā)送請求時檢查頁面健康狀態(tài)
        server srv1 172.16.253.105:80 check inter 3000ms rise 1 fall 2 \\inter定義為每3s檢查一次,rise為檢查成功一次即為成功,fall為檢查失敗兩次即為故障
        server srv2 172.16.252.1:80 check backup \\backup為備用服務端,當其他主機故障時啟用
        
[root@HAProxy ~]# systemctl restart haproxy

web1

后端主機的httpd訪問日志中可以看到每隔2秒都有一次主頁檢查記錄日志
[root@web2 ~]# tail -f /var/log/httpd/access_log  

實現(xiàn)網(wǎng)頁重定向

HAproxy

訪問172.16.253.105后端主機srv1的網(wǎng)頁將自動跳轉(zhuǎn)到指定的網(wǎng)頁,eg redir http://www.baidu.com 跳轉(zhuǎn)到www.baidu.com
[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb
        bind *:80
        default_backend websrvs
    backend websrvs
        balance roundrobin
        server srv1 172.16.253.105:80 check inter 3000ms rise 1 fall 2 redir http://www.baidu.com \\將訪問172.16.253.105主頁面重定向訪問www.baidu.com 
        server srv2 172.16.252.1:80 check backup

weight權(quán)重選項

HAproxy

root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb
        bind *:80
        default_backend websrvs
    backend websrvs
        balance roundrobin
        server srv1 172.16.253.105:80 check weight 2 \\權(quán)重為2
        server srv2 172.16.252.1:80 check weight 1  \\權(quán)重為1

client

[root@client ~]# for i in {1..10};do curl 172.16.253.108;done           
<h1> Backend Server 1 </h1>
<h1> Backend Server 2 </h1>
<h1> Backend Server 1 </h1>
<h1> Backend Server 1 </h1>
<h1> Backend Server 2 </h1>
<h1> Backend Server 1 </h1>
<h1> Backend Server 1 </h1>
<h1> Backend Server 2 </h1>
<h1> Backend Server 1 </h1>
<h1> Backend Server 1 </h1>

stats狀態(tài)頁面

HAproxy

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb
        stats enable
        bind *:80
        default_backend websrvs

    backend websrvs
        balance roundrobin
        server srv1 172.16.253.105:80 check weight 2
        server srv2 172.16.252.1:80 check weight 1
[root@HAProxy ~]# systemctl restart haproxy.service

瀏覽器訪問http://172.16.253.108/haproxy?stats

  • 自定義stats狀態(tài)頁面的uri路徑

HAproxy

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
frontend myweb
stats enable
stats uri /myproxy?admin
bind *:80
default_backend websrvs

backend websrvs
    balance roundrobin
    server srv1 172.16.253.105:80 check weight 2
    server srv2 172.16.252.1:80 check weight 1
[root@HAProxy ~]# systemctl restart haproxy

瀏覽器訪問http://172.16.253.108/myproxy?admin

  • stats頁面的用戶訪問控制
    HAproxy
[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb
        stats enable  \\啟用stats
        stats uri /myproxy?admin \\自定義stats頁面uri的路徑為/myproxy?admin
        stats realm "HAProxy Stats Page" \\認證提示
        stats auth admin:admin \\stats頁面用戶訪問控制,用戶admin,密碼admin
        bind *:80
        default_backend websrvs

    backend websrvs
        balance roundrobin
        server srv1 172.16.253.105:80 check weight 2
        server srv2 172.16.252.1:80 check weight 1
[root@HAProxy ~]# systemctl restart haproxy   

瀏覽器輸入http://172.16.253.108/myproxy?admin訪問

  • 啟用stats的管理能力
    HAproxy
[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb *:80
        stats enable  \\啟用stats
        stats uri /myproxy?admin \\自定義stats頁面uri的路徑為/myproxy?admin
        stats realm "HAProxy Stats Page" \\認證提示
        stats auth admin:admin \\stats頁面用戶訪問控制,用戶admin,密碼admin
        stats admin if TRUE \\總是允許訪問stats的用戶管理stats頁面
        default_backend websrvs
    backend websrvs
        balance roundrobin
        server srv1 172.16.253.105:80 check weight 2
        server srv2 172.16.252.1:80 check weight 1
[root@HAProxy ~]# systemctl restart haproxy   

瀏覽器訪問http://172.16.253.108/myproxy?admin

  • 單獨定義stats的管理頁面
    HAproxy
[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb
        bind *:80
        default_backend websrvs
    
    backend websrvs
        balance roundrobin
        server srv1 172.16.253.105:80 check weight 2
        server srv2 172.16.252.1:80 check weight 1
    listen stats
        bind *:9000 \\定義stats頁面的監(jiān)聽端口為9000
        stats enable \\開啟stats狀態(tài)界面
        stats uri /myproxy?admin \\自定義stats的uri路徑
        stats realm "HAProxy Stats Page" \\stats頁面的提示信息
        stats auth admin:admin \\ststs狀態(tài)界面的admin用戶認證
        stats admin if TRUE  \\允許所有登錄stats的用戶管理stats界面
        
[root@HAProxy ~]# systemctl restart haproxy   

瀏覽器訪問http://172.16.253.108/myproxy?admin

server 字段   含義
Status          Server的狀態(tài)
LastCHK         顯示httd的是四層檢查還是七層檢查
Wght            權(quán)重
Act             活動主機數(shù)量
Bck             備用主機數(shù)量
Chk             失敗檢測次數(shù)
Dwn             離線主機數(shù)量
Dwntme          主機離線時間

定義HAproxy的工作模式為tcp,實現(xiàn)layer4層代理

HAproxy

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    listen sshsrvs
        mode tcp
        bind *:2222
        balance leastconn
        server sshsrv1 172.16.253.105:22 check
        server sshsrv2 172.16.252.1:22 check
[root@HAProxy ~]# systemctl restart haproxy.service

client

[root@client ~]# ssh root@172.16.253.108 -p 2222

設置cookie

HAproxy

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb *:80
        default_backend websrvs
    backend websrvs
        cookie WEBSRV insert indirect nocache \\WEBSRV為自定義的cookie鍵名
        balance roundrobin
        server srv1 172.16.253.105:80 check weight 2 cookie srv1 \\srv1為自定義的srv1服務器的cookie信息
        server srv2 172.16.252.1:80 check weight 1 cookie srv2 \\srv2為自定義的srv2服務器的cookie信息

client

[root@client ~]# curl -I 172.16.253.108
HTTP/1.1 200 OK
Date: Fri, 26 May 2017 03:30:41 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 25 May 2017 11:26:46 GMT
ETag: "40801-1c-550577f03843e"
Accept-Ranges: bytes
Content-Length: 28
Content-Type: text/html; charset=UTF-8
Set-Cookie: WEBSRV=srv2; path=/  \\Cookie信息為WEBSRV=srv2
Cache-control: private

[root@client ~]# curl -I 172.16.253.108/test3.html
HTTP/1.1 200 OK
Date: Tue, 29 Aug 2017 04:41:00 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Last-Modified: Mon, 28 Aug 2017 14:02:09 GMT
ETag: "13-557d0bda20453"
Accept-Ranges: bytes
Content-Length: 19
Content-Type: text/html; charset=UTF-8
Set-Cookie: WEBSRV=srv1; path=/  \\Cookie信息為WEBSRV=srv1
Cache-control: private

forwardfor請求報文首部信息

HAproxy

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    defaults
        option forwardfor       except 127.0.0.0/8 if-none  
            除了本機127.0.0.0/8發(fā)出去的請求報文不予添加X-Forwarded-For信息,其他報文都要判斷是否含有X-Forwarded-For信息,若沒有,則添加X-Forwarded-For信息

web1

[root@web1 ~]# vim /etc/httpd/conf/httpd.conf  \\修改日志記錄格式如下
    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[root@web1 ~]# systemctl restart rsyslog

errorfile錯誤本地文件路徑

HAproxy

[root@HAProxy ~]# mkdir /etc/haproxy/errorfile
[root@HAProxy ~]# vim /etc/haproxy/errorfile/403.html
    Forbidden,No way;

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb *:80
        default_backend websrvs

    backend websrvs
        errorfile 403 /etc/haproxy/errorfile/403.html
        balance roundrobin
        server srv1 172.16.253.105:80 check weight 2 cookie srv1
        server srv2 172.16.252.1:80 check weight 1 cookie srv2

errorloc錯誤網(wǎng)頁url重定向到本地的web

HAproxy服務端安裝nginx服務

[root@HAProxy ~]# yum -y install nginx
[root@HAProxy ~]# vim /etc/nginx/conf.d/errserver.conf
    server {
        listen 10080;
        server_name error.danran.com;
        root /data/nginx/errorhtml;
    }
[[root@HAProxy ~]# mkdir -pv /data/nginx/errorhtml
[root@HAProxy ~]# vim /data/nginx/errorhtml/403.html
    403 from nginx

[root@HAProxy ~]# vim /etc/nginx/nginx.conf  
    server {
        listen       8089 default_server;
    } \\默認80端口與HAYproxy沖突,故修改nginx的默認端口
[root@HAProxy ~]# systemctl start nginx 

配置error錯誤網(wǎng)頁重定向到本地web服務

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb *:80
        default_backend websrvs

    backend websrvs
        errorloc 403 http://172.16.253.108:10080/403.html
        balance roundrobin
        server srv1 172.16.253.105:80 check weight 2 cookie srv1
        server srv2 172.16.252.1:80 check weight 1 cookie srv2
[root@HAProxy ~]# systemctl restart haproxy

reqadd添加請求報文首部信息

HAproxy

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb *:80
        default_backend websrvs
    backend websrvs
        reqadd X-Proxy-By:\ HAProxy
        balance roundrobin
        server srv1 172.16.253.105:80 check weight 2 
        server srv2 172.16.252.1:80 check weight 1
[root@HAProxy ~]# systemctl restart haproxy

web1

[root@web1 ~]# vim /etc/httpd/conf/httpd.conf
    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Proxy-By}i" combined
[root@web1 ~]# systemctl restart rsyslog 

通過訪問HAYproxy代理服務器查看web1的訪問日志信息

reqadd添加響應報文首部信息

HAproxy

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb *:80
        default_backend websrvs
    backend websrvs
        rsqadd X-Proxy-By:\ HAProxy-1.5
        balance roundrobin
        server srv1 172.16.253.105:80 check weight 2 
        server srv2 172.16.252.1:80 check weight 1
[root@HAProxy ~]# systemctl restart haproxy

reqdel刪除響應報文的指定信息

HAproxy

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
    frontend myweb *:80
        default_backend websrvs
    backend websrvs
        rspidel ^Server:.* \\刪除響應報文中Server開頭的信息
        balance roundrobin
        server srv1 172.16.253.105:80 check weight 2 
        server srv2 172.16.252.1:80 check weight 1
[root@HAProxy ~]# systemctl restart haproxy
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 互聯(lián)網(wǎng)架構(gòu)基礎(chǔ)知識 一、網(wǎng)站常見架構(gòu) 負載層 頁面緩存層 web層 數(shù)據(jù)層 二、運維法則 緩存為王 盡量在前端(緩...
    魏鎮(zhèn)坪閱讀 4,856評論 0 9
  • 參考文檔: 1.haproxy:http://www.haproxy.org/ 本文涉及haproxy的安裝,并做...
    Netonline閱讀 2,448評論 1 51
  • 一.HAProxy介紹 HAProxy: 是法國人Willy Tarreau開發(fā)的一個開源軟件,是 一款應對客戶端...
    楠人幫閱讀 1,142評論 0 2
  • 本文索引 1 概述 2 HAProxy功能 3 HAProxy組成 4 相關(guān)配置 4.1 global配置 4.2...
    ghbsunny閱讀 5,004評論 0 2
  • HAProxy簡介HAProxy配置ACL配置TCP轉(zhuǎn)發(fā)SSL轉(zhuǎn)發(fā) 一、HAProxy簡介: (一)HAProxy...
    哈嘍別樣閱讀 1,574評論 0 0