HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。php
特色以下: 1、支持兩種代理模式:TCP(四層)和HTTP(七層),支持虛擬主機; 2、可以補充Nginx的一些缺點好比Session的保持,Cookie的引導等工做 3、支持url檢測後端的服務器出問題的檢測會有很好的幫助。 4、更多的負載均衡策略好比:動態加權輪循(Dynamic Round Robin),加權源地址哈希(Weighted Source Hash),加權URL哈希和加權參數哈希(Weighted Parameter Hash)已經實現 5、單純從效率上來說HAProxy更會比Nginx有更出色的負載均衡速度。 6、HAProxy能夠對Mysql進行負載均衡,對後端的DB節點進行檢測和負載均衡。 9、支持負載均衡算法:Round-robin(輪循)、Weight-round-robin(帶權輪循)、source(原地址保持)、RI(請求URL)、rdp-cookie(根據cookie) 10、不能作Web服務器即Cache。
下載地址:http://www.haproxy.org/download/1.8/src/haproxy-1.8.20.tar.gz
如沒法直接下載,能夠在網盤中下載:css
連接:https://pan.baidu.com/s/1o2CemcucfQ4zdGfb1yaaxA
提取碼:7baf 前端
# 1.編譯安裝haproxy tar xf haproxy-1.8.20.tar.gz cd haproxy-1.8.20/ make TARGET=linux2628 PREFIX=/usr/local/haproxy-1.8.20 make install cp /usr/local/sbin/haproxy /usr/sbin/ haproxy -v # 在haproxy安裝包內拷貝啓動腳本 cp examples/haproxy.init /etc/init.d/haproxy chmod 755 /etc/init.d/haproxy # haproxy建立配置文件目錄 useradd -r haproxy mkdir /etc/haproxy /var/lib/haproxy /var/run/haproxy
# 2.可經過yum直接安裝,版本較低1.5.18-8.el7,兩種方法均可以。
yum install haproxy -y
HAProxy配置文件的配置方法主要用兩種:一種是由前端(frontend)和後端(backend)配置塊組成,前端和後端均可以有多個。第二種方法是隻有一個listen配置快塊來同時實現前端和後端。咱們這裏主要介紹最經常使用的frontend和backend工做模式,這個也是推薦的配置方法。
同時前端(frontend)區域能夠根據HTTP請求的header信息來定義一些規則,而後將符合某規則的請求轉發到相應後端(backend)進行處理,這個咱們後面會詳細講解。linux
3.1 haproxy.cfg配置文件android
vim /etc/haproxy/haproxy.cfg global # 全局配置參數,進程級的,用來控制Haproxy啓動前的一些進程及系統設置 maxconn 10000 # 定義每一個haproxy進程的最大鏈接數,因爲每一個鏈接包括一個客戶端和一個服務器端,因此單個進程的TCP會話最大數目將是該值的兩倍 chroot /var/lib/haproxy # 增長安全性,改變當前工做目錄 user haproxy # 啓動用戶爲haproxy,也能夠寫成UID group haproxy # 啓動用戶組爲haproxy,也能夠寫成PID daemon # 以守護進程的方式運行 nbproc 8 # 設置haproxy啓動時的進程數,設置其CPU的核心數,可減小每一個進程的任務隊列,過多進程數也會致使進程崩潰 pidfile /var/lib/haproxy/haproxy.pid # 定義haproxy.pid的位置,注意目錄要事先存在,若是沒有須要提早建立。 log 127.0.0.1 local3 info # 全局的日誌配置,使用log關鍵字,指定使用127.0.0.1上的rsyslog服務中的local3日誌設備,記錄日誌等級爲info的日誌,
defaults # 配置一些默認的參數,能夠被frontend,backend,listen段繼承使用 maxconn 10000 # 最大鏈接數 mode http # mode {http|tcp|health} http是七層模式,tcp是四層模式,health是健康檢測,返回OK log global # 應用全局日誌配置 option httplog # 啓用日誌記錄HTTP請求,默認haproxy日誌記錄是不記錄HTTP請求的 option http-keep-alive # 啓用或禁用客戶端和服務端到haproxy之間的長鏈接。haproxy將處理全部請求和響應報文,請求完後haproxy兩端的鏈接都處於空閒狀態。 option dontlognull # 啓用該項,日誌中將不會記錄空鏈接。所謂空鏈接就是在上游的負載均衡器或者監控系統爲了探測該服務是否存活可用時,須要按期的鏈接或者獲取某一固定的
組件或頁面,或者探測掃描端口是否在監聽或開放等動做被稱爲空鏈接;官方文檔中標註,若是該服務上游沒有其餘的負載均衡器的話,建議不要使用該參數,
由於互聯網上的惡意掃描或其餘動做就不會被記錄下來 option http-server-close # 使用該參數,每處理完一個request時,haproxy都會去檢查http頭中的Connection的值,若是該值不是close,haproxy將會將其刪除,若是該值爲空將
會添加爲:Connection: close。使每一個客戶端和服務器端在完成一次傳輸後都會主動關閉TCP鏈接。與該參數相似的另一個參數是「option
forceclose」,該參數的做用是強制關閉對外的服務通道,由於有的服務器端收到Connection: close時,也不會自動關閉TCP鏈接,若是客戶端也不關閉,
鏈接就會一直處於打開,直到超時。 option redispatch # 在session失敗後,是否容許從新分配
option abortonclose # 當服務器負載很高的時候,自動結束掉當前隊列處理比較久的連接 timeout connect 5000ms # 設置成功鏈接到一臺服務器的最長等待時間,默認單位是毫秒 timeout client 50000ms # 設置鏈接客戶端發送數據時的成功鏈接最長等待時間,默認單位是毫秒 timeout server 50000ms # 設置服務器端迴應客戶度數據發送的最長等待時間,默認單位是毫秒 listen stats # 定義一個名爲stats的部分,理解爲frontend和backend的組合體 mode http # 定義爲http模式 bind 0.0.0.0:8888 # 定義監聽套接字 stats enable # 開啓WEB統計功能
stats refresh 30s # 頁面自動刷新時間30s stats uri /haproxy-status # web統計的URI爲 /haproxy-status stats auth haproxy:haproxy # 訪問web頁面的用戶名和密碼 frontend frontend_web_server # 定義一個名爲frontend_web_server的前端部分,用來匹配接收客戶所請求的域名,uri等,並針對不一樣的匹配,作不一樣的請求處理 bind 192.168.7.80:80 # 定義前端訪問的IP及端口 mode http # 定義爲HTTP模式 option httplog # 啓用記錄HTTP請求、會話狀態和計時器的功能 log global # 繼承global中的log定義 default_backend backend_web_server # 若是前面acl都沒有匹配到,默認的後端backend_web_server服務集羣 backend backend_web_server # 定義後端服務器集羣,以及對後端服務器的一些權重、隊列、鏈接數等選項的設置,我將其理解爲Nginx中的upstream塊。 option forwardfor header X-REAL-IP # 啓用X-Forwarded-For,在requests頭部插入客戶端IP發送給後端的server,使後端server獲取到客戶端的真實IP option httpchk HEAD / HTTP/1.0 # 開啓對後端服務器的健康檢測,經過GET / 來判斷後端服務器的健康狀況 balance source # 設置haproxy的調度算法爲源地址hash server web-7.72 192.168.7.72:80 cookie 1 check inter 2000 rise 3 fall 3 weight 1 # 後端服務器名稱爲web-7.72,後端服務器的IP及端口,指定該服務器的SERVERID爲1[cookie 1]
接受健康監測[check]、監測的間隔時長,單位毫秒[inter 2000],監測正常多少次後被認爲後端
服務器是可用的[rise 3]監測失敗多少次後被認爲後端服務器是不可用的[fall 3]、分發的權重
[weight 1] server web-7.73 192.168.7.73:80 cookie 2 check inter 2000 rise 3 fall 3 weight 2
server web-7.70 192.168.7.77:80 cookie 2 check inter 2000 rise 3 fall 3 backup # 上面所有down機後啓動備機[backup]
3.2 日誌配置web
前面在haproxy中已經定義了日誌級別爲local3,須要rsyslog在514端口監聽UDP協議,修改完成後重啓rsyslog服務正則表達式
vim /etc/rsyslog.conf # 增長以下三行 $ModLoad imudp $UDPServerRun 514 local3.* /var/log/haproxy.log systemctl restart rsyslog.service
3.3 web圖面截圖redis
3.4 haproxy的8種調度算法算法
1. roundrobin # 根據服務器權重輪詢的算法,能夠自定義權重,它支持慢啓動,並能在運行時修改權重,因此是一種動態算法。最多支持4095臺後端主機。 2. static-rr # 與roundrobin相似,static-rr也是一種輪詢算法,但它是靜態的,對後端主機數量無限制。 3. leastconn # 最小鏈接數算法,一種能夠根據後端主機鏈接數狀況進行調度的動態算法,支持慢啓動和運行時調整,可將新的請求調度至鏈接數較少的後端主機。與LVS中lc算法相似。 4. first # 根據服務器標識順序選擇服務器,當服務器承載的鏈接數達到maxconn的值後便將新情求調度至下一臺服務器。此算法只在一些特殊場景下使用。 5. source # 對請求的源IP地址進行hash處理,根據hash運算處理結果調度至後端服務器。可以使固定IP的請求始終調度至統一服務器。 6. uri # 根據請求的uri進行hash處理並調度以後端主機。 7. url_param # 將URL的參數進行判斷並進行hash計算,參數能夠自定義,任何的URL參數均可以。 8. hdr(name) # 根據請求中的HTTP報文首部的值進行hash計算並調度。name能夠是GET、USERAGENT等首部名。
4.1 ACL的語法sql
acl <aclname> <criterion> [flags] [operator] [<value>] ...
<aclname>:ACL名稱,區分字符大小寫,且其只能包含大小寫字母、數字、-(鏈接線)、_(下劃線)、.(點號)和:(冒號);haproxy中,acl能夠重名,這能夠把多個測試條件定義爲一個共同的acl;
<criterion>:測試標準,即對什麼信息發起測試;測試方式能夠由[flags]指定的標誌進行調整;而有些測試標準也能夠須要爲其在<value>以前指定一個操做符[operator];
[flags]:目前haproxy的acl支持的標誌位有3個:
-i:不區分<value>中模式字符的大小寫;
-f:從指定的文件中加載模式;
--:標誌符的強制結束標記,在模式中的字符串像標記符時使用;
<value>:acl測試條件支持的值有如下四類:
整數或整數範圍:如1024:65535表示從1024至65535;僅支持使用正整數(若是出現相似小數的標識,其爲一般爲版本測試),且支持使用的操做符有5個,分別爲eq、ge、gt、le和lt;
字符串:支持使用「-i」以忽略字符大小寫,支持使用「\」進行轉義;若是在模式首部出現了-i,能夠在其以前使用「--」標誌位;
正則表達式:其機制類同字符串匹配;
IP地址及網絡地址
同一個acl中能夠指定多個測試條件,這些測試條件須要由邏輯操做符指定其關係。條件間的組合測試關係有三種:「與」(默認即爲與操做)、「或」(使用「||」操做符)以及「非」(使用「!」操做符)。
4.2 用例
# 定義容許訪問的IP地址段和拒絕的IP地址段 acl accept_clients src 192.168.7.0/24 acl reject_clients src 192.168.5.0/24 tcp-request content accept if accept_clients tcp-request content reject if reject_clients tcp-request content reject # 此項代表不匹配前兩項的默認都拒絕 # 將源IP爲192.168.5.10的用戶禁止、將403的錯誤重定向到其餘服務器; frontend webservers bind *:80 default_backend webservs acl badguy src 192.168.5.10 block if badguy errorloc 403 http://www.baidu.com # 定義一個名叫php_web的acl,當請求的url末尾是以.php結尾的,將會被匹配到,如下兩種寫法任選其一 acl php_web url_reg /*.php$ acl php_web path_end .php # 定義一個名叫static_web的acl,當請求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif結尾的,將會被匹配到,如下兩種寫法任選其一 acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$ acl static_web path_end .gif .png .jpg .css .js .jpeg # 若是知足策略php_web時,就將請求交予backend php_server use_backend php_server if php_web # 若是知足策略static_web時,就將請求交予backend static_server use_backend static_server if static_web # 匹配XX開始的 acl static_d path_beg /static /small /big # 匹配首頁 acl index_page path_reg ^/$ # 匹配User-Agent類型 acl ua hdr_reg(User-Agent) -i iphone android # 匹配訪問的域名 acl club hdr_reg(host) -i club.jesse.com # 匹配相關的ACL策略就進行跳轉 redirect prefix https://www.baidu.com if ua static_d club # 讀寫分離: acl read method GET acl read method HEAD acl write method PUT acl write method POST use_backend imgservers if read use_backend uploadservers if write