HAProxy.md

HAProxy

代理http
一、正向代理
二、反向代理javascript

代理做用:web緩存(加速)、反向代理、內容路由(根據流量及內容類型等將請求轉發至特定服務器)、轉碼器;css

在代理服務器上添加Via首部;html

緩存的做用:
一、減小冗餘內容傳輸:
二、節省帶寬、緩解網絡瓶頸;
三、下降了對原始服務器的請求壓力:
四、下降了傳輸延遲:前端

HAProxy:只是http協議的反向代理,不提供緩存功能:但額外支持對tcp層對基於tcp通訊的應用作LB:java

yum install haproxy -y
rpm -ql haproxy
/etc/haproxy/haproxy.cfg
/usr/sbin/haproxy
......

haproxy 配置中分紅五部份內容,分別以下:node

一、global:參數是進程級的,一般是和操做系統相關。這些參數通常只設置一次,若是配置無誤,就不須要再次進行修改;git

二、defaults:配置默認參數,這些參數能夠被用到 frontend,backend,Listen 組件;
三、frontend:接收請求的前端虛擬節點,Frontend 能夠更加規則直接指定具體使用後端的 backend;
四、backend:後端服務集羣的配置,是真實服務器,一個 Backend 對應一個或者多個實體服務器;
五、Listen Fronted 和 backend 的組合體。github

HAProxy 配置文件詳解

進程管理及安全相關的參數web

  • chroot :修改haproxy的工做目錄至指定的目錄並在放棄權限以前執行chroot()操做,能夠提高haproxy的安全級別,不過須要注意的是要確保指定的目錄爲空目錄且任何用戶均不能有寫權限;
    -daemon:i讓haproxy以守護進程的方式工做於後臺,其等同於「-D」選項的功能,固然,也能夠在命令行中以「-db」選項將其禁用;gid :以指定的GID運行haproxy,建議使用專用於運行haproxy的GID,以避免因權限問題帶來風險:
  • group :同gid,不過指定的組名:
  • log
    [max level[min level]]:定義全局的syslog服務器,最多能夠定義兩個:
  • log-send-hostname[ ]:在syslog信息的首部添加當前主機名,能夠爲「string」指定的名稱,也能夠缺省使用當前主機名;
  • nbproc :指定啓動的haproxy進程的個數,只能用於守護進程模式的haproxy;默認只啓動一個進程,鑑於調試困難等多方面的緣由,通常只在單進程僅能打開少數文件描述符的場景中才使用多進程模式:
  • pidfile:
  • uid:以指定的UI0身份運行haproxy進程:
  • ulimit-n:設定每進程所可以打開的最大文件描述符數目,默認狀況下其會自動進行計算,所以不推薦修改此選項;user:同uid,但使用的是用戶名:
  • stats:
  • node:定義當前節點的名稱,用於HA場景中多haproxy進程共享同一個IP地址時;
  • description:當前實例的描述信息:

性能調整相關的參數正則表達式

  • maxconn :設定每一個haproxy進程所接受的最大併發鏈接數,其等同於命令行選項「-n」;「ulimit-
    n」自動計算的結果正是參照此參數設定的:
  • maxpipes ;haproxy使用pipe完成基於內核的tcp報文重組,此選項則用於設定每進程所容許使用的最大pipe個數;每一個pipe會打開兩個文件描述符,所以,「ulimit-n」自動計算時會根據須要調大此值:默認爲maxconn/4,其一般會顯得過大:
  • noepoll:在Linux系統上禁用epoll機制;
  • nokqueue:在BSD系統上禁用kqueue機制:
  • nopoll:禁用pol1機制:
  • nosepoll:在Linux禁用啓發式epoll機制:
  • nosplice:禁止在Linux套接字上使用內核tcp重組,這會致使更多的recv/send系統調用:不過,在Linux 2.6.25-
    28系列的內核上,tcp重組功能有bug存在:
  • spread-checks <0..50,in percent>:在haproxy後端有着衆多服務器的場景中,在精確的時間間隔後統一對衆服務器進行健康情況檢查可能會帶來意外問題;此選項用於將其檢查的時間間隔長度上增長或減少必定的隨機時長;
  • tune.bufsize :設定buffer的大小,一樣的內存條件下,較小的值可讓haproxy有能力接受更多的併發鏈接,較大的值可讓某些應用程序使用較大的cookie信息;默認爲16384,其能夠在編譯時修改,不過強烈建議使用默認值:
  • tune.chksize :設定檢查緩衝區的大小,單位爲字節:更大的值有助於在較大的頁面中完成基於字符串或模式的文本查找,但也會佔用更多的系統資源;不建議修改:
  • tune.maxaccept :設定haproxy進程內核調度運行時一次性能夠接受的鏈接的個數,較大的值能夠帶來較大的吞吐率,默認在單進程模式下爲10e,多進程模式下爲8,設定爲-1能夠禁止此限制:通常不建議修改:
  • tune.maxpollevents :設定一次系統調用能夠處理的事件最大數,默認值取決於05;其值小於2e0時可節約帶寬,但會略微增大網絡延遲,而大於2e0時會下降延遲,但會稍稍增長網絡帶寬的佔用量:
  • tune.maxrewrite
    :設定爲首部重寫或追加而預留的緩衝空間,建議使用1024左右的大小:在須要使用更大的空間時,haproxy會自動增長其值:
  • tune.rcvbuf.client
  • tune.rcvbuf.server <number):設定內核套接字中服務端或客戶端接收緩衝的大小,單位爲字節;強烈推薦使用默認值;
  • tune.sndbuf.client:
  • tune.sndbuf.server:

