一、安裝相關軟件庫
yum install -y gccphp
二、建立路徑下載安裝包
mkdir –p /zjl/softwarehtml
wget http://download.openpkg.org/components/cache/haproxy/haproxy-1.8.6.tar.gz前端
三、建立一個不能登陸的用戶管理HAProxy
groupadd HAProxylinux
useradd -s /sbin/nologin –M –g HAProxy HAProxynginx
四、建立安裝目錄:
建立安裝目錄: mkdir –p /zjl/programweb
五、編譯參數說明(轉載自:http://blog.sina.com.cn/s/blog_51d3553f0100u1bb.html):
make TARGET=os ARCH=arch CPU=cpu USE_xxx=1 …正則表達式
編譯以前,首先查看一下系統內核,由於參數與系統內核有關。 uname –r 或 uname –aredis
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
六、編譯命令:
make TARGET=linux26 ARCH=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
七、配置文件:
解壓後的安裝包裏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 #負載的機器,負載的機器能夠有多個,往下排列便可八、啓動:
/zjl/program/haproxy/sbin/haproxy -f /zjl/program/haproxy/conf/haproxy.cfg
-f 是指定咱們的配置文件的路徑。
九、驗證
在另外兩臺機器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
十、配置監控頁面
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
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關鍵詞。
一、defaults配置段用於爲全部其它配置段提供默認參數,這配置默認配置參數可由下一個「defaults」所從新設定。
二、frontend配置段用於定義一系列監聽的套接字,這些套接字可接受客戶端請求並與之創建鏈接。
三、backend配置段用於定義一系列「後端」服務器,代理將會將對應客戶端的請求轉發至這些服務器。
四、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