引言
HAProxy(High Availability Proxy)是一款高性能的TCP/HTTP負載均衡器和代理服務器,廣泛用于構建高可用、可擴展的Web架構。它由法國開發者Willy Tarreau于2000年開發,如今已成為開源社區和企業級應用中不可或缺的工具。HAProxy以其卓越的性能、靈活性和豐富的功能,被用于處理數百萬并發連接的場景,例如大型網站、API網關、微服務架構等。
本文將通過一個完整的實驗,帶你一步步在RHEL 9系統上搭建HAProxy負載均衡環境,并深入探索其核心功能,包括七層和四層負載均衡、健康檢查、訪問控制、HTTPS配置、動態權重調整等。
HAProxy 簡介
1. HAProxy 是什么?
HAProxy 是一個開源的高性能 TCP/HTTP 負載均衡器,主要用于分發網絡流量到多個后端服務器。它支持基于 HTTP 和 TCP 協議的負載均衡,能夠實現高可用性、會話保持、動態權重調整、健康檢查等功能。HAProxy 的設計目標是提供一個可靠且高效的解決方案,以應對高并發、高流量的業務需求。
2. HAProxy 的核心特性
高性能:支持數萬甚至數十萬的并發連接。
靈活的負載均衡算法:支持輪詢(Round Robin)、最少連接(LeastConn)、源地址哈希(Source Hash)、一致性哈希(Consistent Hash)等。
健康檢查:自動檢測后端服務器的健康狀態,故障時自動切換。
會話保持:通過 Cookie 或源地址哈希實現會話粘性。
SSL/TLS 支持:支持 HTTPS 協議,提供加密通信。
動態配置:通過?
socat
?工具實現運行時動態調整后端服務器權重或狀態。狀態監控:提供 Web 狀態頁面,實時查看負載均衡器的運行狀態。
3. HAProxy 的應用場景
Web 服務負載均衡:將流量分發到多個 Web 服務器,提高并發處理能力。
數據庫負載均衡:分發數據庫請求到多個 MySQL 或 PostgreSQL 實例。
API 網關:作為 API 請求的入口,實現流量控制、路由和安全策略。
微服務架構:在微服務中實現服務發現和負載均衡。
高可用架構:通過健康檢查和故障轉移,確保服務的持續可用性。
實驗環境準備
1.機器角色分配:
HAProxy服務器(172.25.254.100)
后端服務器1(RS1)
后端服務器2(RS2)
客戶端:172.25.254.103
2.所有機器基礎配置
配置靜態IP(根據上述分配)。
關閉防火墻(臨時測試用,生產需配置規則)
關閉SELinxu
第一步:安裝HAProxy和依賴
在HAProxy服務器(172.25.254.100)上執行:
1.安裝HAProxy:
dnf install haproxy -y
2.啟動并啟用HAProxy服務:
systemctl start haproxy
systemctl enable haproxy
第三步:?配置HAProxy負載均衡
在HAProxy服務器(172.25.254.100)上執行:
1.編輯HAProxy配置文件:
vim /etc/haproxy/haproxy.cfg
?2.配置內容
3.驗證配置文件語法:
haproxy -c -f /etc/haproxy/haproxy.cfg-c:表示 "check"(檢查)模式,僅驗證配置文件的語法合法性,不會啟動 HAProxy 服務
-f /etc/haproxy/haproxy.cfg:指定要檢查的配置文件路徑(這里是默認的配置文件路徑)
?如果提示 Configuration file is valid
,則配置正確。
4.重啟HAProxy服務
systemctl restart haproxy
第四步:測試負載均衡
在客戶端(192.168.0.103)上執行:
1.多次訪問HAProxy服務器(172.25.254.100):
for i in {1..10}; do curl http://172.25.254.100; sleep 0.5; done
輸出應交替顯示RS和RS2,說明負載均衡生效。
第五步:配置健康檢查
修改HAProxy配置文件:
1.編輯配置文件:
vim /etc/haproxy/haproxy.cfg
2.修改backend webcluster
部分,添加健康檢查:
backend webclusterbalance roundrobinserver web1 192.168.0.101:80 checkserver web2 192.168.0.102:80 check
3.重啟HAProxy:
systemctl restart haproxy
4.測試健康檢查:
在RS1上停止Nginx服務:
systemctl stop nginx
再次運行客戶端測試命令:
for i in {1..10}; do curl http://172.25.254.100; sleep 0.5; done
所有請求應只返回RS2 server - 192.168.0.102。
第六步:配置訪問控制(ACL)
修改HAProxy配置文件:
1.編輯配置文件:
vim /etc/haproxy/haproxy.cfg
2.添加以下內容到defaults
段之后:
frontend webserverbind *:80acl block_curl hdr_sub(User-Agent) -i curlhttp-request deny if block_curldefault_backend webcluster
這將阻止使用curl
工具的訪問。
3.重啟HAProxy:
systemctl restart haproxy
4.測試ACL:
?使用curl訪問會失敗:curl http://172.25.254.100
?返回403 Forbidden。
將curl的請求頭偽裝為Firefox 128.0 瀏覽器,繞過基于User-Agent的攔截規則。
第七步:配置HTTPS
1.生成自簽名證書:
1.1在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
1.2合并證書和私鑰:
cat /etc/haproxy/certs/haproxy.key /etc/haproxy/certs/haproxy.crt > /etc/haproxy/certs/haproxy.pem
2.修改HAProxy配置文件:
2.1編輯配置文件:
vim /etc/haproxy/haproxy.cfg
2.2添加以下配置:
3.重啟HAProxy:
systemctl restart haproxy
4.測試
4.1HTTP請求測試:
HAproxy的80端口(HTTP)監聽正常,觸發了配置中的redirect scheme https code 301
規則。重定向邏輯正確,將 HTTP 請求強制導向 HTTPS 地址,符合預期。
4.2HTTPS請求測試:
HAProxy 的 443 端口(HTTPS)監聽正常,SSL 證書配置有效(-k
參數跳過證書驗證,適合測試環境)。
請求已成功轉發到后端的 Nginx 服務器(172.25.254.101
或172.25.254.102
),后端服務器正常響應。
第八步:配置狀態頁
1.編輯配置文件:
vim /etc/haproxy/haproxy.cfg
2.在defaults
段之后添加狀態頁配置:
listen statsbind *:8888mode httpstats enablestats uri /haproxy-statusstats auth admin:admin123stats hide-versionstats refresh 2s
3.重啟HAProxy:
systemctl restart haproxy
?4.訪問狀態頁:
瀏覽器訪問
http://172.25.254.100:8888/haproxy-status
。用戶名:
admin
,密碼:admin123
。
第九步:動態調整后端服務器權重
通過 HAProxy 的 Unix 套接字(socket) 動態管理后端服務器(webcluster
組中的 web1
),無需重啟 HAProxy 服務。
使用socat
工具:
1.安裝socat
:
dnf install socat -y
2.修改HAProxy配置文件
授予socket管理員權限。(未修改前無法使用set weight
,是因為 HAProxy 默認對統計 socket 僅開放讀取權限,限制了寫入操作)
3.設置權重
# 查看 web1 權重
[root@haproxy ~]# echo "get weight webcluster/web1" | socat stdio /var/lib/haproxy/stats
1 (initial 1)
# 查看 web2 權重
[root@haproxy ~]# echo "get weight webcluster/web2" | socat stdio /var/lib/haproxy/stats
1 (initial 1)
# 設置 web2 權重
[root@haproxy ~]# echo "set weight webcluster/web2 2" | socat stdio /var/lib/haproxy/stats
# 驗證 web2 權重
[root@haproxy ~]# echo "get weight webcluster/web2" | socat stdio /var/lib/haproxy/stats
2 (initial 1)
4.測試驗證
5.禁用/啟用后端服務器
# 禁用后端服務器 web1
echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
# # 啟用后端服務器 web1
echo "enable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
第十步:配置四層負載均衡(TCP)
1.編輯配置文件:
vim /etc/haproxy/haproxy.cfg
2.添加以下內容:
listen mysql_portbind *:3306 # 監聽所有IP的3306端口mode tcp ? # MySQL基于TCP協議balance leastconn ? # 最少連接數算法,適合數據庫負載均衡server mysql1 172.25.254.101:3306 check inter 3s fall 3 rise 5 weight 2 # 后端服務器1,啟動健康檢查server mysql2 172.25.254.102:3306 check inter 3s fall 3 rise 5 weight 1 # 后端服務器2,啟用健康檢查
3.重啟HAProxy:
systemctl restart haproxy
4.安裝并啟動mariadb: ?
在RS1和RS2上安裝MySQL(或MariaDB)并配置監聽3306端口。
# 兩臺機器都執行
dnf install mariadb-server -y # 安裝
systemctl start mariadb # 啟動
systemctl enable mariadb # 開機自啟
5.配置數據庫區分標識(方便驗證負載均衡)
# (rs1):設置server-id=101
vim /etc/my.cnf
[mysqld]
server-id=101 # 唯一標識,區分不同服務器#(rs2):設置server-id=102
vim /etc/my.cnf
[mysqld]
server-id=102# 重啟數據庫使配置生效
systemctl restart mariadb
?6.授權數據庫訪問(允許 HAProxy 轉發的客戶端連接)
# rs1和rs2都執行,授權用戶admin(密碼admin)從任何IP訪問數據庫
mysql -e "grant all on *.* to 'admin'@'%' identified by 'admin';"
mysql -e "flush privileges;" # 刷新權限
7.在Clinet上安裝 MySQL 客戶端(用于連接測試)
dnf install mariadb -y
8.在Client上測試 多次連接 HAProxy,查看分配結果
# 連接HAProxy服務器(IP為172.25.254.100),查詢服務器標識
mysql -uadmin -padmin -h 172.25.254.100 -e "show variables like 'hostname'" # 查看主機名
mysql -uladmin -padmin -h 172.25.254.100 -e "select @@server_id" # 查看server-id
負載均衡配置已經成功生效:
多次訪問
172.25.254.100
(HAProxy 節點)時,請求被交替分發到后端的 101(server_id=101
,主機名rs1
)和 102(server_id=102
,主機名rs2
)。admin
用戶的權限配置正確,能夠正常連接并執行查詢命令(如show variables
和select @@server_id
)。結合之前的 HAProxy 配置(
balance leastconn
),這種交替返回的結果符合 “最少連接數” 負載均衡策略的預期(在連接數相近時會交替分配)。
總結
HAProxy 作為一款高性能、功能豐富的開源負載均衡器,是構建高可用架構的核心組件。通過本次實驗,我們不僅掌握了其基礎配置,還深入實踐了動態管理、安全策略和四層負載均衡等高級功能。HAProxy 的靈活性和穩定性使其成為企業級應用的理想選擇,未來可通過持續學習其高級特性(如 ACL 規則優化、SSL 終止加速等)進一步提升技能水平。