Debug相關的參數

  • debug
  • quiet

配置文件中的關鍵字參考

一、balance [ ]
balance url_param [check_post[<max_wait>]]

定義負般均衡算法,可用於「defaults」、「listen」和「backend」. 用於在負載均衡場景中挑選一個server,其僅應用於持久信息不可用的條件下或須要將一個鏈接從新派發至另外一個服務器時。支持的算法有:

  • roundrobin:基於權重進行輪叫,在服務器的處理時間保持均勻分佈時,這是最平衡、最公平的算法。此算法是動態的,這表示其權重能夠在運行時進行調整,不過,在設計上,每一個後端服務器僅能最多接受4128個鏈接:
  • static-rr:基於權重進行輪叫,與roundrobin相似,可是爲靜態方法,在運行時調整其服務器權重不會生效;不過,其在後端服務器鏈接數上沒有限制:
  • leastconn:新的鏈接請求被派發至具備最少鏈接數目的後端服務器;在有着較長時間會話的場景中推薦使用此算法,如LDAP、S0L等,其並不太適用於較短會話的應用層協議,如Hmp:此算法是動態的,能夠在運行時調整其權重:
  • source:將請求的源地址進行hash運算,並由後端服務器的權重總數相除後派發至某匹配的服務器:這可使得同一個客戶端IP的請求始終被派發至某特定的服務器;不過,當服務器權重總數發生變化時,如某服務器巖機或添加了新的服務器,許多客戶端的請求可能會被派發至與此前請求不一樣的服務器;經常使用於負載均衡無cookie功能的基於TCP的協議;其默認爲靜態,不過也可使用hash-type修改此特性;uri:對URI的左半部分(「問題」標記以前的部分)或整個URI進行hash運算,並由服務器的總權重相除後派發至某匹配的服務器:這可使得對同一個URI的請求老是被派發至某特定的服務器,除非服務器的權重總數發生了變化:此算法經常使用於代理緩存或反病毒代理以提升緩存的命中率:須要注意的是,此算法僅應用於HTTP後端服務器場景;其默認爲靜態算法,不過也可使用hash-type修改此特性:
  • url param:經過 爲URL指定的參數在每一個HTTP GET請求中將會被檢索;若是找到了指定的參數且其經過等於號「=」被賦予了一個值,那麼此值將被執行hash運算並被服務器的總權重相除後派發至某匹配的服務器:此算法能夠經過追蹤請求中的用戶標識進而確保同一個用戶ID的請求將被送往同一個特定的服務器,除非服務器的總權重發生了變化;若是某請求中沒有出現指定的參數或其沒有有效值,則使用輪叫算法對相應請求進行調度:此算法默認爲靜態的,不過其也可使用hash-type修改此特性:
  • hdr( ):對於每一個HTTP請求,經過 指定的HTTP首部將會被檢索:若是相應的首部沒有出現或其沒有有效值,則使用輪叫算法對相應請求進行調度;其有一個可選選項「use_domain_only」,可在指定檢索相似Host類的首部時僅計算域名部分(好比經過wmww.magedu.
    com來講,僅計算magedu字符串的hash值)以下降hash算法的運算量:此算法默認爲靜態的,不過其也可使用hash-type修改此特性:
  • rdp-cookie
  • rdp-cookie(name):

二、bind bind [

]:<port_range> [,…]
bind [
]: [,..] interface

此指令僅能用於frontend和listen區段,用於定義一個或幾個監聽的套接字。

<address> :可選選項,其能夠爲主機名、IPv4地址、IPv6地址或*;省略此選項、將其指定爲*或e.e.e.
0時,將監聽當前系統的全部IPv4地址:
<port_range>:能夠是一個特定的TCP端口,也但是一個端口範圍(如5005-5010)
,代理服務器將經過指定的端口來接收客戶端請求;須要注意的是,每組監聽的套接字- - address:port
在同一個實例上只能使用一次,並且小於1024的端口須要有特定權限的用戶才能使用,這可能須要經過uid參數來定義;
:指定物理接口的名稱,僅能在Linux系統上使用:其不能使用接口別名,而僅能使用物理接口名稱,並且只有管理有權限指定綁定的物理接口:

