HAProxy配置語(yǔ)法及實(shí)例
HAProxy的配置
HAProxy配置中分成五部分內(nèi)容,當(dāng)然這些組件不是必選的,可以根據(jù)需要選擇部分作為配置。
global:參數(shù)是進(jìn)程級(jí)的,通常和操作系統(tǒng)(OS)相關(guān)。這些參數(shù)一般只設(shè)置一次,如果配置無(wú)誤,就不需要再次配置進(jìn)行修改
defaults:配置默認(rèn)參數(shù)的,這些參數(shù)可以被利用配置到frontend,backend,listen組件
frontend:接收請(qǐng)求的前端虛擬節(jié)點(diǎn),F(xiàn)rontend可以根據(jù)規(guī)則直接指定具體使用后端的 backend(可動(dòng)態(tài)選擇)。
backend:后端服務(wù)集群的配置,是真實(shí)的服務(wù)器,一個(gè)Backend對(duì)應(yīng)一個(gè)或者多個(gè)實(shí)體服務(wù)器。
listen:Frontend和Backend的組合體。
下面是HAProxy的一些常用的配置,這個(gè)配置是用來(lái)說(shuō)明HAProxy的一些常用功能的配置,具體詳細(xì)配置請(qǐng)查看安裝目錄下的doc目錄下的文檔文件,或者到http://cn.haproxy.org/下載中文配置說(shuō)明文檔
配置具體實(shí)例,后附說(shuō)明:
global
#全局的日志配置 其中日志級(jí)別是[err warning info debug]
#local0 是日志設(shè)備,必須為如下24種標(biāo)準(zhǔn)syslog設(shè)備的一種:
#kern user mail daemon auth syslog lpr news
#uucp cron auth2 ftp ntp audit alert cron2
#local0 local1 local2 local3 local4 local5 local6 local7
#但是之前在/etc/syslog.conf文件中定義的是local0所以
#這里也是用local0
log 127.0.0.1 local0 info #[err warning info debug]
#***連接數(shù)
maxconn 4096
#用戶
user admin
#組
group admin
#使HAProxy進(jìn)程進(jìn)入后臺(tái)運(yùn)行。這是推薦的運(yùn)行模式
daemon
#創(chuàng)建4個(gè)進(jìn)程進(jìn)入deamon模式運(yùn)行。此參數(shù)要求將運(yùn)行模式設(shè)置為"daemon"
nbproc 4
#將所有進(jìn)程的pid寫入文件 啟動(dòng)進(jìn)程的用戶必須有權(quán)限訪問(wèn)此文件。
pidfile /home/admin/haproxy/logs/haproxy.pid
defaults
#默認(rèn)的模式mode { tcp|http|health },tcp是4層,http是7層,health只會(huì)返回OK
mode http
#采用http日志格式
option httplog
#三次連接失敗就認(rèn)為是服務(wù)器不可用,也可以通過(guò)后面設(shè)置
retries 3
如果cookie寫入了serverId而客戶端不會(huì)刷新cookie,
#當(dāng)serverId對(duì)應(yīng)的服務(wù)器掛掉后,強(qiáng)制定向到其他健康的服務(wù)器
option redispatch
#當(dāng)服務(wù)器負(fù)載很高的時(shí)候,自動(dòng)結(jié)束掉當(dāng)前隊(duì)列處理比較久的鏈接
option abortonclose
#默認(rèn)的***連接數(shù)
maxconn 4096
#連接超時(shí)
contimeout 5000
#客戶端超時(shí)
clitimeout 30000
#服務(wù)器超時(shí)
srvtimeout 30000
#=心跳檢測(cè)超時(shí)
timeout check 2000
#注:一些參數(shù)值為時(shí)間,比如說(shuō)timeout。時(shí)間值通常單位為毫秒(ms),但是也可以通過(guò)加#后綴,來(lái)使用其他的單位。
#- us : microseconds. 1 microsecond = 1/1000000 second
#- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.
#- s : seconds. 1s = 1000ms
#- m : minutes. 1m = 60s = 60000ms
#- h : hours. 1h = 60m = 3600s = 3600000ms
#- d : days. 1d = 24h = 1440m = 86400s = 86400000ms
#p#
########統(tǒng)計(jì)頁(yè)面配置############
listen admin_stats
#監(jiān)聽端口
bind 0.0.0.0:1080
#http的7層模式
mode http
#日志設(shè)置
log 127.0.0.1 local0 err #[err warning info debug]
#統(tǒng)計(jì)頁(yè)面自動(dòng)刷新時(shí)間
stats refresh 30s
#統(tǒng)計(jì)頁(yè)面url
stats uri /admin?stats
#統(tǒng)計(jì)頁(yè)面密碼框上提示文本
stats realm Gemini\ Haproxy
#統(tǒng)計(jì)頁(yè)面用戶名和密碼設(shè)置
stats auth admin:admin
stats auth admin1:admin1
#隱藏統(tǒng)計(jì)頁(yè)面上HAProxy的版本信息
stats hide-version
#######網(wǎng)站檢測(cè)listen定義############
listen site_status
bind 0.0.0.0:1081
mode http
log 127.0.0.1 local0 err #[err warning info debug]
#網(wǎng)站健康檢測(cè)URL,用來(lái)檢測(cè)HAProxy管理的網(wǎng)站是否可以用,正常返回200,不正常返回500
monitor-uri /site_status
#定義網(wǎng)站down時(shí)的策略
#當(dāng)掛在負(fù)載均衡上的指定backend的中有效機(jī)器數(shù)小于1臺(tái)時(shí)返回true
acl site_dead nbsrv(denali_server) lt 1
acl site_dead nbsrv(tm_server) lt 1
acl site_dead nbsrv(mms_server) lt 1
#當(dāng)滿足策略的時(shí)候返回500
monitor fail if site_dead
#如果192.168.0.252或者192.168.0.31這兩天機(jī)器掛了
#認(rèn)為網(wǎng)站掛了,這時(shí)候返回500,判斷標(biāo)準(zhǔn)是如果mode是
#http返回200認(rèn)為是正常的,如果mode是tcp認(rèn)為端口暢通是好的
monitor-net 192.168.0.252/31
########frontend配置############
frontend http_80_in
#監(jiān)聽端口
bind 0.0.0.0:80
#http的7層模式
mode http
#應(yīng)用全局的日志配置
log global
#啟用http的log
option httplog
#每次請(qǐng)求完畢后主動(dòng)關(guān)閉http通道,HA-Proxy不支持keep-alive模式
option httpclose
#如果后端服務(wù)器需要獲得客戶端的真實(shí)IP需要配置次參數(shù),將可以從Http Header中
#獲得客戶端IP
option forwardfor
###########HAProxy的日志記錄內(nèi)容配置##########
capture request header Host len 40
capture request header Content-Length len 10
capture request header Referer len 200
capture response header Server len 40
capture response header Content-Length len 10
capture response header Cache-Control len 8
####################acl策略定義#########################
#如果請(qǐng)求的域名滿足正則表達(dá)式返回true -i是忽略大小寫
acl denali_policy hdr_reg(host) -i ^(www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$
#如果請(qǐng)求域名滿足trade.gemini.taobao.net 返回 true -i是忽略大小寫
acl tm_policy hdr_dom(host) -i trade.gemini.taobao.net
##在請(qǐng)求url中包含sip_apiname=,則此控制策略返回true,否則為false
acl invalid_req url_sub -i sip_apiname=
##在請(qǐng)求url中存在timetask作為部分地址路徑,則此控制策略返回true,否則返回false
acl timetask_req url_dir -i timetask
#當(dāng)請(qǐng)求的header中Content-length等于0時(shí)返回 true
acl missing_cl hdr_cnt(Content-length) eq 0
#p#
######################acl策略匹配相應(yīng)###################
##當(dāng)請(qǐng)求中header中Content-length等于0 阻止請(qǐng)求返回403
block if missing_cl
##block表示阻止請(qǐng)求,返回403錯(cuò)誤,當(dāng)前表示如果不滿足策略invalid_req,或者滿足策略timetask_req,則阻止請(qǐng)求。
block if !invalid_req || timetask_req
#當(dāng)滿足denali_policy的策略時(shí)使用denali_server的backend
use_backend denali_server if denali_policy
#當(dāng)滿足tm_policy的策略時(shí)使用tm_server的backend
use_backend tm_server if tm_policy
#reqisetbe關(guān)鍵字定義,根據(jù)定義的關(guān)鍵字選擇backend
reqisetbe ^Host:\ img dynamic
reqisetbe ^[^\ ]*\ /(img|css)/ dynamic
reqisetbe ^[^\ ]*\ /admin/stats stats
#以上都不滿足的時(shí)候使用默認(rèn)mms_server的backend
default_backend mms_server
#HAProxy錯(cuò)誤頁(yè)面設(shè)置
errorfile 400 /home/admin/haproxy/errorfiles/400.http
errorfile 403 /home/admin/haproxy/errorfiles/403.http
errorfile 408 /home/admin/haproxy/errorfiles/408.http
errorfile 500 /home/admin/haproxy/errorfiles/500.http
errorfile 502 /home/admin/haproxy/errorfiles/502.http
errorfile 503 /home/admin/haproxy/errorfiles/503.http
errorfile 504 /home/admin/haproxy/errorfiles/504.http
##########backend的設(shè)置##############
backend mms_server
#http的7層模式
mode http
#負(fù)載均衡的方式,roundrobin平均方式
balance roundrobin
#允許插入serverid到cookie中,serverid后面可以定義
cookie SERVERID
#心跳檢測(cè)的URL,HTTP/1.1¥r¥nHost:XXXX,指定了心跳檢測(cè)HTTP的版本,XXX為檢測(cè)時(shí)請(qǐng)求
#服務(wù)器的request中的域名是什么,這個(gè)在應(yīng)用的檢測(cè)URL對(duì)應(yīng)的功能有對(duì)域名依賴的話需要設(shè)置
option httpchk GET /member/login.jhtml HTTP/1.1\r\nHost:member1.gemini.taobao.net
#服務(wù)器定義,cookie 1表示serverid為1,check inter 1500 是檢測(cè)心跳頻率
#rise 3是3次正確認(rèn)為服務(wù)器可用,fall 3是3次失敗認(rèn)為服務(wù)器不可用,weight代表權(quán)重
server mms1 10.1.5.134:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1
server mms2 10.1.6.118:80 cookie 2 check inter 1500 rise 3 fall 3 weight 2
backend denali_server
mode http
#負(fù)載均衡的方式,source根據(jù)客戶端IP進(jìn)行哈希的方式
balance source
#但設(shè)置了backup的時(shí)候,默認(rèn)***個(gè)backup會(huì)優(yōu)先,設(shè)置option allbackups后
#所有備份服務(wù)器權(quán)重一樣
option allbackups
#心跳檢測(cè)URL設(shè)置
option httpchk GET /mytaobao/home/my_taobao.jhtml HTTP/1.1\r\nHost:my.gemini.taobao.net
#可以根據(jù)機(jī)器的性能不同,不使用默認(rèn)的連接數(shù)配置而使用自己的特殊的連接數(shù)配置
#如minconn 10 maxconn 20
server denlai1 10.1.5.114:80 minconn 4 maxconn 12 check inter 1500 rise 3 fall 3
server denlai2 10.1.6.104:80 minconn 10 maxconn 20 check inter 1500 rise 3 fall 3
#備份機(jī)器配置,正常情況下備機(jī)不會(huì)使用,當(dāng)主機(jī)的全部服務(wù)器都down的時(shí)候備備機(jī)會(huì)啟用
server dnali-back1 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
server dnali-back2 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
backend tm_server
mode http
#負(fù)載均衡的方式,leastconn根據(jù)服務(wù)器當(dāng)前的請(qǐng)求數(shù),取當(dāng)前請(qǐng)求數(shù)最少的服務(wù)器
balance leastconn
option httpchk GET /trade/itemlist/prepayCard.htm HTTP/1.1\r\nHost:trade.gemini.taobao.ne
server tm1 10.1.5.115:80 check inter 1500 rise 3 fall 3
server tm2 10.1.6.105:80 check inter 1500 rise 3 fall 3
######reqisetbe自定義關(guān)鍵字匹配backend部分#######################
backend dynamic
mode http
balance source
option httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net
server denlai1 10.3.5.114:80 check inter 1500 rise 3 fall 3
server denlai2 10.4.6.104:80 check inter 1500 rise 3 fall 3
backend stats
mode http
balance source
option httpchk GET /welcome.html HTTP/1.1\r\n Host:www.163.com
server denlai1 10.5.5.114:80 check inter 1500 rise 3 fall 3
server denlai2 10.6.6.104:80 check inter 1500 rise 3 fall 3