HAProxy提供高可用、負載均衡以及基於TCP和HTTP的應用代理,適合處理高負載站點的七層數據請求。類似的代理服務可以屏蔽內部真實服務器,防止內部服務器遭受攻擊。
HAProxy特點和優點:
1.支持原聲SSL,同時支持客戶端和服務器的SSL.
2.支持IPv6和UNIX套字節(sockets)
3.支持HTTP Keep-Alive
4.支持HTTP/1.1壓縮,節省寬帶
5.支持優化健康檢測機制(SSL、scripted TCP、check agent...)
6.支持7層負載均衡。
7.可靠性和穩定性非常好。
8.併發連接40000-50000個,單位時間處理最大請求20000個,最大數據處理10Gbps.
9.支持8種負載均衡算法,同時支持session保持。
10.支持虛擬主機。
11.支持連接拒絕、全透明代理。
12.擁有服務器狀態監控頁面。
13.支持ACL.
HAProxy爲了讓同一客戶端訪問服務器可以保持會話。有三種解決方法:客戶端IP、Cookie以及Session
1.HAProxy通過客戶端IP進行Hash計算並保存,以此確保當相同IP訪問代理服務器可以轉發給固定的真實服務器。
2.HAProxy依靠真實服務器發送客戶端的Cookie信息進行會話保持。
3.HAProxy將保存真實服務器的Session以及服務器標識,實現會話保持。
(HAProxy只要求後端服務器能夠在網絡聯通,也沒有像LVS那樣繁瑣的ARP配置)
HAProxy的balance8種負載均衡算法:
1.roundrobin : 基於權重輪循。
2.static-rr : 基於權重輪循。靜態算法,運行時改變無法生效
3.source : 基於請求源IP的算法。對請求的源IP進行hash運算,然後將結果與後端服務器的權重總數想除後轉發至某臺匹配服務器。使同一IP客戶端請求始終被轉發到某特定的後端服務器。
4.leastconn : 最小連接。(適合數據庫負載均衡,不適合會話短的環境)
5.uri : 對部分或整體URI進行hash運算,再與服務器的總權重想除,最後轉發到匹配後端。
6.uri_param : 根據URL路徑中參數進行轉發,保證在後端服務器數量不變的情況下,同一用戶請求分發到同一機器。
7.hdr(<name>) : 根據http頭轉發,如果不存在http頭。則使用簡單輪循。
HAProxy主要工作模式
1.tcp模式:該模式下,在客戶端和服務器之間將建立一個全雙工的連接,且不會對7層的報文做任何處理的簡單模式。此模式默認,通常用於SSL、SSH、SMTP應用。
2.http模式(一般使用):該模式下,客戶端請求在轉發給後端服務器之前會被深度分析,所有不與RFC格式兼容的請求都會被拒絕。
HAProxy架構圖
二 HAProxy安裝及配置文件參數
HAProxy安裝
yum install haproxy -y
HAProxy環境
配置文件:/etc/haproxy/haproxy.cfg
global 全局配置段
進程及安全配置相關的參數
性能調整相關參數
Debug相關參數
(proxies 代理配置段)
default 默認配置 (fronttend backend listen 三個的默認參數)
frontend 前端 定義一系列監聽套字節,接收客戶端請求
backend 後端 定義一系列後端服務器,請求轉發
listen 前後端直接關聯
配置文件詳解
global
chroot dir #工作目錄chroot
#全局日誌配置,使用127.0.0.1的rsyslog服務中local3日誌設備,等級info
log 127.0.0.1 local3 info
#每個進程最大併發數
maxconn 4096
#後臺進程數量
nbproc 1
#用戶
- user nobody
group nobody
#後臺程序模式工作
daemon
#HAProxy pid文件存儲目錄
pidfile /var/run/haproxy-private.pid
#tune.bufsize 16384 設置buffer(B)
- defaults
- #模式(tcp http health)
- mode http
- #連接後端服務器重試次數,超出後標爲不可用
- retries 3
- timeout connect 10S #連接服務器最長等待時間(ms)
- timeout client 20s #連接客戶端發送數據最長等待時間。
- timeout server 30s #服務器回覆客戶端最長等待時間。
- timeout check 5s #對後端服務器的檢測超時時間。
- frontend www #定義名爲www的前端虛擬節點
- # bind [<address>:<port_range>] interface <interface> 監聽套字節定義
- bind *:80
- mode http
- option httplog #啓用日誌記錄HTTP請求。
- option forwardfor #啓用後後端服務器可以獲得客戶端IP
- option httpclose #客戶端和服務器完成一次連接請求後,HAProxy主動關閉TCP鏈接(優化選項)
- log global #使用全局日誌配置
- default_backend htmpool #指定後端服務池(backend定義htmpool)
- backend htmpool #定義名爲htmpool的真實服務器組
- mode http
- option redispatch #用於cookie保持環境。(如後端服務器故障,客戶端cookie不會刷新,用此來把用戶請求強制定向到正常服務器)
- option abortonclose #負載均衡很高時,自動結束當前隊列處理時間長的連接
- balance roundrobin #負載均衡算法。
- cookie SERVERID #允許向cookie插入SERVERID.下面server可以使用cookie定義
- #option httpchk <method> <url> <vesion>
- #mothod: OPTION、GET、HEAD (其中HEAD僅檢測是否返回狀態碼200 更快,更簡單)
- option httpchk GET /index.php #啓用HTTP服務狀態檢測功能
- #server <name> <address>[:port] [param*]
- #[param*]爲後端設定參數
- #cookie server1 指定後端服務器設置cookie值,目的實現持久連接,指定的cookie值在請求時會被檢查,第一次此cookie值將挑選後端服務器將一直被沿用。
- #weight num權重
- #check啓用後端執行健康檢測
- #inter num 健康狀態檢測時間間隔
- #rise num 從故障狀態轉換至正常需成功檢測次數
- #fall num 從正常轉換故障需失敗次數
- #backup 設置後端真實服務器備份服務器,僅在所有真實服務器不可用啓用
- server web1 192.168.1.186:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3
- server web2 192.168.1.188:80 cookie server2 weight 6 check inter 2000 rise 2 fall 3
listen admin_stats #定義HAProxy監控頁面
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local3 err
stats refresh 30s #HAProxy監控頁面統計自動刷新時間。
stats uri /haproxy-status #設置監控頁面URL路徑。 http//IP:9188/haproxy-status可查看
stats realm welcome login\ Haproxy #統計頁面密碼框提示信息
stats auth admin:123456 #登錄統計頁面用戶和密碼
stats hide-version #隱藏HAProxy版本信息
stats admin if TRUE #設置TURE後可在監控頁面手工啓動關閉後端真實服務器
ACL權限
#3.4層匹配 dst,src 目的IP和源IP
(寫入frontend中)#禁止192.168.0.0/24網段用戶訪問
acl bad src 192.168.0.0/24
block if bad
#七層匹配 req.hdr([<>name[,<occ>])
#用戶訪問www.server2.com時(報頭正則匹配),代理轉發給server2 -i是不區分大小寫
acl www hdr_reg(host) -i ^(www.server2.com)$
use_backend server2 if www
- #acl其他設置
- acl url_static path_end .git .png .css .js (URL請求結尾)
- acl host_www hdr_beg(host) -i www
- acl host_static hdr_beg(host) -i img. video. download. ftp. (域名開頭)
日誌配置
vim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy
systemctl restart rsyslog