三、bind
bind [

]:<port_range>[,……]
bind [
]:<port_range>[,..interface
此指令僅能用於frontend和listen區段,用於定一個或幾個監聽的套接字。

:可選選項,其能夠爲主機名、IPv4地址、IPv6地址或*:省略此選項、將其指定爲*或e.e.e. 0時,將監聽當前系統的全部IPv4地址: :能夠是一個特定的TCP端口,也但是一個端口範圍(如5005-5010) ,代理服務器將經過指定的端口來接收客戶端請求:須要注意的是,每組監聽的套接字 在同一個實例上只能使用一次,並且小於1024的端口須要有特定權限的用戶才能使用,這可能須要經過uid參數來定義; :指定物理接口的名稱,僅能在Linux系統上使用;其不能使用接口別名,而僅能使用物理接口名稱,並且只有管理有權限指定綁定的物理接口:

四、mode

mode { tcp|http|health}
設定實例的運行模式或協議。當實現內容交換時,前端和後端必須工做於同一種模式(通常說來都是HTTP模式),不然將沒法啓動實例。
tcp:實例運行於純TCP模式,在客戶端和服務器端之間將創建一個全雙工的鏈接,且不會對7層報文作任何類型的檢查;此爲默認模式,一般用於SSL、SSH、SMTP等應用;http:實例運行於HTTP模式,客戶端請求在轉發至後端服務器以前將被深度分析,全部不與RFC格式兼容的請求都會被拒絕;health:實例工做於health模式,其對入站請求僅響應「OK」信息並關閉鏈接,且不會記錄任何日誌信息;此模式將用於響應外部組件的健康狀態檢查請求;目前業講,此模式已經廢棄,由於tcp或http模式中的monitor關鍵字可完成相似功能:

四、hash-type

hash-type
定義用於將hash碼映射至後端服務器的方法;其不能用於frontend區段;可用方法有map-
based和consistent,在大多數場景下推薦使用默認的map-based方法。
map-based:hash表是一個包含了全部在線服務器的靜態數組。其hash值將會很是平滑,會將權重考慮在列,但其爲靜態方法,對在線服務器的權重進行調整將不會生效,這意味着其不支持慢速啓動。此外,挑選服務器是根據其在數組中的位置進行的,所以,當一臺服務器巖機或添加了一臺新的服務器時,大多數鏈接將會被從新派發至一個與此前不一樣的服務器上,對於緩存服務器的工做場景來講,此方法不甚適用。
consistent:hash表是一個由各服務器填充而成的樹狀結構:基於hash鍵在hash樹中查找相應的服務器時,最近的服務器將被選中。此方法是動態的,支持在運行時修改服務器權重,所以兼容慢速啓動的特性。添加一個新的服務器時,僅會對一小部分請求產生影響,所以,尤爲適用於後端服務器爲cache的場景。不過,此算法不甚平滑,派發至各服務器的請求未必能達到理想的均衡效果,所以,可能須要不時的調整服務器的權重以得到更好的均衡性。

五、log

log global
Log

[ [ ]]
爲每一個實例啓用事件和流量日誌,所以可用於全部區段。每一個實例最多能夠指定兩個log參數,不過,若是使用了log global」且"global「段已經定了兩個log參數時,多餘了log參數將被忽略。
global:當前實例的日誌系統參數同「global」段中的定義時,將使用此格式:每一個實例僅能定義一次1。g global」語句,且其沒有任何額外參數:

:定義日誌發往的位置,其格式之一能夠爲 ,其中的port爲UDP協議端口,默認爲514:格式之二爲Unix套接字文件路徑,但須要留心chroot應用及用戶的讀寫權限; :能夠爲syslog系統的標準facility之一; :定義日誌級別,即輸出信息過濾器,默認爲全部信息;指定級別時,全部等於或高於此級別的日誌信息將會被髮送;

六、maxconn

maxconn
設定一個前端的最大併發鏈接數,所以,其不能用於backend區段。對於大型站點來講,能夠儘量提升此值以便讓haproxy管理鏈接隊列,從而避免沒法應答用戶請求。固然,此最大值不能超出「global」段中的定義。此外,須要留心的是,haproxy會爲每一個鏈接維持兩個緩衝,每一個緩衝的大小爲8KB,再加上其它的數據,每一個鏈接將大約佔用17KB的RAM空間。這意味着通過適當優化後,有着1GB的可用RAM空間時將能維護40000-50000併發鏈接。
若是爲 指定了一個過大值,極端場景下,其最終佔據的空間可能會超出當前主機的可用內存,這可能會帶來意想不到的結果;所以,將其設定了一個可接受值方爲明智決定。其默認爲2000。

七、default_backend

default backend
在沒有匹配的「usebackend"規則時爲實例指定使用的默認後端,所以,其不可應用於backend區段。在「frontend「和「backend「之間進行內容交換時,一般使用「use-backend"定義其匹配規則;而沒有被規則匹配到的請求將由此參數指定的後端接收。
:指定使用的後端的名稱:
使用案例:
use backend dynamic if url_dyn use_backend static if url_css url_img extension_img default backend dynamic

九、server

server

[:port ][param*]

後端聲明一個server,所以,不能用於defaults和frontend區段。
:爲此服務器指定的內部名稱,其將出如今日誌及警告信息中;若是設定了「http-send-server-
name",它還將被添加至發往此服務器的請求首部中:

:此服務器的的IPv4地址,也支持使用可解析的主機名,只不過在啓動時須要解析主機名至相應的IPv4地址: [:port]:指定將鏈接請求所發往的此服務器時的目標端口,其爲可選項;未設定時,將使用客戶端請求時的同一相端口; [param*]:爲此服務器設定的一系參數;其可用的參數很是多,具體請參考官方文檔中的說明,下面僅說明幾個經常使用的參數;服務器或默認服務器參數: backup:設定爲備用服務器,僅在負載均衡場景中的其它server均不可用於啓用此server; check:啓動對此server執行健康狀態檢查,其能夠藉助於額外的其它參數完成更精細的設定,如: inter :設定健康狀態檢查的時間間隔,單位爲毫秒,默認爲2000;也可使用fastinter和downinter來根據服務器端狀態優化此時間延遲: rise :設定健康狀態檢查中,某高線的server從離線狀態轉換至正常狀態須要成功檢查的次數; fall :確認server從正常狀態轉換爲不可用狀態須要檢查的次數; cookie :爲指定server設定cookie值,此處指定的值將在請求入站時被檢查,第一次爲此值挑選的server將在後續的請求中被選中,其目的在於實現持久鏈接的功能: maxconn :指定此服務器接受的最大併發鏈接數;若是發往此服務器的鏈接數目高於此處指定的值,其將被放置於請求隊列,以等待其它鏈接被釋放: maxqueue :設定請求隊列的最大長度; observe :經過觀察服務器的通訊情況來斷定其健康狀態,默認爲禁用,其支持的類型有「layer4」和「layer7」,「layer7」僅能用於http代理場景: redir :啓用重定向功能,將發往此服務器的GET和HEAD請求均以302狀態碼響應;須要注意的是,在prefix後面不能使用/,且不能使用相對地址,以避免形成循環;例如: server srv1 192.168.200.254:80 redir http://imageserver.test.com check 注意URL後面不是加/;http://www.test.com/ weight :權重,默認爲1,最大值爲256,0表示不參與負載均衡;

檢查方法:

檢查方法:
option httpchk 
option httpchk <uri>
option httpchk <method><uri>
option httpchk<method><uri><version>:不能用於frontend段,例如:

backend https_relay 
mode tcp 
option httpchk OPTIONS*HTTP/1.1\r\nHost:\www.test.com server apache1 192.168.1.1:443 check port 80 使用案例: server first 192.168.200.100:1080 cookie first check inter 1000 server second 192.168.200.101:1080 cookie second check inter 1000 

十、stats enable

啓用基於程序編譯時默認設置的統計報告,不能用於「frontend」區段。只要沒有另外的其它設定,它們就會使用以下的配置:
-stats uri:/haproxy?stats
-stats realm:"HAProxy Statistics"
-stats auth:no authentication
-stats scope:no restriction

儘管「stats enable」一條就可以啓用統計報告,但仍是建議設定其它全部的參數,以避免其依賴於默認設定而帶來非期後果。下面是一個配置案例。

backend public_www
server websrv1 172.16.100.11:80
stats enable 
stats hide-version 
stats scope 
stats uri /haproxyadmin?stats 
stats realm Haproxy\ Statistics 
stats auth statsadmin:password stats auth statsmaster:password 

十一、stats hide-version

stats hide-version啓用統計報告並隱藏HAProxy版本報告,不能用於「frontend」區段。默認狀況下,統計頁面會顯示一些有用信息,包括HAProxy的版本號,然而,向全部人公開HAProxy的精確版本號是很是有風險的,由於它能幫助惡意用戶快速定位版本的缺陷和漏洞。儘管"stats hide-
version」一條就可以啓用統計報告,但仍是建議設定其它全部的參數,以避免其依賴於默認設定而帶來非期後果。具體請參照「stats enable」一節的說明。

十二、stats admin

stats admin{if |unless}
在指定的條件知足時啓用統計報告頁面的管理級別功能,它容許經過web接口啓用或禁用服務器,不過,基於安全的角度考慮,統計報告頁面應該儘量爲只讀的。此外,若是啓用了HAProxy的多進程模式,啓用此管理級別將有可能致使異常行爲。
目前來講,POST請求方法被限制於僅能使用緩衝區減去保留部分以外的空間,所以,服務器列表不能過長,不然,此請求將沒法正常工做。
所以,建議一次僅調整少數幾個服務器。下面是兩個案例,第一個限制了僅能在本機打開報告頁面時啓用管理級別功能,第二個定義了僅容許經過認證的用戶使用管理級別功能。

backend stats_localhost 
stats enable 
stats admin if LOCALHOST 

backend stats_auth 
stats enable 
stats auth haproxyadmin:password stats admin if TRUE 

1三、capture request header

capture request header len
捕獲並記錄指定的請求首部最近一次出現時的第一個值,僅能用於「frontend」和「listen」區段。捕獲的首部值使用花括號{}括起來後添加進日誌中。若是須要捕獲多個首部值,它們將以指定的次序出如今日誌文件中,並以豎線1」做爲分隔符。不存在的首部記錄爲空字符串,最常須要捕獲的首部包括在虛擬主機環境中使用的「Host」、上傳請求首部中的「Content-1ength」、快速區別真實用戶和網絡機器人的User-
agent」,以及代理環境中記錄真實請求來源的「X-Forward-For」。
:要捕獲的首部的名稱,此名稱不區分字符大小寫,但建議與它們出如今首部中的格式相同,好比大寫首字母。須要注意的是,記錄在日誌中的是首部對應的值,而非首部名稱。
<1length>:指定記錄首部值時所記錄的精確長度,超出的部分將會被忽略。
能夠捕獲的請求首部的個數沒有限制,但每一個捕獲最多隻能記錄64個字符。爲了保證同一個frontend中日誌格式的統一性,首部捕獲僅能在f rontend中定義。

1四、capture response header

capture response header len
捕獲並記錄響應首部,其格式和要點同請求首部。

1五、option httplog

option httplog [ clf ]
啓用記錄HTTP請求、會話狀態和計時器的功能。
clf:使用CLF格式來代替HAProxy默認的HTTP格式,一般在使用僅支持CLF格式的特定日誌分析器時才須要使用此格式。
默認狀況下,日誌輸入格式很是簡陋,由於其僅包括源地址、目標地址和實例名稱,而「option httplog」參數將會使得日誌格式變得豐富許多,其一般包括但不限於HTTP請求、鏈接計時器、會話狀態、鏈接數、捕獲的首部及cookie、「frontend」、「backend」及服務器名稱,固然也包括源地址和端口號等。

1六、option logasap
no option logasap

option logasap
no option logasap

啓用或禁用提早將HTTP請求記入日誌,不能用於「backend」區段。
默認狀況下,HTP請求是在請求結束時進行記錄以便能將其總體傳輸時長和字節數記入日誌,由此,傳較大的對象時,其記入日誌的時長可能會略有延遲。option
1ogasap」參數可以在服務器發送complete首部時即時記錄日誌,只不過,此時將不記錄總體傳輸時長和字節數。此情形下,捕獲「Content-
Length」響應首部來記錄傳輸的字節數是一個較好選擇。下面是一個例子。

listen http_proxy 0.0.0.0:80
    mode http 
    option httplog
    option logasap
    1og 172.16.100.9 loca12

1七、option forwardfor

option forwardfo \ [except ] header ][if-none]
容許在發往服務器的請求首部中插入「X-Forwarded-For」首部。
:可選參數,當指定時,源地址爲匹配至此網絡中的請求都禁用此功能。
:可選參數,可以使用一個自定義的首部,如「x-client」來替代「X-Forwarded-
For」。有些獨特的web服務器的確須要用於一個獨特的首部。
if-none:僅在此首部不存在時纔將其添加至請求報文問道中。
HAProxy工做於反向代理模式,其發往服務器的請求中的客戶端IP均爲HAProxy主機的地址而非真正客戶端的地址,這會使得服務器端的日誌信息記錄不了真正的請求來源,「X-Forwarded-
For」首部則可用於解決此問題。HAProxy能夠向每一個發往服務器的請求上添加此首部,並以客戶端IP爲其value.
須要注意的是,HAProxy工做於隧道模式,其僅檢查每個鏈接的第一個請求,所以,僅第一個請求報文被附加此首部。若是想爲每個請求都附加此首部,請確保同時使用了「option httpclose」、「option forceclose」和「option http-server-close」幾個option.
下面是一個例子。

