代理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
進程管理及安全相關的參數web
性能調整相關的參數正則表達式
Debug相關的參數
一、balance
balance url_param
[check_post[<max_wait>]]
定義負般均衡算法,可用於「defaults」、「listen」和「backend」.
二、bind bind [
]:<port_range> [,…]此指令僅能用於frontend和listen區段,用於定義一個或幾個監聽的套接字。
<address> :可選選項,其能夠爲主機名、IPv4地址、IPv6地址或*;省略此選項、將其指定爲*或e.e.e.
0時,將監聽當前系統的全部IPv4地址:
<port_range>:能夠是一個特定的TCP端口,也但是一個端口範圍(如5005-5010)
,代理服務器將經過指定的端口來接收客戶端請求;須要注意的是,每組監聽的套接字- - address:port
在同一個實例上只能使用一次,並且小於1024的端口須要有特定權限的用戶才能使用,這可能須要經過uid參數來定義;
三、bind
bind [
四、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
六、maxconn
maxconn
設定一個前端的最大併發鏈接數,所以,其不能用於backend區段。對於大型站點來講,能夠儘量提升此值以便讓haproxy管理鏈接隊列,從而避免沒法應答用戶請求。固然,此最大值不能超出「global」段中的定義。此外,須要留心的是,haproxy會爲每一個鏈接維持兩個緩衝,每一個緩衝的大小爲8KB,再加上其它的數據,每一個鏈接將大約佔用17KB的RAM空間。這意味着通過適當優化後,有着1GB的可用RAM空間時將能維護40000-50000併發鏈接。
若是爲
七、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
後端聲明一個server,所以,不能用於defaults和frontend區段。
name",它還將被添加至發往此服務器的請求首部中:
檢查方法:
檢查方法:
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
捕獲並記錄指定的請求首部最近一次出現時的第一個值,僅能用於「frontend」和「listen」區段。捕獲的首部值使用花括號{}括起來後添加進日誌中。若是須要捕獲多個首部值,它們將以指定的次序出如今日誌文件中,並以豎線1」做爲分隔符。不存在的首部記錄爲空字符串,最常須要捕獲的首部包括在虛擬主機環境中使用的「Host」、上傳請求首部中的「Content-1ength」、快速區別真實用戶和網絡機器人的User-
agent」,以及代理環境中記錄真實請求來源的「X-Forward-For」。
<1length>:指定記錄首部值時所記錄的精確長度,超出的部分將會被忽略。
能夠捕獲的請求首部的個數沒有限制,但每一個捕獲最多隻能記錄64個字符。爲了保證同一個frontend中日誌格式的統一性,首部捕獲僅能在f rontend中定義。
1四、capture response header
capture response header
捕獲並記錄響應首部,其格式和要點同請求首部。
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
容許在發往服務器的請求首部中插入「X-Forwarded-For」首部。
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]:目前haproxy的ac1支持的標誌位有3個:
-i:不區分<value>中模式字符的大小寫:
-f:從指定的文件中加載模式:
-:標誌符的強制結束標記,在模式中的字符串像標記符時使用:
<value>:ac1測試條件支持的值有如下四類:
整數或整數範圍:如1024:65535表示從1024至65535;僅支持使用正整數(若是出現相似小數的標識,其爲一般爲版本測試)
,且支持使用的操做符有5個,分別爲eq、ge、gt、le和lt;字符串:支持使用「-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/login?userid=[^&]+ #取得 cookie 的子串,若是沒有 cookie 則:
acl cookie_set hdr_sub(cookie)SEEN=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
}