- haproxy配置文檔https://cbonte.github.io/haproxy-dconv/
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