frontend www 
    mode http 
    option forwardfor except 127.0.0.1

1八、errorfile

errorfile
在用戶請求不存在的頁面時,返回一個頁面文件給客戶端而非由haproxy生成的錯誤代碼;可用於全部段中。
:指定對HTTP的哪些狀態碼返回指定的頁面:這裏可用的狀態碼有200、400、40三、40八、500、50二、503和5e4;
:指定用於響應的頁面文件;

例如:

errorfile 400/etc/haproxy/errorpages/400badreq.httperrorfile 403 /etc/haproxy/errorpages/403forbid.http errorfile
503 /etc/haproxy/errorpages/503sorry.http

1九、errorloc和errorlog302

errorloc
errorloc302
請求錯誤時,返回一個HTTP重定向至某URL的信息;可用於全部配置段中。
:指定對HTTP的哪些狀態碼返回指定的頁面:這裏可用的狀態碼有200、400、40三、40八、500、50二、503和504;
:Location首部中指定的頁面位置的具體路徑,能夠是在當前服務器上的頁面的相對路徑,也可使用絕對路徑;須要注意的是,若是URI自身錯誤時產生某特定狀態碼信息的話,有可能會致使循環定向:
須要留意的是,這兩個關鍵字都會返回302狀態嗎,這將使得客戶端使用一樣的HTTP方法獲取指定的URL,對於非GET法的場景(如POST)來講會產生問題,由於返回客戶的URL是不容許使用GET之外的其它方法的。若是的確有這種問題,可使用errorloc303來返回303狀態碼給客戶端

