首先,本文主要從應用角度來講講HAProxy的常規(guī)用法肿男,不會涉及到特別深的東西延都,另外本文涉及到的實例都是在ubuntu系統(tǒng)下進行的。
1. 方法論
HAProxy是一個開源的可提供高可用性掰烟、負載均衡的軟件,支持傳輸層(L4)和應用層(L7)的負載均衡能力沐批,功能豐富,從性能和穩(wěn)定性上來講基本能媲美商用的負載均衡軟件蝎亚,因此目前使用非常廣泛九孩。
軟件特性
- 支持L4和L7兩種負載均衡的能力;
- 支持健康檢查发框;
- 支持狀態(tài)網頁監(jiān)控躺彬;
- 支持SSL岂昭,能夠解析https協(xié)議顺囊;
- 支持會話保持;
2. L4和L7負載均衡的區(qū)別
L4的負載均衡
L4的負載均衡是通過L3轉發(fā)的IP,加上L4的端口來決定哪些流量需要做負載均衡鸯屿,對需要處理的流量進行NAT處理,轉發(fā)至后臺服務器腔丧,并記錄下這個TCP或者UDP的流量是由哪臺服務器處理的警没,后續(xù)這個連接的所有流量都同樣轉發(fā)到同一臺服務器處理。
L7的負載均衡
L7的負載均衡是在L4的基礎上缔刹,除了通過IP+端口外球涛,還可以通過URL、頭信息校镐、瀏覽器等等應用層的信息來決定哪些流量需要做負載均衡亿扁。
3. HAProxy的健康檢查
HAProxy的健康檢查功能一般配置在backend
或者listen
區(qū)域,最簡單的配置即:option httpchk
鸟廓,也就是檢查web服務器站點的根目錄是否存在从祝,不可靠無法保證后端的服務可用;此外如果后端Web服務器用的是nginx引谜,我們需要在nginx配置http options
方法的可用牍陌,因為此時健康檢查是通過http的options方法來獲取web服務器的根目錄,否則HAProxy會報405煌张。實際使用中建議采用下面兩種健康檢查的方式:
- option httpchk get /xxx.html # 獲取某個靜態(tài)文件
- option httpchk HEAD /xxx.html HTTP/1.1\r\nHost:\ www.xxx.com # 獲取某個靜態(tài)文件的同時匹配頭信息
4. HAProxy網頁統(tǒng)計監(jiān)控功能
HAProxy支持網頁統(tǒng)計功能呐赡,配置非常簡單,下面給個具體的實例可參照如下:
listen stats
bind 10.5.1.54:10000 # 頁面監(jiān)控功能綁定的ip及端口號
stats uri /haproxy_stats # haproxy頁面監(jiān)控的uri
stats enable # 打開頁面監(jiān)控功能
stats hide-version # 在頁面隱藏haproxy版本信息骏融,出于安全考慮
stats refresh 10s # 監(jiān)控頁面刷新時間
stats realm HAProxy\ Stats # 監(jiān)控頁面的認證提示链嘀,需要認證時這個配置才有意義
stats auth admin:admin # 監(jiān)控認證的用戶名及密碼
-
然后我們在瀏覽器輸入其上配置uri就能打開haproxy的監(jiān)控頁面了:
從haproxy的監(jiān)控頁面我們可以及時偵測到各個后端服務的狀態(tài)及當前的連接請求數目等信息。
5. 解析https協(xié)議
說到HTTPS就不得不提到SSL了档玻,而haproxy的https的配置首先我們得準備個SSL證書怀泊,有關SSL證書的創(chuàng)建還請移步:創(chuàng)建HAProxy SSL證書,此處就不多做贅述误趴,下面直接說配置了:
- http和https共存
frontend fe01
bind *:80 # http
bind *:443 ssl crt /path/to/xxx.pem # https
mode http
default_backend backend_server01 # 后端代理server霹琼,下面配置會講到
- only https
frontend fe01
bind *:80
bind *:443 ssl crt /path/to/xxx.pem # https
redirect scheme https if ! {ssl_fc} # 如果是http則重定向到https的url
mode http
default_backend backend_server01
6. 支持會話保持
HAProxy的會話保持策略有好幾種,下面僅講述最常見的兩種:
IP Hash
這種策略跟Nginx的ip_hash基本類似凉当,對于同一個源ip的客戶端請求都會發(fā)送到同一臺后端服務器枣申;但是如果多個客戶端通過代理或者地址轉換訪問服務器時,由于源IP相同請求都被分配到同一臺服務上看杭,這樣這臺服務器壓力就會比較大忠藤。另外這種策略常常會用在L4負載均衡上,配置參數很簡單:balance source
楼雹。cookie
這是L7負載均衡會話保持的一個策略模孩,用戶在第一次請求時會插入一個cookie尖阔,等到下一次請求時會帶著這個cookie,從而達到前后端會話保持的目的榨咐,參數配置可參考如下:
listen example_service
...
cookie <cookie_name> insert indirect nocache
server node-4 192.168.0.8:3001 check cookie xxxx ## 其中xxxx介却、yyyy是檢測的cookie的值
server node-5 192.168.0.12:3001 check cookie yyyy
7. 常規(guī)配置用法
有關HAProxy參數的配置上文中也零零散散地涉及到一些,本節(jié)將詳細解釋常用的haproxy參數配置块茁。
首先haproxy的參數配置有五大快齿坷,分別是global、defaults龟劲、frontend胃夏、backend和listen,而配置文件分兩部分:/etc/haproxy/haproxy.cfg和/etc/haproxy/conf.d/*
昌跌,通常會把global和defaults的配置放到haproxy.cfg仰禀,實際的代理配置都放到haproxy的conf.d目錄下面,然后在haproxy.cfg通過include conf.d/*.cfg
來實現(xiàn)一個完整的haproxy的配置蚕愤。下面從配置放置的路徑來看看haproxy常用的配置參數吧答恶。
- haproxy.cfg包括global和defaults配置,global是haproxy的全局配置萍诱,而defaults則對應默認的代理配置悬嗓,下面通過一個實例來說明:
global
daemon # 指定haproxy服務后臺模式運行
user haproxy # haproxy進程所述用戶
group haproxy # haproxy進程所述用戶組
log /dev/log local0 # 日志輸出配置,最多可設置兩個裕坊,一般這塊跟rsyslog緊密相連
maxconn 16000 # haproxy同時能處理最大連接數
pidfile /var/run/haproxy.pid # haproxy進程pid保存文件
spread-checks 3 # 在haproxy后端有著眾多服務器的場景中包竹,在精確的時間間隔后統(tǒng)一對眾服務器進行健康狀況檢查可能會帶來意外問題;此選項用于將其檢查的時間間隔長度上增加或減小一定的隨機時長籍凝;
stats socket /var/lib/haproxy/stats # 開啟haproxy網頁監(jiān)控功能及對應的socket
defaults
log global # 指定日志配置使用global的log配置
maxconn 8000 # 單個代理實例同時允許的最大連接數
mode http # 實例運行模式周瞎,tcp或http
option redispatch # 連接失敗時會話是不是重新分發(fā)
option http-server-close # 一旦服務端響應過后server端的連接關閉
option splice-auto # 啟動套接字的內核自動加速
option dontlognull # 沒有數據傳輸的請求連接不記錄log
retries 3 # 請求連接失敗的retry次數
timeout http-request 20s # 創(chuàng)建連接后客戶端沒能完整發(fā)送http請求的超時時間
timeout queue 1m # 隊列等待連接空閑的超時時間
timeout connect 10s # 創(chuàng)建連接的超時時間
timeout client 1m # 創(chuàng)建連接后客戶端持續(xù)不發(fā)送請求的超時時間
timeout server 1m # 后端服務的響應超時時間
timeout check 10s # 健康檢查的請求響應超時時間
include conf.d/*.cfg # 具體的實例配置(可能包括frontend、backend饵蒂、listen的實例)
- conf.d/*.cfg
這一塊的配置文件可能會涉及到frontend(前端實例)声诸、backend(后端實例)和listen(前端+后端)三種類型的配置,下面各給出實例以作說明:
frontend frontend_server01
bind *:3001 # 前端服務監(jiān)聽端口
maxconn 3000 # 此端口的最大連接數目
default_backend default_servers # 默認使用的后端server
backend default_servers
balance source # 負載均衡的算法退盯,這里采用ip hash
option httpchk # 開啟健康檢查功能
option httplog # 開啟http log
option httpclose
timeout server 600s # 后端server響應haproxy請求的超時時間
server node-4 192.168.0.8:3001 check inter 10s fastinter 2s downinter 3s rise 3 fall 3 # 配置后端server彼乌,可設置haproxy健康檢查及間隔時間還可根據server的狀態(tài)通過fastinter和downinter來優(yōu)化延遲、判斷該server是UP還是DOWN的機制等渊迁,在此配置連續(xù)三次檢查成功才認為server是UP慰照,而連續(xù)三次檢查失敗則認為server是DOWN
server node-3 192.168.0.11:3001 check inter 10s fastinter 2s downinter 3s rise 3 fall 3
server node-5 192.168.0.12:3001 check inter 10s fastinter 2s downinter 3s rise 3 fall 3
listen ripple
bind 192.168.0.3:3000,10.5.1.54:3000
http-request set-header X-Forwarded-Proto https if { ssl_fc }
balance source
option httpchk
option httplog
option httpclose
timeout server 600s
server node-4 192.168.0.8:3000 check inter 10s fastinter 2s downinter 3s rise 3 fall 3
server node-3 192.168.0.11:3000 check inter 10s fastinter 2s downinter 3s rise 3 fall 3
server node-5 192.168.0.12:3000 check inter 10s fastinter 2s downinter 3s rise 3 fall 3
listen其實是把前端和后端的配置放一塊了,配置的參數可用時參照前端和后端的配置琉朽,更詳細的配置參數的說明則可參照HAProxy配置參數詳細說明毒租,此處就不一一舉例解釋了。