HAproxy部署配置 拓撲圖 說明: 一 HAProxy主機配置 1 global部分 用來設定全局配置參數,屬於進程級的配置,通常和操作系統配置有關。 2 default部分 預設參數的配置部分。在次部分配置的參數值,預設會自動引用到下麵frontend、backend、listen部分中,因此 ...
HAproxy部署配置
拓撲圖
說明:
haproxy伺服器IP:172.16.253.200/16 (外網)、192.168.29.140/24(內網)
博客伺服器組IP:192.168.29.130/24、192.168.29.131/24
網站伺服器組IP:192.168.29.120/24、192.168.29.121/24
預設伺服器組IP:192.168.29.110/24、192.168.29.111/24
一 HAProxy主機配置
[root@local ~]# yum install haproxy -y
[root@local ~]# vim /etc/haproxy/haproxy.cfg
1 global部分
用來設定全局配置參數,屬於進程級的配置,通常和操作系統配置有關。
global
log 127.0.0.1 local2 info ##全局日誌配置,local2為日誌設備,info為日誌級別
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid ##指定HAProxy進程的Pid文件,啟動進程的用戶必須有訪問次文件的許可權
maxconn 4000 ##設定每個進程可接受的最大併發連接數
user haproxy ##設置運行haproxy進程的用戶,可使用UID代替
group haproxy ##設置運行haproxy進程的組,可使用GID代替
daemon ##設置haproxy進程進入後臺運行
stats socket /var/lib/haproxy/stats
2 default部分
預設參數的配置部分。在次部分配置的參數值,預設會自動引用到下麵frontend、backend、listen部分中,因此,如果某些參數屬於公共的配置,只需在default部分添加一次即可。而如果在frontend、backend、和listen部分也配置了與default部分一樣的參數,那麼default部分的參數對應的值自動被覆蓋。
defaults
mode http ##設置haproxy實例預設運行模式,有tcp、http、health三個值
log global ##
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3 ##設置後端伺服器的失敗重試次數
timeout http-request 10s ##
timeout queue 1m
timeout connect 5s
timeout client 10s ##設置連接客戶端發送數據時的最長等待時間,預設單位為毫秒
timeout server 10s ##設置伺服器端回應客戶端數據發送的最長等待時間,預設單位為毫秒
timeout http-keep-alive 10s ##持久連接的持久時長
timeout check 2s ##設置對後端伺服器的監測超時時間,預設單位為毫秒
maxconn 3000
3 listen部分
此部分是frontend和backend部分的結合體
listen admin_stats
bind 0.0.0.0:19088 ##設置監控統計頁面的監聽的IP和埠
mode http
log 127.0.0.1 local2 err
stats refresh 30s ##設置哈haproxy監控統計頁面的自動刷新時間
stats uri /haproxy-status ##設置haproxy監控統計頁面的URL路徑,可隨意指定,例如“stats uri /haproxy-status”,就可以通過http://IP:PORT//haproxy-status查看
stats realm welcome login\ Haproxy ##設置登錄haproxy統計頁面是密碼框上的提示信息
stats auth admin:admin ##設置登錄統計頁面的用戶名和密碼,可同時設置多個,每行一個
stats hide-version ##用來隱藏統計頁面上haproxy的版本信息
stats admin if TRUE ##通過設置此選項,可以在監控頁面上手工啟動或者禁用後端伺服器
4 frontend部分
此部分用於設置接收用戶請求的前端虛擬節點。frontend可以根據ACL規則直接指定要使用的後端backend。
(1)frontend部分
frontend www
bind *:80 ##此選項只能在frontend和listen部分使用,用於定義一個或多個監聽的套接字。格式為:bind [<address>:<port_range>] interface <interface>
mode http ##實例的運行模式
option httplog ##啟用日誌記錄http請求。預設haproxy日誌不記錄http請求
option forwardfor ##在由haproxy發往後端主機的請求報文中添加“X-Forwarded-For”首部,其值前端客戶端的地址;用於向後端主發送真實的客戶端IP
option httpclose ##次選項表示在客戶端和伺服器端完成一次連接請求後,haproxy自動關閉此TCP連接
log global ##表示使用全局的日誌級別,引用global部分定義的log配置
(2)通過haproxy的ACL規則實現智能負載均衡
haproxy通過ACL完成兩個主要的功能:
1)通過設置ACL的規則檢查客戶端請求是否合法。如果符合ACL規則要求,那麼將放行,如果不符合規則,則直接中斷請求。
2)符合ACL規則要求的請求將被提交到後端的backend伺服器集群,進而實現基於ACL規則的負載均衡
3)haproxy的ACL規則通常用在frontend部分中
格式為:acl 自定義的acl名稱 acl方法 -i [ 匹配的路徑或文件]
acl:為關鍵字,表示定義ACL規則的開始,後面跟上自定義的ACL名稱。
acl方法:這個欄位定義ACL的方法,haproxy定義了很多ACL方法,常用的有hdr_reg(host)、hdr_dom(host)、hdr_beg(host)、url_sub、url_dir、path_beg、path_end等
-i:表示不區分大小寫,後面跟上要匹配的路徑、文件或正則表達式。
說明:與ACL規則一起使用的haproxy參數還有use_backend,use_backend 後面跟實例名,表示在滿足ACL規則後去哪裡請求哪個backend實例
acl host_www hdr_reg(host) -i ^(www.tb.com|tb.com) ##正則表達式匹配,表示如果開都有www.tb.com或tb.com
acl host_blog hdr_beg(host) -i blog. ##表示如果首碼包含blog.字元,則匹配
use_backend server_www if host_www ##表示如果滿足host_www 則去請求後端的server_www主機
use_backend server_blog if host_blog
default_backend server_default ##表示如果前面都不匹配,則去請求server_default主機
5 backend部分
此部分用於設置後端伺服器集群的配置,也是用來添加一組真實伺服器,以處理客戶端的請求。
backend server_default 定義後端主機,格式為:backend SERVER_NAME
mode http ##實例的運行模式
option redispatch ##次參數用於cookie保持的環境中
option abortonclose ##自動結束當前隊列中處理時間較長的進程
balance roundrobin ##定義負載均衡演算法,roundrobin為加權輪詢演算法
cookie SERVERID ##表示允許向cookie中插入SERVERID
option httpchk GET /check_status.html ##啟用http的服務監測功能,採用GET方式,通過監測check_status,html頁面的狀態來確定伺服器的狀態
server default1 192.168.29.110:80 cookie default1 weight 2 check inter 2000 rise 2 fall 3
server default2 192.168.29.111:80 cookie default2 weight 2 check inter 2000 rise 2 fall 3
定義後端主機,格式為:server <name> <address>[:port] [param*]
param為一系列參數,
cookie為當前server指定其cookie值,用於實現基於cookie的會話黏性
weight 設置後端伺服器的權重,
check表示啟用後端伺服器執行健康狀態監測,
rise設置從故障狀態轉換到正常狀態需要成功檢查的次數,
fall設置後端伺服器從從正常狀態轉換為不可以狀態需要檢查的次數
disabled:標記為不可用;
redir <prefix>:將發往此server的所有GET和HEAD類的請求重定向至指定的URL
backend server_www
mode http
option redispatch
option abortonclose
balance source ##定義負載均衡演算法,source為基於源IP 的演算法,可以使同一客戶端IP的請求始終被轉發至某台特定的後端伺服器
cookie SERVERID
option httpchk GET /check_status.jsp
server www1 192.168.29.120:80 cookie www1 weight 6 check inter 2000 rise 2 fall 3
server www2 192.168.29.121:80 cookie www2 weight 6 check inter 2000 rise 2 fall 3
backend server_blog
mode http
option redispatch
option abortonclose
balance roundrobin
cookie SERVERID
option httpchk GET /check_blog.php
server blog1 192.168.29.130:80 cookie blog1 weight 5 check inter 2000 rise 2 fall 3
server blog2 192.168.29.131:80 cookie blog2 weight 5 check inter 2000 rise 2 fall 3
二 後端伺服器配置
1 預設伺服器配置
(1)虛擬主機配置
[root@local ~]# vim /etc/httpd/conf.d/vhost.conf
<VirtualHost 192.168.29.110:80>
DocumentRoot "/data/web1"
<Directory "/data/web1/">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
(2)狀態監測頁配置
[root@local ~]# echo "This is check_status.page ip:192.168.29.110" > /data/web1/check_status.html
(3)預設頁面配置
[root@local ~]# echo "This is default page ip:192.168.29.110" > /data/web1/index.html
按照以上方式配置192.168.29.111主機
2 網站伺服器配置
(1)虛擬主機配置
[root@local ~]# vim /etc/httpd/conf.d/vhost.conf
<VirtualHost 192.168.29.120:80>
DocumentRoot "/data/web1"
ServerName www.tb.com
<Directory "/data/web1/">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
(2)狀態監測頁配置
[root@local ~]# echo "This is check_status page ip:192.168.29.120" > /data/web1/check_status.jsp
(3)預設頁面配置
[root@local ~]# echo "This is www page ip:192.168.29.120" > /data/web1/index.html
按照以上方式配置192.168.29.121主機
3 博客伺服器組
(1)配置虛擬主機
[root@local ~]# vim /etc/httpd/conf.d/vhost.conf
<VirtualHost 192.168.29.130:80>
DocumentRoot "/data/web1"
ServerName www.blog.tb.com
<Directory "/data/web1/">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
(2)狀態監測頁配置
[root@local ~]# echo "This is check_status page ip:192.168.29.130" > /data/web1/check_blog.php
(3)預設頁面配置
[root@local ~]# echo "This is blog page ip:192.168.29.130" > /data/web1/index.html
按照以上方式配置192.168.29.131主機
三 測試
1 啟動haproxy
[root@local ~]# systemctl start haproxy
2 測試
(1)訪問網站伺服器
[root@local ~]# for i in {1..10} ; do curl www.tb.com ; done
This is www page ip:192.168.29.120
This is www page ip:192.168.29.120
This is www page ip:192.168.29.120
This is www page ip:192.168.29.120
This is www page ip:192.168.29.120
This is www page ip:192.168.29.120
This is www page ip:192.168.29.120
This is www page ip:192.168.29.120
This is www page ip:192.168.29.120
This is www page ip:192.168.29.120
由於有會話粘性,所有都是用一臺伺服器響應請求
(2)訪問blog伺服器
[root@local ~]# for i in {1..10} ; do curl blog.tb.com ; done
This is blog page ip:192.168.29.131
This is blog page ip:192.168.29.130
This is blog page ip:192.168.29.131
This is blog page ip:192.168.29.130
This is blog page ip:192.168.29.131
This is blog page ip:192.168.29.130
This is blog page ip:192.168.29.131
This is blog page ip:192.168.29.130
This is blog page ip:192.168.29.131
This is blog page ip:192.168.29.130
可以看到,輪詢演算法生效了
(3)測試預設伺服器
[root@local ~]# for i in {1..10} ; do curl 172.16.253.200 ; done
This is default page ip:192.168.29.110
This is default page ip:192.168.29.111
This is default page ip:192.168.29.110
This is default page ip:192.168.29.111
This is default page ip:192.168.29.110
This is default page ip:192.168.29.111
This is default page ip:192.168.29.110
This is default page ip:192.168.29.111
This is default page ip:192.168.29.110
This is default page ip:192.168.29.111
成功了
3 haproxy狀態監測頁面
(1)輸入http://172.16.253.200:19088/haproxy-status登錄狀態監測頁
(2)輸入用戶名密碼
(3)登錄成功