20、errorlog303

errorloc303
請求錯誤時,返回一個HTTP重定向至某URL的信息給客戶端;可用於全部配置段中。
:指定對HTTP的哪些狀態碼返回指定的頁面;這裏可用的狀態碼有400、40三、40八、500、50二、503和504;
:Location首部中指定的頁面位置的具體路徑,能夠是在當前服務器上的頁面的相對路徑,也可使用絕對路徑:須要注意的是,若是URI自身錯誤時產生某特定狀態碼信息的話,有可能會致使循環定向:

例如

backend webserver 
    server 172.16.100.6 172.16.100.6:80 check maxconn 3000 cookie srve1
    server 172.16.100.7 172.16.100.7:80 check maxconn 3000 cookie srve2
    errorloc 403 /etc/haproxy/errorpages/sorry.htm 
	errorloc 503 /etc/haproxy/errorpages/sorry.htm

ACL

haproxy的ACL用於實現基於請求報文的首部、響應報文的內容或其它的環境狀態信息來作出轉發決策,這大大加強了其配置彈性。其配置法則一般分爲兩步,首先去定義ACL,即定義一個測試條件,然後在條件獲得知足時執行某特定的動做,如阻止請求或轉發至某特定的後端。定義ACL的語法格式以下。

acl <aclname><criterion>[flags][operator]<value>..

