一、HAProxy簡介
Haproxy 是一個使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及==基于TCP和HTTP==的應用程序代理。
haproxy優點
1. Haproxy支持兩種代理模式 TCP(四層)和HTTP(七層),也是支持虛擬主機的。
2. Haproxy的優點能夠補充Nginx的一些缺點,比如支持Session的保持,Cookie的引導;同時支持通過獲取指定的url來檢測后端服務器的狀態。
3. Haproxy跟LVS類似,本身就只是一款負載均衡軟件;單純從效率上來講Haproxy會比Nginx有更出色的負載均衡速度,在并發處理上也是優于Nginx的。
4. Haproxy支持TCP協議的負載均衡轉發,可以對MySQL讀進行負載均衡,對后端的MySQL節點進行檢測和負載均衡,大家可以用LVS+Keepalived對MySQL主從做負載均衡。
5. HAProxy負載均衡策略非常多:Round-robin(輪循)、Weight-round-robin(帶權輪循)、source(原地址保持)、RI(請求URL)、rdp-cookie(根據cookie)。
二、實驗配置
1.安裝Haproxy,并啟用????????
dnf install haproxy -y
systemctl start haproxy
systemctl enable haproxy
2.配置服務器配置文件/etc/haproxy/haproxy.cfg
3.關閉防火墻、核心防護
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
4.重啟Haproxy,測試負載均衡
5.配置健康檢查
6.重啟并測試
for i in {1..10}; do curl http://172.25.254.100; sleep 0.5; done
7.配置ACL訪問控制
frontend webserver
bind *:80
acl block_curl hdr_sub(User-Agent) -i curl
http-request deny if block_curl
default_backend webcluster
8.重啟并測試
將curl的請求頭偽裝為Firefox 128.0 瀏覽器,繞過基于User-Agent的攔截規則。
9.配置https
1)生成自簽名證書;? ? ? ? 2)合并證書和私鑰;? ? ? ? 3)修改HAProxy配置文件
mkdir /etc/haproxy/certs
openssl req -newkey rsa:2048 -nodes -keyout /etc/haproxy/certs/haproxy.key -x509 -days 365 -out /etc/haproxy/certs/haproxy.crt
cat /etc/haproxy/certs/haproxy.key /etc/haproxy/certs/haproxy.crt > /etc/haproxy/certs/haproxy.pem
4)重啟并測試
10.配置網站狀態頁
重啟并訪問
11.動態調整后端服務器權重
1)安裝socat? ? ? ? 2)修改HAProxy配置文件? ? ? ? 3)設置權重
dnf install socat -y
[root@haproxy ~]# echo "get weight webcluster/web1" | socat stdio /var/lib/haproxy/stats
1 (initial 1)
[root@haproxy ~]# echo "get weight webcluster/web2" | socat stdio /var/lib/haproxy/stats
1 (initial 1)
[root@haproxy ~]# echo "set weight webcluster/web2 2" | socat stdio /var/lib/haproxy/stats
[root@haproxy ~]# echo "get weight webcluster/web2" | socat stdio /var/lib/haproxy/stats
2 (initial 1)
4)重啟并測試
12.配置四層負載均衡
1)修改HAProxy配置文件
2)安裝并啟動mariadb
dnf install mariadb-server -y ?# 安裝
systemctl start mariadb ? ? ? ?# 啟動
systemctl enable mariadb ? ? ? # 開機自啟
3)配置數據庫區分標識
vim /etc/my.cnf
[mysqld]
server-id=101 ?# 唯一標識,區分不同服務器
vim /etc/my.cnf
[mysqld]
server-id=102
systemctl restart mariadb
4)授權數據庫訪問
mysql -e "grant all on *.* to 'admin'@'%' identified by 'admin';"
mysql -e "flush privileges;" ?# 刷新權限
負載均衡生效