HAProxy簡介及常用配置文件詳解
HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。
HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的並發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。
HAProxy安裝
HAProxy的rpm包在BASE源中有,可在CentOS系統中直接使用 #yum install -y haproxy 升級安裝。也可以自行下載源碼包編譯安裝。
HAProxy優點
2) 最高可以同時維護40000--50000個並發連接,單位時間內處理的最大請求數為20000個,最大數據處理能力可達10Gbps
3) 支持多於8種負載均衡算法 ,同時也支持session保持
4) 支持虛擬主機功能
5) 從HAProxy 1.3版本後開始支持連接拒絕、全透明代理等功能
6) HAProxy擁有一個功能強大的服務器狀態監控頁面
7) HAProxy擁有功能強大的ACL支持
HAProxy缺點
1)重載配置的功能需要重啟進程,雖然也是soft restart,但沒有Nginx的reaload更為平滑和友好。
2)本身不能作為wed頁面被客戶端訪問。
HAProxy配置文件詳解
其配置文件主要由五個部分組成,分別為global部分,defaults部分,frontend部分,backend部分,listen部分。
用於設置全局配置參數
2) defaults部分
默認參數的配置部分。
3) frontend部分
用於設置接收用戶請求的前端虛擬節點。frontend可以根據ACL規則直接指定要使用的後端backend。
4) backend部分
用於設置集群後端服務集群的配置,也就是添加一組真實服務器,以處理前端用戶的請求。
5) listen部分
此部分是frontend和backend部分的結合體。
配置項說明
1)global部分
global
log 127.0.0.1 local0 info
maxconn 2000
user haproxy
group haproxy
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid
log
全局的日誌配置,local0是日誌設備,info表示日誌級別。其中日誌級別有err, warning, info, debug 4種。這個配置表示使用127.0.0.1上的rsyslog服務中的local0日誌設備,記錄日誌等級為info。
maxconn
設置每個HAProxy進程可接受的最大並發連接數。
nbproc
設置HAProxy啟動時可創建的進程數,此參數要求將HAProxy運行模式設置為daemon,默認只啟動一個進程;建議該值設置時小於CPU核數。
daemon
設置HAProxy進程進入後臺運行,這是推薦的運行模式。
user/group
設置啟動HAProxy進程的用戶和組
pidfile
指定HAProxy進程ID的存放位置
2) defaults部分
defaults
mode http
retires 3
timeout connect 10s
timeout client 20s
timeout server 30s
timeout check 5s
mode
設置HAProxy實例默認的運行模式,有tcp, http, health三個可選值?
tcp模式:
在此模式下,客戶端和服務器端間將建立一個全雙工的連接,不會對七層報文做任何檢查,為默認的模式;經常用於SSL, SSH, SMTP等應用
http模式
在此模式下,客戶端請求在轉發至後端服務器前將會被深度分析,所有不與RFC格式兼容的請求都會被拒絕
health模式
目前已經被廢除
retires
設置連接後端服務器的失敗重試次數,如果連接失敗的次數超過該數值,HAProxy會將對應的後端服務器標記為不可用
timeout connect
設置成功連接到一臺服務器的最長等待時間,默認單位是毫秒,但也可以使用其他時間單位作後綴
timeout client
設置連接客戶端發送數據時最長等待時間,默認單位是毫秒,但也可以使用其他時間單位作後綴
timeout server
設置服務器端回應客戶端數據發送的最長等待時間,默認單位是毫秒,但也可以使用其他時間單位作後綴
timeout check
設置對後端服務器的檢測超時時間,默認單位是毫秒,但也可以使用其他時間單位作後綴
3) frontend部分
frontend main
bind :80
mode http
option httplog
option forwardfor
option httpclose
log global
acl urlstatic pathend -i .txt .html .htm
usebackend static if urlstatic
defaultbackend htmpool
通過frontend關鍵字定義了一個名為"url_static"的前端虛擬節點
bind
此選項用於定義一個或者幾個監聽的套接字,只能在frontend和listen中定義
格式如下:
bind [<address>:[port_range]] [interface],(*:80 == 0.0.0.0:80)
option httplog
默認情況下,HAProxy日誌是不記錄HTTP請求的,此選項的作用是啟用日誌記錄HTTP請求
option forwardfor
此選項的作用是保證後端服務器可記錄客戶端真實的IP
option httpclose
此選項表示客戶端和服務端完成一次連接請求後,HAProxy將主動關閉此TCP連接。這是對性能非常有幫助的一個參數
log global
表示使用global段中定義的日誌格式
acl url_static path_end -i .txt .html .htm
定義一條名為url_static的ACL規則:path部分以.txt .html .htm結尾的(-i 不區分大小寫)
use_backend static if url_static
如果符合url_static的規則則調度到名為static的後端服務器上
default_backend htmpool
此選項用於指定後端默認的服務器池
ACL常用參數:
hdr(HEADER):檢查首部字段的值是否為指定的值,如hdr(Connection) -i close表示首部字段Connection的值是否為不區分大小寫的close。
hdr_reg(HEADER):檢查首部字段是否匹配指定的模式。如hdr_reg(Host) -i .*.longshuai.com。
http_first_req:當正處理的請求是第一個請求時返回true。
method:請求的方法為指定的方法時返回方法對應的數值,也就表示true。例如"method GET"。
path_beg:匹配path的前綴部分。
path_end:匹配path的後綴部分。
path_reg:使用正則表達式來匹配path。
url:對整個url進行匹配。
url_beg:對url的前綴進行匹配。
官方手冊:https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#7.3.3
4) backend部分
backend app
mode http
option redispatch
option abortonclose
balance roundrobin
cookie SERVERID
option httpchk GET /index.php
server web1 179.5.99.13:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server web2 179.5.99.14:80 cookie server2 weight 6 check inter 2000 rise 2 fall 3
backend用於定義一個名稱為app的後端服務器組,根據需要可以定義多個
option redispatch
此參數用於cookie保持的環境中。在默認情況下,HAProxy會將其請求的後端服務器的serverID插入cookie中,以保證會話的session持久性。而如果後端服務器出現故障,客戶端的cookie是不會刷新的,這就會造成無法訪問。此時,如果設置了此參數,就會將客戶的請求強制定向到另外一臺健康的後端服務器上,以保證服務正常
option abortonclose
此參數可以在服務器負載很高的情況下,自動結束當前隊列中處理時間比較長的連接
balance roundrobin
指定負載均衡算法
HAProxy支持的負載均衡算法:
roundrobin
基於權重進行輪叫調度的算法
static-rr
基於權重進行輪叫調度的算法,不過此算法為靜態算法,在運行時調整其服務器權重不會生效
source
基於請求源IP的算法。此算法先對請求的源IP進行HASH運算,然後將結果與後端服務器的權重總數相除後轉發至某臺匹配的後端服務器。這種方式可以使同一個客戶端IP的請求始終轉發到某特定的後端服務器
leastconn
此算法會將新的連接請求轉發到具有最少連接數目的後端服務器。在會話時間較長的場景中推薦使用此算法 ,例如數據庫負載均衡
uri
此算法會對部分或整個URI進行HASH運算,再經過與服務器的總權重相除,最後轉發到某臺匹配的後端服務器上
uri_param
此算法會根據URL路徑中的參數進行轉發,這樣可保證在後端真實服務器數據不變時,同一個用戶的請求始終分發到同一臺機器上
hdr
此算法根據HTTP頭進行轉發,如果指定的HTTP頭名稱不存在,則使用roundrobin算法 進行策略轉發
cookie SERVERID
表示允許向cookie插入SERVERID,每臺服務器的SERVERID可在下面的server關鍵字中使用cookie關鍵字定義
option httpchk
此選項表示啟用HTTP的服務狀態檢測功能
格式如下:
option httpchk <method> <uri> <version>
method
表示HTTP請求的方式,常用的有OPTIONS,HEAD, GET幾種方式。一般的健康檢查可以采用HEAD方式進行,而不是采用GET方式,這是因為HEAD方式沒有數據返回,僅檢查響應報文的狀態碼是不是200.因此相對於GET, HEAD的方式更簡單、更快
uri
表示要檢測的URL地址
version
指定心跳檢測時的HTTP的版本號
server web1 10.1.1.1:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server用於定義多臺後端真實服務器,不能用於frontend和listen段
格式如下:
server <name> <address>:[port] [param]
name
為後端真實服務器指定一個內部名稱,隨便定義一個即可
address:port
指定後端服務器的IP地址及端口
param參數
常用的參數:
check 表示啟用對此後端服務器執行健康狀態檢查
inter 設置健康狀態檢查的時間間隔,單位是毫秒
rise 檢查多少次認為服務器可用
fall 檢查多少次認為服務器不可用
weight 設置服務器的權重,默認為1, 最大為256。 設置為0表示不參與負載均衡
backup 設置備份服務器,用於所有後端服務器全部不可用時
cookie 為指定的後端服務器設置cookie值,此處指定的值將在請求入站時被檢查,第一次為此值挑選的後端服務器將在後續的請求中一直被選中,其目的在於實現持久連接的功能
5) listen部分
listen adminstatus
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local0 err
stats refresh 30s
stats uri /haproxy-status
stats realm Welcome login
stats auth admin:admin
stats hide-version
stats admin if TRUE
listen部分用於配置HAProxy監控頁面相關的參數
stats refresh 30s
設置HAProxy監控統計頁面自動刷新的時間
stats uri /haproxy-status
設置HAProxy監控頁面訪問的URI路徑
stats realm Welcome
設置登錄監控頁面時,密碼框上的提示信息
stats auth admin:admin
設置登錄監控頁面的用戶名,密碼。用戶密碼用冒號隔開,可以設置多個,每行一個
stats hide-version
設置在監控頁面上隱藏HAProxy的版本號
status admin if TRUE
設置此選項,可在監控頁面上啟用、禁用後端服務器,僅在1.4.9版本以後生效
HAProxy簡介及常用配置文件詳解