<aclname>:ACL名稱,區分字符大小寫,且其只能包含大小寫字母、數字、-(鏈接線)、(下劃線)、.(點號)和:(冒號)
:haproxy中,ac1能夠重名,這能夠把多個測試條件定義爲一個共同的ac1:
<criterion>:測試標準,即對什麼信息發起測試;測試方式能夠由[flags]指定的標誌進行調整;而有些測試標準也能夠須要爲其在<
value>以前指定一個操做符[operator][flags]:目前haproxyac1支持的標誌位有3個:
-i:不區分<value>中模式字符的大小寫:
-f:從指定的文件中加載模式:
-:標誌符的強制結束標記,在模式中的字符串像標記符時使用:
<value>:ac1測試條件支持的值有如下四類:
整數或整數範圍:如1024:65535表示從1024至65535;僅支持使用正整數(若是出現相似小數的標識,其爲一般爲版本測試)
,且支持使用的操做符有5個,分別爲eqgegtlelt;字符串:支持使用「-i」以忽略字符大小寫,支持使用「\」進行轉義;若是在模式首部出現了-i,能夠在其以前使用「--」標誌位;正則表達式:其機制類同字符串匹配:
IP地址及網絡地址

同一個ac1中能夠指定多個測試條件,這些測試條件須要由邏輯操做符指定其關係。條件間的組合測試關係有三種:「與」(默認即爲與操做)
、「或」(使用「I1」操做符)以及「非」(使用「!」操做符)。

經常使用的測試標準(criteria)

一、be_sess_rate
be_sess_rate(backend)
用於測試指定的backend上會話建立的速率(即每秒建立的會話數)是否知足指定的條件:經常使用於在指定backend上的會話速率太高時將用戶請求轉發至另外的backend,踐用於阻止攻擊行爲。例如:

backend dynamic 
    mode http 
    acl being scanned be_sess rate gt 50 
    redirect location /error_pages/denied.html if being_scanned

二、fe_sess_rate(frontend)

fe_sess_rate(frontend)

用於測試指定的frontend(或當前frontend)上的會話建立速率是否知足指定的條件:經常使用於爲frontend指定一個合理的會話建立速率的上限以防止服務被濫用。例以下面的例子限定入站郵件速率不能大於50封/秒,全部在此指定範圍以外的請求都將被延時50毫秒。

frontend mail 
    bind :25
    mode tcp 
    maxconn 500
    ac1 too_fast fe_sess_rate ge 50
    tcp-request inspect-delay 500ms 
    tcp-request content accept if !too_fast 
    tcp-request content accept if WAIT_END

三、hdr

hdr(header)

用於測試請求報文中的全部首部或指定首部是否知足指定的條件:指定首部時,其名稱不區分大小寫,且在括號「()
」中不能有任何多餘的空白字符。測試服務器端的響應報文時可使用shdr()。例以下面的例子用於測試首部Connection的值是否爲close。
hdr(Connection)-i close

4 、method
method
測試HTTP請求報文中使用的方法。

五、path_beg
用於測試請求的URL是否以 指定的模式開頭。下面的例子用於測試URL是否以/static、/images、/javascript或/stylesheets頭。
acl url_static path_beg -i /static /images /javascript /stylesheets

六、path_end
用於測試請求的URL是否以 指定的模式結尾。例如,下面的例子用戶測試URL是否以jpg、gif、png、css或js結尾。
ac1 url_static path_end-i .jpg .gif .png .css .js

七、hdr_beg
用於測試請求報文的指定首部的開頭部分是否符合
指定的模式。例如,下面的例子用記測試請求是否爲提供靜態內容的主機img、video、download或ftp。
acl host_static hdr_beg(host)-i img. video. download. ftp.

八、hdr_end <string>
用於測試請求報文的指定首部的結尾部分是否符合 指定的模式。例如,下面的例子用記測試請求是否爲
url_beg:
url_end:

path_reg
url_reg

動靜分離示例

global
    1og 127.0.0.1 local2
    chroot /var/1ib/haproxy 
	pidfile /var/run/haproxy.pid
	maxconn 4000
	user haproxy 
	group haproxy 
	daemon
    # turn on stats unix socket 
	stats socket /var/1ib/haproxy/stats

defaults 
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
	retries                 3
    timeout http-request    10s
    timeout queue1m timeout connect 10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

listen stats 
    mode http 
    bind 0.0.0.0:2333
    stats enable #顯示狀態頁面
    stats hide-version #隱藏haproxy的版本號
    stats uri /haproxyadmin?stats #修改URI路徑
    stats realm Haproxy\ Statistics #提示信息
    stats auth admin:admin#登陸狀態頁面的賬號和密碼 stats admin if TRUE frontend http-in bind *:80 mode http log global option httpclose option logasap option dontlognull capture request header Host len 20 capture request header Referer len 60 acl uf1_static path_beg -i /static /images /javascript /stylesheets ac1 url_static path_end-i .jpg .jpeg .gif .png .css .js use_backend static_servers if url_static default_backend dynamic_servers backend static_servers balance roundrobin server imgsrvl 172.16.200.7:80 check maxconn 6000 server imgsrv2 172.16.200.8:80 check maxconn 6000 backend dynamic_servers cookie srv insert nocache balance roundrobin server websrv1 172.16.200.7:80 check maxconn 1000 cookie websrv1 server websrv2 172.16.200.8:80 check maxconn 1000 cookie websrv2 server websrv3 172.16.200.9:80 check maxconn 1000 cookie websrv3 

ACL 定義,及調用

參考:http://cbonte.github.io/haproxy-dconv/configuration-1.4.html#4-redirect

開放策略:拒絕全部,只開放已知
拒絕策略:容許全部,只拒絕某些

acl clear dst_port 80
acl secure dst_port 8080
acl login page url_beg/login #若是 url 的地址,除了主機名以外是 login 的頁面則定義成 logon,若是是登陸頁面卻又屬於不安全的鏈接 那麼
acl logout url_beg/logout 
acl uid given url_reg/loginuserid=[^&]+ #取得 cookie 的子串,若是沒有 cookie 則:
acl cookie_set hdr_subcookieSEEN=1
redirect prefix https://test.com set-cookie SEEN=1 if !cookie_set #若是定義的第一個用戶來訪問咱們的站點的時候,沒有被設置 cookie 在將用戶的請求轉爲 https redirect prefix https://test.com if login_page !secure redirect prefix http://test.com drop-query if login_page !uid_given Iredirect location,http:/test.com/if !login_page secure redirect location / clear-cookie USERID= if logout 

咱們自定定義一個 acl
若是訪問的是 / bbs 開頭的地址,那麼將其跳轉到 / forum

acl bbs url_beg /bbs
redirect /forum if /bbs     #if 判斷是否匹配 / bbs  若是匹配則將 / bbs 跳轉至 / forum

示例

haproxy 192.168.200.102

web1 192.168.200.107

web2 192.168.200.106

一、基於cookie實現會話綁定:

haproxy

yum install haproxy -y
cp /etc/haproxy/haproxy.cfg{,.bak}
vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt # #--------------------------------------------------------------------- #--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global # to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the '-r' option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log # log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend web: bind *:80 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend webs #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- backend static balance roundrobin server static 127.0.0.1:4331 check #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend webs balance roundrobin server web1 192.168.200.107:80 check server web2 192.168.200.106:80 check 

web1 web2

echo web1> /var/www/html/index.html
echo web2> /var/www/html/index.html
systemctl restart httpd

client

for i in {1..10}; do curl 192.168.200.102;done

二、基於uri實現調度;

haproxy

vim /etc/haproxy/haproxy.cfg
backend webs
#    balance     roundrobin
    balance    uri
    hash-type consistent
    server web1 192.168.200.107:80 check
    server web2 192.168.200.106:80 check
systemctl reload haproxy

client

for i in {1..10}; do curl 192.168.200.102;done

三、基於hdr實現調度:

harpoxy

vim /etc/haproxy/haproxy.cfg
backend webs
#    balance     roundrobin
#    balance    uri
    balance hdr(User-Agent)
    hash-type consistent
    server web1 192.168.200.107:80 check
    server web2 192.168.200.106:80 check
systemctl reload haproxy

client

for i in {1..10}; do curl -A 'client1' 192.168.200.102;done
for i in {1..10}; do curl -A 'client2' 192.168.200.102;done

三、實現基於 cookie 的會話綁定

backend webs
    balance     roundrobin
cookie WEBS insert nocache indirect
    server web1 192.168.200.107:80 check maxcon 2000 cookie webs1
    server web2 192.168.200.106:80 check maxcon 1500 cookie webs2

四、啓用 HAproxy 統計接口

haproxy

frontend  web:
    bind *:80
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js
    use_backend static          if url_static
    default_backend             webs
    state enable
systemctl restart haproxy

client

http://192.168.200.102/haproxy?stats 

a、修改狀態頁監聽端口

frontend web
	bind :80,:8080
	mode http
	default_backend webs
	
Listen stats *:9999
	stats enable

b、修改狀態頁 url

frontend web
	bind :80,:8080
	mode http
	default_backend webs
	
Listen stats *:9999
	stats enable
    stats uri admin?mystats

c、添加安全認證

frontend web
	bind :80,:8080
	mode http
	default_backend webs
	
