HAPorxy簡介
HAProxy(High Availability Proxy)是一款高性能、開源的負載均衡器與反向代理服務器,主要用于 TCP 和 HTTP 協議的流量分發,廣泛應用于高并發、高可用的網絡架構中
核心特性
超高性能與低資源消耗
????????基于單進程、多線程模型,處理并發連接能力極強,單實例可輕松支撐數萬并發請求
靈活的負載均衡策略
? ? ? ? 支持多種算法如:輪詢、加權輪詢、源地址哈希、最少鏈接
強大的健康檢查與高可用
????????內置多層健康檢查機制(TCP 層、HTTP 層),可定期檢測后端服務器狀態(如端口是否存活、HTTP 響應碼是否正常)
精細化的流量控制與安全防護
????????可設置連接限速、請求限流,防止后端服務器被流量沖擊
????????支持 ACL(訪問控制列表),基于 IP、請求方法、URL 等條件過濾惡意請求(如攔截爬蟲、限制特定 IP 訪問)
????????集成 SSL/TLS 終止功能,可在負載均衡層處理 HTTPS 加密解密,減輕后端服務器負擔
HAProxy的安裝和服務信息
安裝軟件包
dnf install haproxy -y
haproxy基本信息:
軟件安裝包 | haproxy-2.4.22-3.el9_3.x86_64.rpm |
啟動文件 | /lib/systemd/system/haproxy.service |
主配置目錄 | /etc/haproxy/ |
主配置文件 | /etc/haproxy/haproxy.cfg |
子配置目錄 | /etc/haproxy/conf.d |
haproxy的基本配置信息
global配置
參數說明:
log?? | 定義全局的syslog服務器;日志服務器需要開啟UDP協議,最多可以定義兩個 |
chroot?? | 鎖定運行目錄 |
pidfile? ? | 指定pid文件 |
maxconn | 指定最大連接數 |
user | 指定haproxy的運行用戶 |
group | 指定haproxy的運行組 |
daemon | 指定haproxy以守護進程方式運行 |
# turn on stats unix socket(在此處可以指定進程數量或者線程數量,多線程和多進程只可以指定一個,不可指定多個)
stats socket | 指定haproxy的套接字文件 |
nbproc | 指定haproxy的work進程數量,默認是1個 |
cpu-map 1 0 | 指定第一個work綁定第一個cpu核心 |
cpu-map 2 1 | 指定第二個work綁定第二個cpu核心 |
nbthread 2 | 指定haproxy的線程數量,默認每個進程一個線程 |
# utilize system-wide crypto-policies
ssl-default-bind-ciphers PROFILE=SYSTEM | 設置 HAProxy 監聽套接字(即接受客戶端連接的端口)的默認加密套件 |
ssl-default-server-ciphers PROFILE=SYSTEM | 設置 HAProxy 與后端服務器建立 SSL/TLS 連接時使用的加密套件 |
proxies配置
defaults | 默認配置項,針對以下的frontend、backend和listen生效 |
frontend | 前端servername,類似于Nginx的一個虛擬主機 server和LVS服務集 群 |
backend | 后端服務器組,類似于nginx的upstream和LVS中的RS服務器 |
listen | 將frontend和backend合并在一起配置 |
defaults配置
| 指定 HAProxy 處理HTTP 協議的流量 |
| 繼承?global ?段定義的日志配置 |
| 記錄完整的 HTTP 日志 |
| 忽略 “空請求” 或 “無意義請求” 的日志 |
| 主動關閉服務器側的連接 |
| 在請求頭中插入?X-Forwarded-For (記錄客戶端真實 IP),但排除 127.0.0.0/8(本地回環地址) |
| 當后端服務器故障時,自動將請求重新分發到其他健康服務器 |
| 請求失敗時,最多重試3 次 |
timeout http-request 10s | 客戶端發送完整 HTTP 請求的超時(10 秒內未發完請求,直接斷開) |
timeout queue 1m | 請求在 HAProxy 隊列中等待的超時(1 分鐘未分配到后端,返回 503) |
timeout connect 10s | HAProxy 與后端服務器建立連接的超時(10 秒未連接成功,判定后端故障) |
timeout client 1m | 客戶端與 HAProxy 保持連接的超時(1 分鐘無數據交互,斷開客戶端連接) |
timeout server 1m | HAProxy 與后端服務器保持連接的超時(1 分鐘無數據交互,斷開后端連接) |
timeout http-keep-alive 10s | HTTP Keep-Alive 連接的空閑超時(10 秒無新請求,關閉連接) |
timeout check 10s | 健康檢查的超時(10 秒未收到后端響應,判定服務器故障) |
| HAProxy 對后端服務器的最大并發連接數限制? |
HAProxy算法
所有算法在主配置文件配置/etc/haproxy/haproxy.cfg
vim /etc/haproxy/haproxy.cfg ---編輯配置文件
靜態算法
static-rr---基于權重的輪詢調度
statick-rr?按照預先配置的順序和權重,將客戶端請求依次分配給后端服務器。當所有服務器都被分配一次后,算法會從頭開始循環
配置文件
訪問效果
first
first算法會按照服務器在配置文件中定義的順序,依次檢查每個服務器的狀態,優先選擇第一個可用的服務器,只有當服務器不可用時才會將流量分配至下一個服務器
配置文件內容:
實驗效果:
動態算法
roundrobin
roundrobin是一種經典且常用的動態負載均衡算法,其核心思想是按照順序循環的方式將請求分配到后端服務器,通過均衡分配流量來充分利用集群資源,會實時根據服務器的健康狀態調整分配策略(例如自動排除故障服務器)可利用socat動態調整權重
配置文件:
實驗效果:
leastconn
leastconn是一種基于后端服務器當前連接負載分配請求的動態負載均衡算法,核心思想是將新請求分配給當前活躍連接數最少的服務器,從而實現更精細化的負載均衡
支持權重的運行時調整和慢啟動,即:根據當前連接最少的后端服務器而非權重進行優先調度(新客戶 端連接)? 慢啟動是指當一臺服務器上線被檢測到后 haproxy服務器會少量的分配流量慢慢增大
配置文件:
實驗效果:
其他算法
source
source是一種通過客戶端源 IP 地址實現會話保持的經典策略。其核心邏輯是:對客戶端的源 IP 地址進行哈希計算,將結果映射到后端服務器集群中的某臺服務器,從而確保來自同一源 IP 的請求始終被轉發到同一臺后端服務器
配置文件:
實驗效果:
map-base 取模法
先對source地址進行hash計算,再基于服務器總權重的取模,最終結果決定將此請 求轉發至對應的后端服務器,如:有三臺后端服務器(索引分別0、1、2)若客戶的ip地址哈希值為5,則5%3=2 分配到索引為2的服務器 此方法是靜態的不支持動態調整權重且當有一臺服務器下線時會導致多臺客戶主機被調度的服務器發生改變,會導致會話丟失
一致性hash
一致性哈希算法可以解決map-base取模法的多個會話丟失的問題能夠確保當后端服務器數量發生變化時,只有少量請求會被重新路由,從而提高系統穩定性,其原理是將后端服務器的ip取模制成一個哈希環,再將客戶端的ip取模落在后端服務器哈希環上,客戶端在哈希環上經過逆時針找最近的后端服務器,這樣即使有服務器上線或者下線了也只會有少量的會話丟失
一致性哈希問題:當服務器過少時會導致服務器分布不理想,可通過虛擬節點使其分布均勻
uri
path
基于對用戶請求的URI的左半部分或整個uri做hash,再將hash結果對總權重進行取模后 根據最終結果將請求轉發到后端指定服務器 對/path;params進行哈希 相同的uri訪問同一臺后端服務器
配置文件:
后端服務器需要有對應文件進行測試測試結果:
url_param
url_param對用戶請求的url中的 params 部分中的一個參數key對應的value值作hash計算,并由服務器 總權重相除以后派發至某挑出的服務器,后端搜索同一個數據會被調度到同一個服務器
配置文件
測試結果
hdr取模法
基于請求頭(HTTP header,通過hdr
指令獲取 )中的特定信息進行哈希取模運算,從而決定將請求轉發到哪一臺后端服務器
配置文件:
測試效果:
HAProxy的高級功能及配置
基于cookie值的會話保持
基于 Cookie 值的會話保持(也稱為 "粘性會話")是一種常用的負載均衡策略,確保來自同一客戶端的請求始終被路由到同一后端服務器,從而維護會話狀態的一致性。這種機制特別適用于不支持分布式會話的應用程序
配置文件:
測試結果:
HAProxy狀態頁
通過web界面,顯示當前HAProxy的運行狀態
狀態頁配置參數:
stats enable | 基于默認的參數啟用stats page |
stats hide-version | 將狀態頁中haproxy版本隱藏 |
stats refresh? | 設定自動刷新時間間隔,默認不自動刷新 |
stats uri | 自定義stats page uri,默認值:/haproxy?stats |
stats auth | 認證時的賬號和密碼,可定義多個用戶,每行指定一個用戶 |
狀態頁配置文件:
狀態頁內容
狀態頁參數
session rate(每秒的連接會話信息):
cur:每秒的當前會話數量 :
max:每秒新的最大會話數量
limit:每秒新的會話限制量
sessions(會話信息):
cur:當前會話量
max:最大會話量
limit: 限制會話量
Total:總共會話量
LBTot:選中一臺服務器所用的總時間
Last:和服務器的持續連接時間
Wght:權重
Bytes(流量統計):
In:網絡的字節輸入總量
Out:網絡的字節輸出總量
Dwn:后端服務器連接后都是DOWN的數量
Denied(拒絕統計信息):
Req:拒絕請求量
Resp:拒絕回復量
Errors(錯誤統計信息):
Req:錯誤請求量
conn:錯誤鏈接量
Resp:錯誤響應量
Warnings(警告統計信息):
Retr:重新嘗試次數
Redis:再次發送次數
Server(real server信息):
Status:后端機的狀態,包括UP和DOWN
LastChk:持續檢查后端服務器的時間
Act:活動鏈接數量
Bck:備份的服務器數量
Chk:心跳檢測時間
Dwntme:總的downtime時間
Thrtle:server 狀態
IP透傳
四層IP透傳
hapeoxy配置文件:
后端服務器nginx配置文件
實驗效果:
訪問后查看日志
七層IP透傳使用http默認是開啟的
ACL
訪問控制列表ACL,是一種基于包過濾的訪問控制技術,它可以根據設定的條件對經過服務器傳輸的數據包進行過濾(條件匹配)即對接收到的報文進行匹配和過 濾,基于請求報文頭部中的源地址、源端口、目標地址、目標端口、請求方法、URL、文件后綴等信息內容進行匹配并執行進一步操作
ACL匹配規范
hdr_beg(<name>[, <occ>])? ?---匹配請求頭中指定字段值的開頭部分
hdr_end(<name>[, <occ>])??---匹配請求頭中指定字段值的結尾部分
hdr_dom(<name>[, <occ>]) ---域名部分匹配(帶子域名),主要用于 host
hdr_dir(<name>[, <occ>])?---路徑匹配(針對 URI)
hdr_len(<name>[, <occ>]) ---匹配請求頭字段值的長度
hdr_reg(<name>[, <occ>]) ---正則表達式匹配,自定義表達式(regex)模糊匹配
hdr_sub(<name>[, <occ>]) ---子串匹配,即字段值中包含某個子字符串即可
ACL匹配規則? ? ? ??
-i | 不區分大小寫 |
-m | 使用指定的正則表達式匹配方法 |
-n | 不做DNS解析 |
-u | 禁止acl重名,否則多個同名ACL匹配或關系 |
ACL操作符
整數比較
???????? eq(等于) ge(大于等于) gt(大于) le(小于等于) lt(小于)
字符比較
exact match | 完全一致才匹配 |
substring?match | 包含子串就匹配 |
suffix??match? | 結尾一致才匹配 |
prefix match | 開頭一致才匹配 |
subdir match | 按?/ ?分割,任意段匹配 |
domain match | 按?. ?分割,任意段匹配 |
ACL示例實驗
基于域名匹配
haproxy配置文件:
實驗效果
基于源IP或子網調度訪問
haproxy配置文件:
實驗效果:
基于源地址的訪問控制
haproxy配置文件:
實驗效果:
基于瀏覽器類型
實驗效果
HAProxy四層負載
針對除HTTP以外的TCP協議應用服務訪問的應用場景
對MySQL四層負載示例:
在后端服務器下載mariadb-server
編輯配置文件(修改數據庫id為了觀察實驗效果)
haproxy配置文件:
實驗結果:
自定義錯誤頁面
可以指定錯誤時跳轉頁面
配置文件內容:
錯誤頁面文件內容將后端服務器關閉模擬錯誤
實驗效果: