文章目錄
- **1. HAProxy 簡介**
- **1.1 什么是 HAProxy?**
- **1.2 核心特性**
- **1.3 關鍵術語**
- **2. 安裝 HAProxy**
- **2.1 在 Ubuntu/Debian 上安裝**
- **2.2 在 CentOS/RHEL/Rocky Linux/AlmaLinux 上安裝**
- **3. 配置與使用**
- **3.1 核心配置文件結構**
- **3.2 基礎配置示例:HTTP負載均衡**
- **3.3 進階配置:基于URL路徑的分流(ACL)**
- **3.4 配置SSL終止**
- **4. 日常操作與監控**
- **4.1 服務管理**
- **4.2 日志**
- **4.3 使用Socket進行運行時管理**
- **5. 故障排除**
1. HAProxy 簡介
1.1 什么是 HAProxy?
HAProxy(High Availability Proxy)是一個開源、高性能的TCP/HTTP 負載均衡器和代理服務器。它被廣泛用于將網絡流量分發到多個后端服務器(如Web服務器、數據庫服務器),以此提高應用程序的可用性、可靠性和可擴展性。
1.2 核心特性
- 高性能: 采用事件驅動、單線程模型(非阻塞I/O),即使在極高并發連接下也能保持極低的資源消耗。
- TCP & HTTP 支持: 既可以在第4層(傳輸層,TCP)進行負載均衡,也可以在第7層(應用層,HTTP)進行更智能的流量分發。
- 健康檢查: 持續監控后端服務器的健康狀況,自動從集群中移除故障服務器,并在其恢復后重新加入。
- 會話保持: 支持多種方式(如Cookie插入)將特定客戶端的請求始終轉發到同一臺后端服務器。
- SSL/TLS 終止: 可以在HAProxy處解密HTTPS流量,然后將明文的HTTP請求轉發給后端服務器,減輕后端服務器的計算壓力。
- 精細的日志記錄: 提供詳細的日志,便于監控和故障排除。
- 動態配置: 支持運行時通過Socket API動態更新部分配置,而無需重啟服務,避免連接中斷。
- 高可用性: 常與Keepalived等工具結合,實現HAProxy自身的主動-被動高可用集群。
1.3 關鍵術語
- 前端(Frontend): 定義HAProxy監聽的IP地址、端口以及如何處理傳入的客戶端請求。
- 后端(Backend): 定義一組接收流量的后端服務器(稱為“Server”或“Backend Server”)以及使用的負載均衡算法。
- 監聽器(Listener): 前端中具體的IP:端口綁定。
- 服務器(Server): 后端集群中一個具體的、提供服務的實例(如
192.168.1.10:8080
)。 - 負載均衡算法: 決定如何選擇后端服務器的規則,常見的有
roundrobin
(輪詢)、leastconn
(最小連接數)、source
(源IP哈希)等。 - ACL(訪問控制列表): 用于對請求進行條件測試(如匹配URL路徑、主機頭),從而做出更智能的轉發決策。
- Stick Table: 用于跟蹤和存儲客戶端會話信息,實現會話保持。
2. 安裝 HAProxy
以下是在主流Linux發行版上的安裝步驟。
2.1 在 Ubuntu/Debian 上安裝
# 1. 更新軟件包列表
sudo apt update# 2. 安裝 HAProxy
sudo apt install -y haproxy# 3. 驗證安裝版本
haproxy -v# 4. 啟動服務并設置為開機自啟 (安裝后默認未啟動)
sudo systemctl enable --now haproxy# 5. 檢查服務狀態
sudo systemctl status haproxy
2.2 在 CentOS/RHEL/Rocky Linux/AlmaLinux 上安裝
對于較老的CentOS/RHEL 7/8,默認倉庫的版本可能較舊。建議啟用EPEL倉庫。
# CentOS/RHEL 7/8/9 (啟用EPEL)
sudo yum install -y epel-release# 或者 Rocky Linux/AlmaLinux 9
sudo dnf install -y epel-release# 安裝 HAProxy
sudo yum install -y haproxy # CentOS 7/8
# 或者
sudo dnf install -y haproxy # CentOS/Rocky/AlmaLinux 9# 啟動并啟用服務
sudo systemctl enable --now haproxy
sudo systemctl status haproxy
注意: 如果需要最新版本,通常需要從官方源碼編譯或使用第三方倉庫(如Software Collections)。
3. 配置與使用
3.1 核心配置文件結構
HAProxy的主配置文件通常是 /etc/haproxy/haproxy.cfg
。它主要分為以下幾個部分:
- global: 全局設置,如進程、安全、性能調優參數。
- defaults: 為后續的
frontend
和backend
塊提供默認值。 - frontend: 定義如何接收客戶端請求。
- backend: 定義將請求轉發到哪些服務器。
- listen: 將
frontend
和backend
功能結合在一起的簡化配置塊。
3.2 基礎配置示例:HTTP負載均衡
讓我們配置一個最簡單的HTTP負載均衡器,將80端口的流量輪詢分發到兩個Web服務器。
-
備份原始配置
sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup
-
編輯配置文件
sudo vim /etc/haproxy/haproxy.cfg
-
清空文件并寫入以下內容
globallog /dev/log local0 # 使用本地syslog的local0設備記錄日志maxconn 4000 # 每個進程的最大連接數user haproxy # 運行進程的用戶和組group haproxydaemon # 以守護進程方式運行defaultsmode http # 默認模式為HTTPlog global # 繼承global中的日志設置option httplog # 記錄詳細的HTTP日志option dontlognull # 不記錄空連接timeout connect 5000ms # 連接后端服務器的超時時間timeout client 50000ms # 客戶端不活動超時時間timeout server 50000ms # 后端服務器響應超時時間# 定義一個前端,監聽80端口 frontend http_frontbind *:80 # 監聽所有IPv4地址的80端口default_backend http_back # 默認將所有流量轉發到‘http_back’后端# 定義后端服務器組 backend http_backbalance roundrobin # 使用輪詢算法server web1 192.168.1.10:80 check # 'check'啟用健康檢查server web2 192.168.1.11:80 check# 可選:狀態監控頁面 listen statsbind *:8404 # 監聽8404端口用于狀態頁面stats uri /haproxy?stats # 訪問狀態頁面的URIstats realm Haproxy\ Statistics # 認證域提示stats auth admin:password # 認證用戶名和密碼stats admin if TRUE # 如果通過認證,允許管理操作(如禁用服務器)
-
語法檢查
HAProxy非常嚴格,配置錯誤會導致啟動失敗。務必在重啟前檢查語法。sudo haproxy -f /etc/haproxy/haproxy.cfg -c
輸出
Configuration file is valid
表示成功。 -
重啟HAProxy服務
sudo systemctl restart haproxy
-
驗證
- 訪問你的服務器IP(
http://your-haproxy-ip
),流量會被分發到web1和web2。 - 訪問狀態頁面(
http://your-haproxy-ip:8404/haproxy?stats
),用配置的用戶名(admin
)和密碼(password
)登錄,查看后端服務器狀態和統計信息。
- 訪問你的服務器IP(
3.3 進階配置:基于URL路徑的分流(ACL)
假設你想將 /api
的請求發送到一組API服務器,其他請求發送到Web服務器。
在 frontend http_front
部分中添加ACL規則:
frontend http_frontbind *:80# 定義一個ACL規則,匹配路徑以/api開頭acl is_api path_beg /api# 如果匹配is_api規則,使用api_back后端use_backend api_back if is_api# 默認使用web_back后端default_backend web_backbackend web_backbalance roundrobinserver web1 192.168.1.10:80 checkserver web2 192.168.1.11:80 checkbackend api_backbalance roundrobinserver api1 192.168.1.20:8080 checkserver api2 192.168.1.21:8080 check
重載配置(不中斷服務)
sudo systemctl reload haproxy
# 或者
sudo haproxy -f /etc/haproxy/haproxy.cfg -sf $(pidof haproxy)
3.4 配置SSL終止
-
將你的SSL證書(PEM格式)合并。 通常需要將證書文件、中間證書和私鑰合并到一個
.pem
文件中。cat yourdomain.crt yourdomain.key > /etc/haproxy/yourdomain.pem chmod 600 /etc/haproxy/yourdomain.pem chown haproxy:haproxy /etc/haproxy/yourdomain.pem
-
修改前端配置
frontend https_frontbind *:443 ssl crt /etc/haproxy/yourdomain.pem# 可選:強制重定向HTTP到HTTPS# redirect scheme https code 301 if !{ ssl_fc }default_backend http_back
4. 日常操作與監控
4.1 服務管理
# 啟動
sudo systemctl start haproxy
# 停止
sudo systemctl stop haproxy
# 重啟 (會中斷連接)
sudo systemctl restart haproxy
# 重載配置 (平滑重啟,不中斷連接)
sudo systemctl reload haproxy
# 查看狀態
sudo systemctl status haproxy
4.2 日志
HAProxy日志默認不輸出到文件。需要配置rsyslog。
- 編輯
/etc/rsyslog.d/99-haproxy.conf
local0.* /var/log/haproxy.log
- 重啟rsyslog和haproxy
sudo systemctl restart rsyslog sudo systemctl restart haproxy
- 查看日志
tail -f /var/log/haproxy.log
4.3 使用Socket進行運行時管理
配置文件中的 stats socket
選項啟用了強大的運行時管理功能。
-
在
global
部分添加:global...stats socket /run/haproxy/admin.sock mode 660 level admin
-
使用
socat
或haproxy-apt
工具管理# 查看幫助 echo "help" | sudo socat stdio /run/haproxy/admin.sock # 禁用后端服務器 echo "disable server http_back/web1" | sudo socat stdio /run/haproxy/admin.sock # 啟用后端服務器 echo "enable server http_back/web1" | sudo socat stdio /run/haproxy/admin.sock # 顯示狀態信息 echo "show info" | sudo socat stdio /run/haproxy/admin.sock echo "show stat" | sudo socat stdio /run/haproxy/admin.sock
5. 故障排除
- 配置文件語法檢查:
sudo haproxy -f /etc/haproxy/haproxy.cfg -c
- 查看系統日志:
journalctl -u haproxy
- 查看HAProxy日志:
tail -f /var/log/haproxy.log
- 檢查端口監聽狀態:
ss -tlnp | grep haproxy
- 檢查防火墻規則:
sudo iptables -L -n
或sudo firewall-cmd --list-all
HAProxy是一個強大而靈活的工具,是構建現代、高可用性應用架構的基石。本SOP提供了從入門到進階的指導。要掌握HAProxy,請務必閱讀其官方文檔(https://www.haproxy.org/),其中包含了所有配置指令的詳細說明和更多高級用例。
安全提示: 在生產環境中,請務必使用強密碼保護狀態頁面,并謹慎管理Socket接口的訪問權限。