Listen stats *:9999
	stats enable
    stats uri /admin?mystats
    stars realm "Haproxy\ Start"
    stats auth admin:admin

四、動靜分離

global #全局參數的設置
    1og 127.0.0.1 local2 #全局的日誌配宣,使用log關鍵字,指定使用127.0.0.1
    chroot /var/1ib/haproxy #改變當前工做目錄
	pidfile /var/run/haproxy.pid #當前進程ID文件
	maxconn 4000 #最大鏈接數
	user haproxy #所屬用戶
	group haproxy #所屬組
	daemon #以守護進程運行haproxy 
	stats socket /var/1ib/haproxy/stats

defaults 
    mode                    http  #默認的模式mode {tcp|http|helth} tcp是4層,http是7層,health只會返回OK
    log                     global #應用全局的日誌配置
    option                  httplog #啓用日誌記錄HTTP請求,默認haproxy日誌記錄是不記錄HTTP請求日誌
    option                  dontlognull #啓用該項,日誌中將不會記錄空鏈接。所謂空鏈接就是在上游的負載均衡器或者監控系統爲了探測該服務是否存活可用時,須要按期的鏈接或者獲取某一固定的組件或頁面,或者探測掃描端口是否在監聽或開放等動做被稱爲空鏈接;官方文檔中標註,若是該服務上游沒有其餘的負載均衡器的話,建議不要使用該參數,由於互聯網上的惡意掃描或其餘動做就不會被記錄下來
    option http-server-close #每次請求完畢後主動關閉http通道
    option forwardfor       except 127.0.0.0/8 #若是服務器上的應用程序想記錄發起請求的客戶端的IP地址,須要在HAProxy上配置此選項,這樣 HAProxy會把客戶端的IP信息發送給服務器,在HTTP請求中添加"X-Forwarded-For"字段。啓用X-Forwarded-For,在requests頭部插入客戶端IP發送給後端的server,使後端server獲取到客戶端的真實IP。
    option                  redispatch #當使用了cookie時,haproxy將會將其請求的後端服務器的serverlD插入到cookie中,以保證會話的SESSION持久性;而此時,若是後端的服務器宕掉了,可是客戶端的cookie是不會刷新的,若是設置此參數,將會將客戶的請求強制定向到另一個後端server上,以保證服務的正常。
	retries                 3 #定義鏈接後端服務器的失敗重連次數,鏈接失敗次數超過此值後將會將對應後端服務器標記爲不可用
    timeout http-request    10s #http請求超時時間
    timeout queue1m timeout connect 10s 
    timeout client          1m #客戶端超時
    timeout server          1m #服務器端超時
    timeout http-keep-alive 10s #設置http-keep-alive的超時時間
    timeout check           10s #檢測超時
    maxconn                 3000 #每一個進程可用的最大鏈接數

listen stats 
    mode http 
    bind 0.0.0.0:2333  #監聽地址和端口
    stats enable #顯示狀態頁面
    stats hide-version #隱藏haproxy的版本號
    stats uri /haproxyadmin?stats #修改URI路徑
    stats realm Haproxy\ Statistics #提示信息
    stats auth admin:admin#登陸狀態頁面的賬號和密碼
    stats admin if TRUE

frontend http-in 
    bind *:80 
    mode http 
    log global option httpclose 
    option logasap 
    option dontlognull
    capture request header Host len 20
    capture request header Referer len 60
    acl url_static path_beg -i /static /images /javascript /stylesheets 
    ac1 url_static path_end -i .jpg .jpeg .gif .png .css .js 	 use_backend static_servers if url_static #若是知足url_static條件,則發給static_servers,若不知足dynamic_servers
    default_backend dynamic_servers #定義一個名爲dynamic_servers前端部分。此處將對於的請求轉發給後端

backend static_servers #使用了靜態動態分離
    balance roundrobin #負載均衡算法
    server imgsrvl 172.16.200.1:80 check maxconn 6000 #定義的多個後端
    server imgsrv2 172.16.200.2:80 check maxconn 6000

backend dynamic_servers 
    cookie srv insert nocache
        balance roundrobin 
        server websrv1 172.16.200.1:80 check maxconn 1000 cookie websrv1
        server websrv2 172.16.200.2:80 check maxconn 1000 cookie websrv2
        server websrv3 172.16.200.3:80 check maxconn 1000 cookie websrv3

五、用keepalived高可用haproxy

harpxoy keepalived

haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
frontend  web
    bind *:80,:8080
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js
    use_backend static          if url_static
    mode http
    default_backend             webs
    stats enable
    stats hide-version
    stats uri /admin
backend static
    balance     roundrobin
    server      static 127.0.0.1:4331 check
backend webs
    balance     roundrobin
    server web1 192.168.200.107:80 check 
    server web2 192.168.200.106:80 check
kepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
}

vrrp_script chk_down {
   script "[[-f /etc/keepalived/down]] && exit 1 || exit 0"
   interval 1
   weight -2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens32
    virtual_router_id 10
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1000
    }
    virtual_ipaddress {
        192.168.200.253
    }
   track_script {
       chk_down
   }
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息