1、安裝
1、安裝相關軟件庫
yum install -y gcc
2、創建路徑下載安裝包
mkdir –p /zjl/software
wget http://download.openpkg.org/components/cache/haproxy/haproxy-1.8.6.tar.gz
3、創建一個不能登錄的用戶管理HAProxy
groupadd HAProxy
useradd -s /sbin/nologin –M –g HAProxy HAProxy
4、創建安裝目錄:
創建安裝目錄: mkdir –p /zjl/program
5、編譯參數說明(轉載自:http://blog.sina.com.cn/s/blog_51d3553f0100u1bb.html):
make TARGET=os ARCH=arch CPU=cpu USE_xxx=1 …
編譯之前,首先查看一下系統內核,因為參數與系統內核有關。 uname –r 或 uname –a
2.6.32-504.el6.x86_64
參數說明(在README文件中這些參數都有體現)
TARGET:
指定對目標操作系統在編譯的時候進行優化,可選擇如下值之一:
linux22 for Linux 2.2
linux24 for Linux 2.4 and above (default)
linux24e for Linux 2.4 with support for a working epoll (> 0.21)
linux26 for Linux 2.6 and above
solaris for Solaris 8 or 10 (others untested)
freebsd for FreeBSD 5 to 8.0 (others untested)
openbsd for OpenBSD 3.1 to 4.6 (others untested)
cygwin for Cygwin
generic for any other OS.
custom to manually adjust every setting
如果目標系統不確定,則保持默認值generic即可。
CPU:
指定對特定的cpu進行優化,可以選擇值如下:
i686 for intel PentiumPro, Pentium 2 and above, AMD Athlon
i586 for intel Pentium, AMD K6, VIA C3.
ultrasparc : Sun UltraSparc I/II/III/IV processor
generic : any other processor or no specific optimization. (default)
ARCH:
指定ARCH值可強制編譯成聖針對一個特定系統架構程序。
通常用於在一個系統架構的平台上生成針對另一個不同架構平台的程序。
比如:在一個64位架構的目標系統上編譯生成一個32位的程序。
當前可選的值有:
x86_64
i386
i486
i586
i686
注意:如果選擇上述其中的一個值“-m32”或“-m64”會被添加到CFLAGS和LDFLAG選項中。
DEBUG:
指定生成調試信息,可通過指定DEBUG= DDEBUG_xxx對特定的代碼部分生成調試信息。當前定義的DEBUG宏有:
DEBUG_FULL
DEBUG_MEMORY
DEBUG_FSM
DEBUG_HASH
DEBUG_AUTH
USE_PCRE和USE_STATIC_PCRE:
可以通過指定“USE_xxx=1”表示使用,“USE_xxx=”表示禁用。
指定是否使用libpcre庫中的正則表達式實現來替換系統的libc庫中的實現,考慮到使用libpcre庫的效率要比libc高,因此推薦此項使用。
注意:
因為libpcre還沒有廣泛普及,因此在動態鏈接的時候,需要確保目標系統安裝有libpcre的動態庫。針對上面的問題,可以使用USE_STATIC_PCRE 指定動態鏈接libpcre。
使用libpcre編譯時,需要確保系統中已經安裝了libpcre庫。若不使用libpcre,則默認使用系統libc庫中的標准正則表達式實現。
強烈推薦使用STATIC_PCRE
PREFIX:
指定安裝目錄,默認為/usr/local,其他諸如文檔之類的文件將會在PREFIX指定的相應目錄下。
DESTDIR:
指定安裝目錄,默認沒有設置,如果想將haproxy安裝一個沙盒中則可以指定該屬性。
考慮到我們的系統為Linux,內核2.6+版本的,CPU為x86_64的,可以使用如下命令編譯:
make TARGET=linux26 USE_STATIC_PCRE=1
以上參數值用於說明使用,重點是下面所要執行的命令:
為了簡便,我們這里不加USE_STATIC_PCRE參數。
make TARGET=linux26 PREFIX=/usr/local/haproxy-1.8.6
6、編譯命令:
make TARGET=linux26 ARCH=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
7、配置文件:
解壓后的安裝包里examples 文件夾下一些cfg格式的文件都是簡單的配置
配置:
View Codeglobal daemon # 后台方式運行 nbproc 1 pidfile /zjl/program/haproxy/conf/haproxy.pid defaults mode tcp #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK retries 2 #兩次連接失敗就認為是服務器不可用,也可以通過后面設置 option redispatch #當serverId對應的服務器掛掉后,強制定向到其他健康的服務器 option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接 maxconn 4096 #默認的最大連接數 timeout connect 5000ms #連接超時 timeout client 30000ms #客戶端超時 timeout server 30000ms #服務器超時 #timeout check 2000 #=心跳檢測超時 log 127.0.0.1 local0 err #[err warning info debug] ########test1配置################# listen test1 #這里是配置負載均衡,test1是名字,可以任意 bind 0.0.0.0:80 #這里是監聽的IP地址和端口,端口號可以在0-65535之間,要避免端口沖突 mode tcp #連接的協議,這里是tcp協議 #maxconn 4086 #log 127.0.0.1 local0 debug server s1 192.168.244.131:80 #負載的機器 server s2 192.168.244.130:80 #負載的機器,負載的機器可以有多個,往下排列即可8、啟動:
/zjl/program/haproxy/sbin/haproxy -f /zjl/program/haproxy/conf/haproxy.cfg
-f 是指定我們的配置文件的路徑。
9、驗證
在另外兩台機器192.168.244.130、192.168.244.131 上安裝了nginx
haproxy所在的機器為:192.168.244.128
配置haproxy.cfg 監聽端口 80 , 協議為http
重啟后多次訪問http://192.168.244.128 把訪問負載到192.168.244.130、192.168.244.131 這兩台機器上的nginx
10、配置監控頁面
haproxy帶有監控功能,而且配置簡單,直接在主配置文件中加入一下配置即可
用戶名/密碼 admin/admin
listen admin_stats bind 0.0.0.0:8888 mode http stats uri /haproxy stats realm Global\ statistics stats auth admin:admin給監控配置端口檢測:注意(check port 3306)
listen test1 bind 0.0.0.0:3306 mode tcp #maxconn 4086 #log 127.0.0.1 local0 debug server s1 192.168.111.101:3306 check port 3306 server s2 192.168.111.102:3306 check port 3306
2、配置文件詳解
haproxy 配置中分成五部分內容,分別如下:
1 、global: 參數是進程級的,通常是和操作系統相關。這些參數一般只設置一次,如果配置無誤,就不需要再次進行修改
2 、defaults: 配置默認參數,這些參數可以被用到frontend,backend,Listen組件
3 、frontend: 接收請求的前端虛擬節點,Frontend可以更加規則直接指定具體使用后端的backend
4 、 backend:后端服務集群的配置,是真實服務器,一個Backend對應一個或者多個實體服務器
5 、 Listen: 是 Fronted和backend的組合體
有關haproxy配置文件我們先簡單介紹,如下:
global配置段,用於設定全局配置參數。
代理配置段中,主要是使用defaults、frontend、backend、listen關鍵詞。
1、defaults配置段用於為所有其它配置段提供默認參數,這配置默認配置參數可由下一個“defaults”所重新設定。
2、frontend配置段用於定義一系列監聽的套接字,這些套接字可接受客戶端請求並與之建立連接。
3、backend配置段用於定義一系列“后端”服務器,代理將會將對應客戶端的請求轉發至這些服務器。
4、listen配置段通過關聯“前端”和“后端”定義了一個完整的代理,通常只對TCP流量有用。
在上述haproxy配置文件中,我們主要講解ACL的匹配規則。
acl is_dg hdr_beg(host) dg.test.com 該行定義一個is_dg規則,如果客戶端請求的是dg.test.com這個域名,則定義該規則為is_dg。
use_backend dgserver if is_dg 該定義一個dgserver服務器組,如果客戶端請求符合is_dg定義的規則,則把該客戶端的請求分發到dgserver服務器組。
acl is_ip src 192.168.5.140 該行定義一個is_ip規則,如果客戶端的IP地址是192.168.5.140,則定義該規則為is_ip。
use_backend acl if is_171 is_ip 該定義一個acl服務器組,如果客戶端請求同時符合is_ip和is_171定義的規則,則把該客戶端的請求分發到acl服務器組。
default_backend backend_default 該行定義一個默認服務器組,如果客戶端請求不符合上述定義的任何一個規則,則把該客戶端的請求分發到backend_default服務器組。
##全局配置信息### global log 127.0.0.1 local3 #[error warringinfo debug]#定義haproxy 日志級別 #log 127.0.0.1 local1 notice #log loghost local0 info maxconn 32768 #默認最大連接數 chroot /usr/local/haproxy #安裝目錄 uid 99 #運行haproxy 用戶 UID gid 99 #運行haproxy 用戶組gid daemon #以后台形式運行harpoxy nbproc 1 #設置harpoxy 的進程數量 pidfile /usr/local/haproxy/run/haproxy.pid #haproxy的進程PID文件 ulimit-n 65535 #ulimit 的數量限制 #debug #haproxy 調試級別,建議只在開啟單進程的時候調試 #quiet ####默認配置選項####### defaults log global mode http #設置haproxy的代理模式(7層代理http,4層代理tcp) maxconn 65535 #最大連接數 option httplog #設置日志類別為http日志 option httpclose #設置每次請求完畢后主動關閉http通道 option dontlognull #不記錄健康檢查日志信息 option forwardfor #如果后端服務器需要獲得客戶端的真實ip,需要配置此參數,可以從http header 中獲取客戶端的IP retries 3 #3次連接失敗就認為服務器不可用,也可以通過后面設置 option redispatch #設置serverID 對應的服務器掛掉后,強制定向到其他健康的服務器 stats refresh 30 # 設置統計頁面刷新時間間隔 option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的連接 balance roundrobin #設置默認負載均衡方式,輪詢方式 #balance source # 設置默認負載均衡方式,對源ip的hash,原理類似於nginx的ip_hash #balnace leastconn #設置默認負載均衡方式,最小連接數 contimeout 5000 #設置連接超時時間 clitimeout 50000 #設置客戶端超時時間 srvtimeout 50000 #設置服務器超時時間 timeout check 2000 #設置心跳檢查超時時間 #timeout http-request 10s #默認http請求超時時間 #timeout queue 1m #默認隊列超時時間 #timeout connect 10s #默認連接超時時間 #timeout client 1m #默認客戶端超時時間 #timeout server 1m #默認服務器超時時間 #timeout http-keep-alive10s #默認持久連接超時時間 #########設置監控頁面###### listen admin_status bind 0.0.0.0:81 #設置Frontend和Backend的組合體,監控組的名稱,按需要自定義名稱 mode http #設置http的7 層模式層 log 127.0.0.1 local3 err #錯誤日志記錄 stats refresh 30s #設置監控頁面刷新時間:5s stats uri /haproxy-stats # 設置監控頁面的url stats realm Frank \Frank #設置頁面提示信息 stats auth admin:admin123 #設置監控頁面的用戶名和密碼:admin,可以設置多個用戶名 stats auth Frank:Frank #設置監控頁面的用戶和密碼:Frank stats hide-version #隱藏監控頁面的HAproxy版本信息 stats admin if TRUE #設置手工啟動/禁用,后端服務器(haproxy-1.4.9以后版本) ########設置haproxy 錯誤頁面##### errorfile 403 /usr/local/haproxy/errorfiles/403.http errorfile 500 /usr/local/haproxy/errorfiles/500.http errorfile 502 /usr/local/haproxy/errorfiles/502.http errorfile 503 /usr/local/haproxy/errorfiles/503.http errorfile 504 /usr/local/haproxy/errorfiles/504.http ##### 設置frontend######### frontend http_80_in bind 0.0.0.0:80 #設置監聽端口,即haproxy提供的web服務端口,和lvs的vip 類似 mode http # http 的7層模式 log global #應用全局的日志設置 option httplog #啟用http的log option httpclose #每次請求完畢后主動關閉http通道,HA-proxy不支持keep-alive模式 option forwardfor #如果后端服務器需要獲得客戶端的真實IP,需要配置此參數,將可以從HttpHeader中獲得客戶端IP ####acl 策略配置###### acl frank_web hdr_reg(host) -i ^(www.test.com.sh|news.test.com.sh)$ #如果請求的域名滿足正則表達式中的2個域名返回true -i 是忽略大小寫 # acl frank_fund hdr_dom(host) -i fund.test.com.sh #如果請求的域名滿足fund.test.com.sh返回true -i是忽略大小寫 acl frank hdr(host) -i test.com.sh #如果請求的域名滿足test.com.sh返回true -i是忽略大小寫 #acl file_req url_sub -i killall= #在請求url中包含killall=,則此控制策略返回true,否則為false # acl dir_req url_dir -i allow #在請求url中存在allow作為部分地址路徑,則此控制策略返回true,否則返回false acl missing_cl hdr_cnt(Content-length)eq 0 #當請求的header中Content-length等於0時返回true #### Manage interface #### acl Frank_Manage path_dir /Frank/manage/ acl Frank_Network src 192.168.151.189 192.168.152.0/24 ## deny lb.html### acl Frank_lb path /lb.html ########acl策略匹配相應############# block if Frank_lb block if Frank_Manage !Frank_Network #block if missing_cl #當請求的header中Content-length等於0阻止請求返回403 #block if !file_req || dir_req #block表示阻止請求,返回403錯誤,當前表示如果不滿足策略file_req,或者滿足策略dir_req,則阻止請求 redirect prefix http://192.168.151.249 code 301 if frank #當訪問test.com.sh的時候,用http的301挑轉到http://192.168.151.249 use_backend server_web if frank_web #當滿足frank_web的策略時使用server_web的backend服務器 #use_backend server_blog if frank_fund #當滿足frank_fund的策略時使用server_blog的backend服務器 default_backend server_web #以上都不滿足的時候使用默認server_web的backend服務器 ##########backend的設置############## ####################backend server_web######################### backend server_web mode http #http的7層模式 balance roundrobin #負載均衡的方式,roundrobin平均方式 #cookie SERVERID insert indirect nocache #允許serverid插入cookie中,serverid后面可以定義 option httpchk GET /lb.html HTTP/1.0 #心跳檢測的文件 server 192.168.51.78 192.168.151.78:80 weight 1 cookie cookie78 check inter 1500 rise 3 fall 3 #服務器定義,cookie 78表示serverid為web78,check inter1500 是檢測心跳頻率,rise 3是3次正確認為服務器可用,fall 3是3次失敗認為服務器不可用,weight 1代表權重為1 server 192.168.151.79 192.168.151.79:80 weight 1 cookie cookie79 check inter 1500 rise 3 fall 3 #服務器定義,cookie 79表示serverid為web79,check inter1500 是檢測心跳頻率,rise 3 是3次正確認為服務器可用,fall 3 是3次失敗認為服務器不可用,weight 1代表權重為1另:
global daemon maxconn 60000 #ulimit -n至少為60018最大連接並發數 #user /var/sbin/haproxy #user haproxy #運行haproxy的用戶 #chroot /usr/local/haproxy #安裝根目錄 pidfile /var/run/haproxy.pid log 127.0.0.1 local2 defaults mode http log global #option http-keep-alive #使用keepAlive連接 option forwardfor #如果后端服務器需要獲得客戶端的真實ip,需要配置的參數,記錄客戶端IP在X-Forwarded-For頭域中 option http-server-close # 后端為動態應用程序建議使用http-server-close,后端為靜態建議使用http-keep-alive option httplog #開啟httplog,HAProxy會記錄更豐富的請求信息 option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接 #option httpchk GET /healthCheck.html #定義默認的健康檢查策略 option redispatch #當serverid對應的服務器掛掉后,強制定向到其他健康的服務器 balance roundrobin #設置默認負載均衡方式,輪詢方式 #balance source 設置默認負載均衡方式,類似於nginx的ip_hash #balance leastconn 設置默認負載均衡方式,請求轉發到具有最少連接數目的后端服務器,在會話時間較長的場景中推薦使用此算法。例如數據庫負載均衡等 timeout connect 2000ms #haproxy和服務端建立連接的最大時長,設置為1秒就足夠了。局域網內建立連接一般都是瞬間的 timeout client 10000ms #和客戶端保持空閑連接的超時時長,在高並發下可稍微短一點,可設置為10秒以盡快釋放連接 timeout server 8000ms #和服務端保持空閑連接的超時時長,局域網內建立連接很快,所以盡量設置短一些,特別是並發時,如設置為1-3秒 timeout http-request 12000ms #從連接創建開始到從客戶端讀取完整HTTP請求的超時時間,用於避免類DoS攻擊 timeout queue 5000ms #請求在隊列中排隊的最大時長 ########frontend前端配置############## frontend http-in bind *:80 #這里建議使用bind *:80的方式,要不然做集群高可用的時候有問題,vip切換到其他機器就不能訪問了 #maxconn 30000 #定義此端口上的maxconn最大連接並發數 #url地址重寫,條件 #acl login_AuthCallBack path_beg -i /Account/AuthCallBack? #acl login_AuthCallBack url_beg (/Account/AuthCallBack\?) #acl login_AuthCallBack path_reg (/Account/AuthCallBack\?) #acl login_AuthCallBack url_beg -i /Account/AuthCallBack? #測試可用1 #acl url_ms1 path_beg -i /ms1/ #定義ACL,當uri以/ms1/開頭時,ACL[url_ms1]為true #acl url_ms2 path_beg -i /ms2/ #同上,url_ms2 #acl web hdr(host) -i www.abc.com #acl后面是規則名稱,-i為忽略大小寫,后面跟的是要訪問的域名,如果訪問www.abc.com這個域名,就觸發web規則 #acl img hdr(host) -i img.abc.com #如果訪問img.abc.com這個域名,就觸發img規則。 #redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #測試可用1 重定向 #redirect prefix http://192.168.21.126:8089 if login_AuthCallBack #測試可用1 重定向 #redirect location http://192.168.21.126:8089 if login_AuthCallBack #redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #redirect location http://0.0.0.0:8000/ if login_AuthCallBack #use_backend youxi_pool if youxi #use_backend ms1 if url_ms1 #當[url_ms1]為true時,定向到后端服務群ms1中 #use_backend ms2 if url_ms2 #當[url_ms2]為true時,定向到后端服務群ms2中 #use_backend webserver if web #如果上面定義的web規則被觸發,即訪問www.abc.com,就將請求分發到webserver這個作用域。 #use_backend imgserver if img #如果上面定義的img規則被觸發,即訪問img.abc.com,就將請求分發到imgserver這個作用域。 default_backend dynamic_servers #其他情況時,定向到后端服務群default_servers中 backend dynamic_servers #定義后端服務群default_servers #balance roundrobin #棄用這行設置,會導致後端服務器誰優先寫入了cookie的值,則以後每次請求都會定向到此後端服務器(不會輪詢了) #cookie app_cook insert indirect nocache #server webser1 192.168.21.126:8076 cookie webser1 maxconn 300 check server webser1 192.168.21.126:8070 cookie webser1 maxconn 300 check server webser2 192.168.21.126:8071 cookie webser2 maxconn 300 check server webser3 192.168.21.126:8072 cookie webser3 maxconn 300 check server webser4 192.168.21.126:8073 cookie webser4 maxconn 300 check #backend ms1 #定義后端服務群ms1 # balance roundrobin #使用RR負載均衡算法 # cookie HA_STICKY_ms1 insert indirect nocache #會話保持策略,insert名為"HA_STICKY_ms1"的cookie # # #定義后端server[ms1.srv1],請求定向到該server時會在響應中寫入cookie值[ms1.srv1] # #針對此server的maxconn設置為300 # #應用默認健康檢查策略,健康檢查間隔和超時時間為2000ms,兩次成功視為節點UP,三次失敗視為節點DOWN # server ms1.srv1 192.168.8.111:8080 cookie ms1.srv1 maxconn 300 check inter 2000ms rise 2 fall 3 # # #同上,inter 2000ms rise 2 fall 3是默認值,可以省略 # server ms1.srv2 192.168.8.112:8080 cookie ms1.srv2 maxconn 300 check # #backend ms2 #定義后端服務群ms2 # balance roundrobin # cookie HA_STICKY_ms2 insert indirect nocache # server ms2.srv1 192.168.8.111:8081 cookie ms2.srv1 maxconn 300 check # server ms2.srv2 192.168.8.112:8081 cookie ms2.srv2 maxconn 300 check #backend imgserver # mode http # option httpchk /index.php # balance roundrobin # server img01 192.168.137.101:80 check inter 2000 fall 3 # server img02 192.168.137.102:80 check inter 2000 fall 3 ########統計頁面配置######## listen stats #定義監控頁面 bind *:2000 #綁定端口1080 maxconn 10 #默認的最大連接數 stats refresh 30s #每30秒更新監控數據 stats uri /stats #訪問監控頁面的uri #stats realm HAProxy\ Stats #監控頁面的認證提示 #stats auth admin:admin #設置監控頁面的用戶和密碼:admin,可以設置多個用戶名 #stats auth Frank:Frank #設置監控頁面的用戶和密碼:Frank #stats hide-version #隱藏統計頁面上HAProxy的版本信息 #登錄回調端口監聽 listen port8070_8071_8072_8073 bind *:8070 bind *:8071 bind *:8072 bind *:8073 #條件 acl login_AuthCallBack url_beg -i /Account/AuthCallBack? #測試可用1 #重定向 redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #測試可用1 #listen port8070 # bind *:8070 # #條件 # acl login_AuthCallBack url_beg -i /Account/AuthCallBack? #測試可用1 # #重定向 # redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #測試可用1 # #listen port8071 # bind *:8071 # #條件 # acl login_AuthCallBack url_beg -i /Account/AuthCallBack? #測試可用1 # #重定向 # redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #測試可用1 # #listen port8072 # bind *:8072 # #條件 # acl login_AuthCallBack url_beg -i /Account/AuthCallBack? #測試可用1 # #重定向 # redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #測試可用1 # #listen port8073 # bind *:8073 # #條件 # acl login_AuthCallBack url_beg -i /Account/AuthCallBack? #測試可用1 # #重定向 # redirect prefix http://192.168.21.201:8000 if login_AuthCallBack #測試可用1
參考:https://blog.csdn.net/king_kgh/article/details/75599083