HAProxy是高性能的企業級負載均衡調度器,同時支持四層TCP和七層HTTP協議的負載均衡調度,以及支持基於cookie的持久性,支持正則表達式及web狀態統計、自動故障切換等優點,因此廣泛被應用於企業內業務系統集群的入口作為負載均衡調度器。
HAPrpxy的配置文件haproxy.cfg由兩大部分組成,分別是global和proxies部分。
global:全局配置段
1、進程及安全配置相關的參數
2、性能調整相關參數
3、Debug參數
global配置參數官方文檔:https://cbonte.github.io/haproxy-dconv/2.0/intro.html
global # 全局段配置
chroot #(安全配置選項)鎖定haproxy用戶運行目錄。
deamon #以后台守護進程運行
stats socket /var/lib/haproxy/haproxy.sock mode 600 level
admin #socket文件路徑、文件權限及管理級別
user haproxy # 設置運行haproxy的用戶(非登錄用戶),也可使用uid關鍵字替代。
group haproxy # 設置運行haproxy的用戶組,也可使用gid關鍵字替代。
nbproc <number> #開啟的haproxy進程數,通常與CPU核心數保持一致,開啟多進程提高並發處理能力。
cpu-map 1 0 #將第1個子進程綁定到0號CPU核心,以此類推(優化配置項,haproxy開啟了多進程時,綁定haproxy子進程至指定CPU核心上,避免多個子進程在不同CPU核心上切換,提升性能)
nbthread <number> #指定每個haproxy進程開啟的線程數,默認為每個進程一個線程,與nbproc互斥,即開啟多進程時無法開啟多線程,通常適合單核心CPU開啟此項提升處理能力。
maxconn <number> #單haproxy進程的最大並發連接數,需要調整優化系統最大文件描述符數(ulimit -n)。
maxconnrate <number> #單個haproxy進程的連接每秒的創建速率上限
maxsslconn <number> #單個haproxy進程的ssl連接最大並發連接數,用於haproxy配置了證書的場景下。需要調整優化系統最大文件描述符數(ulimit -n)。
maxsslrate <number> #單haproxy進程的ssl連接每秒的創建速率上限,用於haproxy配置了證書的場景下。
spread-checks #后端server狀態check隨機提前或延遲百分比時間,建議2-5(20%-50%)之間。
pidfile /var/lib/haproxy/haproxy.pid #指定pid文件路徑
log 127.0.0.1 local3 info #定義全局的syslog服務器到本機rsyslog服務的local3設備上,最多可以定義兩個。
proxies:代理配置段
官方文檔:https://cbonte.github.io/haproxy-dconv/2.0/configuration.html#4
defaults [name] #默認配置項,針對以下的frontend、backend和lsiten生效,可以多個name
frontend [name] #前端servername,類似於Nginx的一個虛擬主機server{}
backend [name] #后端服務器組,等於nginx的upstream{}
listen [name] #將frontend和backend合並在一起配置
注意:name字段只能使用"-"、"_"、"."、":",並且嚴格區分大小寫,例如:Web和web是完全不同的兩組服務器。
Proxies配置-defaults
defaults # 默認部分的定義
option redispatch # 當使用了cookie會話保持時,haproxy將會將其請求的后端服務器的serverID插入到cookie中,以保證會話的SESSION持久性;而此時,如果后端的服務器宕掉了,但是客戶端的cookie是不會刷新的,如果設置此參數,將會將客戶的請求強制定向到另外一個后端server上,以保證服務的正常。
option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接。
option dontlognull # 啟用該項,日志中將不會記錄空連接。所謂空連接就是在上游的負載均衡器或者監控系統為了探測該服務是否存活可用時,需要定期的連接或者獲取某一固定的組件或頁面,或者探測掃描端口是否在監聽或開放等動作被稱為空連接;官方文檔中標注,如果該服務上游沒有其他的負載均衡器的話,建議不要使用該參數,因為互聯網上的惡意掃描或其他動作就不會被記錄下來
option httpclose #使用該參數,每處理完一個request時,haproxy都會去檢查http頭中的Connection的值,如果該值不是close,haproxy將會將其刪除,如果該值為空將會添加為:Connection: close。使每個客戶端和服務器端在完成一次傳輸后都會主動關閉TCP連接。與該參數類似的另外一個參數是“option forceclose”,該參數的作用是強制關閉對外的服務通道,因為有的服務器端收到Connection: close時,也不會自動關閉TCP連接,如果客戶端也不關閉,連接就會一直處於打開,直到超時。
option http-keep-alive #開啟與客戶端的會話保持
option forwardfor #透傳客戶端真實IP至后端web服務器方便訪問日志統計
mode http #默認工作類型(mode {http|tcp|health} 。http是七層模式,tcp是四層模式,health是健康檢測,返回OK)
timeout connect 120s #客戶端請求到后端server的最長連接等待時間(TCP三次握手之前)
timeout server 600s #客戶端請求到后端服務端的超時超時時長(TCP三次握手之后)默認單位是毫秒
timeout client 600s #與客戶端的最長非活動時間,默認單位是毫秒
timeout http-keep-alive 120s #session會話保持超時時間,范圍內會轉發到相同的后端服務器,默認單位是毫秒。
timeout check 5s #對后端服務器的檢測超時時間
haproxy狀態監控web頁配置
listen status # 定義一個名為status的部分作為web狀態監控頁面
bind 0.0.0.0:9999 # 定義監聽的網絡套接字地址
mode http # 定義為HTTP模式
log global # 繼承global中log的定義
stats refresh 30s # stats是haproxy的一個統計頁面的套接字,該參數設置統計頁面的刷新間隔為30s
stats uri /admin?stats # 設置統計頁面的uri為/admin?stats
stats realm Private lands # 設置統計頁面認證時的提示內容
stats auth admin:password # 設置統計頁面認證的用戶和密碼,如果要設置多個,另起一行寫入即可
stats hide-version # 隱藏統計頁面上的haproxy版本信息
Proxies配置-frontend
bind:指定HAProxy的監聽地址,可以是IPV4或IPV6,可以同時監聽多個IP或端口,可同時用於listen字段中
listen http_proxy #監聽http的多個IP的多個端口和sock文件
bind :80,:443,:8801-8810
bind 10.0.0.1:10080,10.0.0.1:10443
bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy
listen http_https_proxy #https監聽
bind :80
bind :443 ssl crt /etc/haproxy/site.pem #https證書路徑
listen http_https_proxy_explicit #監聽ipv6、ipv4和unix sock文件
bind ipv6@:80
bind ipv4@public_ssl:443 ssl crt /etc/haproxy/site.pem
bind unix@ssl-frontend.sock user root mode 600 accept-proxy
listen external_bind_app1 #監聽file descriptor(文件描述符)
bind "fd@${FD_APP1}"
frontend配置生產示例:
frontend WEB_PORT #定義一個名為WEB_PORT的前端部分
bind :80,:8080
bind 192.168.7.102:10080,:8801-8810,192.168.7.101:9001-9010 #可同時監聽多個IP和端口范圍
mode http/tcp #指定負載協議類型
use_backend backend_name #調用的后端服務器組名稱
Proxies配置-backend:
mode http/tcp #指定負載協議類型
option #配置選項
server #定義后端real server
check #對指定real進行健康狀態檢查,默認不開啟
addr IP #可指定的健康狀態監測IP
port num #指定的健康狀態監測端口
inter num #健康狀態檢查間隔時間,默認2000 ms
fall num #后端服務器失效檢查次數,默認為3
rise num #后端服務器從下線恢復檢查次數,默認為2
weight #默認為1,最大值為256,0表示不參與負載均衡
backup #將后端服務器標記為備份狀態
disabled #將后端服務器標記為不可用狀態
redirect prefix http://www.magedu.net/ #將請求臨時重定向至其它URL,只適用於http模式。
maxconn num #當前后端server的最大並發連接數
backlog num #當server的連接數達到上限后的后援隊列長度
注意:option后面加httpchk,smtpchk,mysql-check,pgsql-check,ssl-hello-chk方法,可用於實現更多應用層檢測功能。
frontend+backend配置實例
#官網業務訪問入口======================================
frontend WEB_PORT_80
bind 192.168.7.248:80
mode http
use_backend web_prot_http_nodes
backend web_prot_http_nodes
mode http
option forwardfor
server 192.168.7.101 192.168.7.101:8080 check inter 3000 fall 3 rise 5
server 192.168.7.102 192.168.7.102:8080 check inter 3000 fall 3 rise 5
Proxies配置-listen
listen方式寫法代碼更加簡潔,推薦使用listen替換frontend和backend,listen配置方式舉例如下:
#官網業務訪問入口=====================================
listen WEB_PORT_80
bind 192.168.7.248:80
mode http
option forwardfor
server web1 192.168.7.101:80 check inter 3000 fall 3 rise 5
server web2 192.168.7.102:80 check inter 3000 fall 3 rise 5
注意:通常為了解決單點失敗問題,HAProxy會結合Keepalived實施雙機熱備高可用,因此listen段bind監聽的IP地址通常應該配置為虛擬VIP地址,因此需要打開系統內核參數net.ipv4.ip_nonlocal_bind=1,允許harpoxy及keepalived程序監聽當前狀態下本機不存在的IP地址(當VIP漂移到另外節點時)。