項目詳解4—haproxy 詳解

来源:http://www.cnblogs.com/along21/archive/2017/11/27/7899771.html
-Advertisement-
Play Games

一、企業服務架構圖及負載均衡的要求 1、場景說明 在企業生產環境中,每天會有很多的需求變更,比如增加伺服器、新業務上線、url路由修改、功能變數名稱配置等等,對於前端負載均衡設備來說,容易維護,複雜度低,是首選指標。在企業中,穩定壓倒一切,與其搞得很複雜,經常出問題,不如做的簡單和穩定。 在企業中,90%以 ...


一、企業服務架構圖及負載均衡的要求

1、場景說明

  在企業生產環境中,每天會有很多的需求變更,比如增加伺服器新業務上線、url路由修改、功能變數名稱配置等等,對於前端負載均衡設備來說,容易維護,複雜度低,是首選指標。在企業中,穩定壓倒一切,與其搞得很複雜,經常出問題,不如做的簡單和穩定。

  在企業中,90%以上的故障,來源於需求變更。可能是程式bug,也可能是人為故障,也可能是架構設計問題等等。前端負載均衡設備為重中之重,在軟體選型上一定充分考慮,能滿足業務的前提下,儘可能降低複雜度,提高易維護性。

 

2、企業服務架構圖

3、四層和七層負載均衡的區別

四層:

通過分析IP層及TCP/UDP層的流量實現的基於"IP+埠"的負載均衡。

七層:

可以根據內容,再配合負載均衡演算法來選擇後端伺服器,不但可以根據"ip+埠"方式進行負載分流,還可以根據網站的URL,訪問功能變數名稱,瀏覽器類別,語言等決定負載均衡的策略。七層負載均衡模式下,負載均衡與客戶端及後端的伺服器會分別建立一次TCP連接,而在四層負載均衡模式下(DR),僅建立一次TCP連接;七層負載均衡對負載均衡設備的要求更高,處理能力也低於四層負載均衡。

 

二、haproxy介紹

1、定義

(1)HAProxy是一個使用C語言編寫的自由及開放源代碼軟體,其提供高性能性、負載均衡,以及基於TCP和HTTP的應用程式代理。相較與 Nginx,HAProxy 更專註與反向代理,因此它可以支持更多的選項更精細的控制更多的健康狀態檢測機制負載均衡演算法

(2)HAProxy特別適用於那些負載特大的web站點這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬體上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web伺服器不被暴露到網路上。

(3)包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter在內眾多知名網站,及亞馬遜網路服務系統都使用了HAProxy

 

2、haproxy的功能

HAProxy 是TCP / HTTP 反向代理伺服器,尤其適合於高可用性環境

① 可以針對HTTP 請求添加cookie ,進行路由後端伺服器

② 可平衡負載至後端伺服器,並支持持久連接

③ 支持基於cookie 進行調度

④ 支持所有主伺服器故障切換至備用伺服器

⑤ 支持專用埠實現監控服務

⑥ 支持不影響現有連接情況下停止接受新連接請求

⑦ 可以在雙向添加,修改或刪除HTTP 報文首部

⑧ 支持基於pattern 實現連接請求的訪問控制

⑨ 通過特定的URI 為授權用戶提供詳細的狀態信息

⑩ 支持http 反向代理,支持動態程式的反向代理,支持基於資料庫的反向代理

版本:1.4 1.5 1.6 1.7 1.8

 

3、Haproxy的特性

① 可靠性與穩定性都非常出色,可與硬體級設備媲美。

② 支持連接拒絕,可以用於防止DDoS攻擊

③ 支持長連接、短連接和日誌功能,可根據需要靈活配置

④ 路由HTTP請求到後端伺服器,基於cookie作會話綁定;同時支持通過獲取指的url來檢測後端伺服器的狀態

⑤ HAProxy還擁有功能強大的ACL支持,可靈活配置路由功能,實現動靜分離,在架構設計與實現上帶來很大方便

⑥ 可支持四層和七層負載均衡,幾乎能為所有服務常見的提供負載均衡功能

⑦ 擁有功能強大的後端伺服器的狀態監控web頁面,可以實時瞭解設備的運行狀態,還可實現設備上下線等簡單操作。例:cobbler、samba、httpd

⑧ 支持多種負載均衡調度演算法,並且也支持session保持

 

4、Haproxy安裝方式

(1)Haproxy安裝常用兩種方式,yum安裝和源碼包安裝

(2)yum 安裝:通常是線上安裝,好處是安裝方式簡單,不易出錯;常用的安裝yum源為epel

(3)源碼包安裝:是先將 Haproxy 的源碼下載下來,在自己的系統里編譯生成可執行文件,然後執行,好處是因為是在自己的系統上編譯的,更符合自己系統的性能,也就是說在自己的系統上執行 Haproxy服務性能效率更好。

(4)區別:路徑和啟動方式不同,支持的模塊也不同

 

5、Haproxy程式路徑

主程式:/usr/sbin/haproxy

主配置文件:/etc/haproxy/haproxy.cfg

Unit file:/usr/lib/systemd/system/haproxy.service(centos7)

Init.file :/etc/init.d/haproxy (centos6)

 

三、Haproxy配置文件結構

1、格式介紹

haproxy 的配置文件由兩大部分組成:

  全局設定(globalsettings)對代理的設定(proxies)

(1)global settings:主要用於定義haproxy進程管理安全及性能相關的參數

 

(2)proxies共分為4段:defaults,frontend,backend,listen

defaults <name>:為其它配置段提供預設參數,下麵的段可以繼承預設參數;預設配置參數可由下一個"defaults"重新設定

frontend <name>:定義一系列監聽的套接字,這些套接字可接受客戶端請求並與之建立連接可以監聽多個埠,例:監聽80和3306埠,80請求給後端的web伺服器,3306請求給後端的資料庫伺服器

backend <name>:定義"後端"伺服器,前端代理伺服器將會把客戶端的請求調度至這些伺服器

listen <name>:定義監聽的套接字和後端的伺服器。類似於將frontend和backend段放在一起,適用於一對一環境

 

(3)註意

① 後端的real server可以屬於多個backend組,一個backend可以包括一個或多個real server

② frontend 可以交叉調用backend

 

2、 global 全局配置參數

(1)和進程安全相關的設置

nbproc <number> 要啟動的haproxy 的進程數量,系統預設單進程,要求使用daemon 模式;和linux的cpu數相關,lscpu可以查看cpu數

② ulimit-n <number> 每個haproxy 進程可打開的最大文件數系統自動會指定,不建議設置

daemon 後端守護方式運行,建議使用

④ user 執行進程的用戶

⑤ group 執行進程的組

 

(2)log 日誌的設置

a)日誌存放在haproxy的本機上

① vim /etc/rsyslog.conf 在日誌服務的配置文件中自定義一條存放haproxy 日誌的設置

local2.*   /var/log/haproxy.log

service rsyslog restart 重啟日誌服務

② 在haproxy的全局段設置日誌

log    127.0.0.1 local2 日誌存放在本機

 

b)日誌存放在遠程的機器上

① vim /etc/rsyslog.conf

$ModLoad imudp   遠方存放日誌的模塊打開

$UDPServerRun 514   打開的監聽埠

local2.*   /var/log/haproxy.log

② 在haproxy的全局段設置日誌

log    172.17.22.22 local2 日誌存放在遠程伺服器上

 

c)將特定信息記錄在日誌中,略

① 捕獲的請求和響應報文中的 cookie 並記錄日誌

capture cookie <name> len <length>

② 捕獲請求報文中指定的首部並記錄日誌

capture request header <name> len <length>

  示例:capture request header X-Forwarded-For len 15

③ 捕獲響應報文 中指定的首部並記錄 日誌

capture response header <name> len <length>

  示例:

  capture response header Content-length len 9

  capture response header Location len 15

 

(3)性能調整,優化

① maxconn <number>: 設置每個haproxy 進程所能接受的最大併發連接數

② maxconnrate <number> :設置每個進程每秒種所能建立的最大連接數量,速率,一個連接里可以有多個會話,也可以沒有會話

③ maxsessrate <number> :設置每個進程每秒種所能建立的最大會話數量

④ maxsslconn <number>:每進程支持SSL 的最大連接數量

⑤ spread-checks <0..50, in percent>:健康檢測延遲時長比建議2-5 之間

 

(4)例:

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     40000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

 

3、代理配置段,4小段的格式

(1)defaults相關的配置

defaults
  mode http   #實現http的7層規則
  log global    #日誌定義
  option httplog   #啟用日誌記錄HTTP請求,預設haproxy日誌記錄是不記錄HTTP請求
  option dontlognull   #日誌中將不會記錄空連接。
  option httpclose   # 強制短連接,每次收發完包後都把連接關閉
  option forwardfor   #添加xforward日誌標記
  retries 3   # 定義連接後端伺服器的失敗重連次數
  timeout http-request 10s   # 請求超時
  timeout queue 1m  #隊列超時
  timeout connect 10s   #連接超時
  timeout client 1m  #客戶端超時

 

(2)frontend 相關的配置

"frontend"段用於定義一系列監聽的套接字,這些套接字可接受客戶端請求並與之建立連接

例:frontend main *:5000
    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        app

(3)backend 相關的配置

"backend"段用於定義一系列"後端"伺服器,代理將會將對應客戶端的請求轉發至這些伺服器。

例:backend app
  balance roundrobin
  server app1 127.0.0.1:5001 check
  server app2 127.0.0.1:5002 check
  server app3 127.0.0.1:5003 check
  server app4 127.0.0.1:5004 check

 

(4)listen 相關的配置

listen段通過關聯"前端"和"後端"定義了一個完整的代理,frontend和backend 塊的結合體

  

四、Haproxy配置文件選項詳解

1、bind:定義監聽套接字,指定一個或多個前端偵聽地址和埠

(1)格式:

bind [<address>]:<port_range> [, ...] 多個可以以,隔開

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

 

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

① <address>:可選選項,其可以為主機名、IPv4地址、IPv6地址或*;省略此選項、將其指定為*或0.0.0.0時,將監聽當前系統的所有IPv4地址;

② <port_range>:可以是一個特定的TCP,也可是一個埠範圍(如5005-5010),代理伺服器將通過指定的埠來接收客戶端請求;需要註意的是,每組監聽的套接字

③ <address:port>在同一個實例上只能使用一次,而且小於1024的埠需要有特定許可權的用戶才能使用,這可能需要通過uid參數來定義;

④ <interface>:指定物理介面的名稱,僅能在Linux系統上使用;其不能使用介面別名,而僅能使用物理介面名稱,而且只有管理有許可權指定綁定的物理介面;

 

(3)示例

listen http_proxy

  bind :80,:443

  bind 10.0.0.1:10080,10.0.0.1:10443

 

2、mode { tcp|http|health } 實例運行模式

設定實例的運行模式或協議。當實現內容交換時,前端和後端必須工作於同一種模式(一般說來都是HTTP模式),否則將無法啟動實例。可以放在任何4段中 default frontent backent listen

tcp:實例運行於純TCP模式,在客戶端和伺服器端之間將建立一個全雙工的連接,且不會對7層報文做任何類型的檢查,通常用於SSL、SSH、SMTP等應用;

http:實例運行於HTTP模式,7層,客戶端請求在轉發至後端伺服器之前將被深度分析,所有不與RFC格式相容的請求都會被拒絕;centos實際預設模式

health:實例工作於health模式,其對入站請求僅響應"OK"信息並關閉連接,且不會記錄任何日誌信息;此模式將用於響應外部組件的健康狀態檢查請求;目前來講,此模式已經廢棄,因為tcp或http模式中的monitor關鍵字可完成類似功能;可以用於測試

 

(2) mode tcp

tcp-request connection {accept|reject} [{if | unless} <condition>] 根據第4層條件對傳入連接執行操作

例:ssh 的遠程調度

mysql 的遠程調度

 

3、balance 分配演算法策略

格式:balance <algorithm> [ <arguments> ]

定義負載均衡演算法,可用於"defaults"、"listen"和"backend"。<algorithm>用於在負載均衡場景中挑選一個server,其僅應用於用戶新請求或需要將一個連接重新派發至另一個伺服器時。支持的演算法有:

(1)不含hash的演算法

roundrobin:基於權重進行輪叫,在伺服器的處理時間保持均勻分佈時,這是最平衡、最公平的演算法。此演算法是動態的,這表示其權重可以在運行時進行調整,不過,在設計上,每個後端伺服器僅能最多接受4128個連接;

  特點:動態演算法,支持權重的運行時調整,支持慢啟動;每個後端backend 中最多支持4095 個server,有上限

static-rr:基於權重進行輪叫,與roundrobin類似,但是為靜態方法,在運行時調整其伺服器權重不會生效;不過,其在後端伺服器連接數上沒有限制;

  特點:靜態演算法不支持權重的運行時調整及,不支持慢啟動(不好用);後端主機數量無上限

 

leastconn:新的連接請求被派發至具有最少連接數目的後端伺服器;在有著較長時間會話的場景中推薦使用此演算法,如LDAP、SQL資料庫等,其並不太適用於較短會話的應用層協議

first:根據伺服器在列表中的位置,自上而下進行調度前面伺服器的連接數達到上限新請求才會分配給下一臺服務

 

(2)含hash的演算法

⑤ source :源地址hash,新連接先按權重分配,後續連接按source 分配請求,用的不多

 

uri:對URI 的左半部分整個uri 做hash 計算,並除以伺服器總權重取模,以後派發至某挑出的伺服器,適用於後端緩存伺服器

例:<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

  左半部分:/<path>;<params>

  整個uri :/<path>;<params>?<query>#<frag>

 

url_param:對用戶請求的uri 中的<params> 部分中的參數的值作hash 計算,並由伺服器總權重相除以後派發至某挑出的伺服器;通常用於追蹤用戶,以確保來自同一個用戶的請求始終發往同一個Backend Server

例:http://www.magedu.com/bbs/hello;type=title (這個參數相當於用戶的id)

 

(3)hdr的演算法,瞭解

hdr(<name>) :對於每個http 請求,此處由<name> 指定的http 首部將會被取出做hash; 計算; 並由伺服器總權重相除以後派發至某挑出的伺服器; 無有效值的會被輪詢調度 hdr(Cookie)

rdp-cookie 遠程桌面相關

rdp-cookie(<name>)

 

(4)設置預設權重

default-server weight 10

 

 

4、server:定義後端主機的各伺服器及其選項

(1)格式

server <name> <address>[:[port]] [param*]

① <name> :伺服器在haproxy 上的內部名稱;出現在日誌及警告信息;如果設定了"http-send-server-name",它還將被添加至發往此伺服器的請求首部中;

② <address> :伺服器地址,支持使用主機名,只不過在啟動時需要解析主機名至相應的IPv4地址;

③ [:[port]] :指定將連接請求所發往的此伺服器時的目標埠,其為可選項;未設定時,將使用客戶端請求時的同一相埠;

④ [param*] :參數,下麵僅說明幾個常用的參數;

 

(2)參數param

① weight <weight>:權重,預設為1,最大值為2560表示不參與負載均衡

② backup:設定為備用伺服器,僅在負載均衡場景中的其它server均不可用於啟用此server;

③ check:啟動對此server執行健康狀態檢查,其可以藉助於額外的其它參數完成更精細的設定,如:

  addr:檢測時使用的IP 地址,可以不為real server的ip

  port:針對此埠進行檢測

  inter <delay>:設定健康狀態檢查的時間間隔單位為毫秒,預設為2000;也可以使用fastinter和downinter來根據伺服器端狀態優化此時間延遲;

  rise <count>:設定健康狀態檢查中,某離線的server從離線狀態轉換至正常狀態需要成功檢查的次數;

  fall <count>:確認server從正常狀態轉換為不可用狀態需要檢查的次數

例:

例:
backend lnmp-server
    balance     roundrobin
    server  sorryserver 172.17.1.6:80 backup
    server  lnmpserver1 172.17.1.7:80 weight 1 check inter 3000 rise 3 fall
    server  lnmpserver2 172.17.22.22:80 weight 2 check inter 3000 rise 3 fall

 

 

cookie <value>:為指定server設定cookie值,此處指定的值將在請求入站時被檢查,第一次為此值挑選的server將在後續的請求中被選中,其目的在於實現持久連接的功能

例:

cookie  SRV insert nocache   先定義,下邊才能使用;insert插入報文首部,nocache不緩存,安全
server  lnmpserver2 172.17.1.7:80 check inter 3000 rise 3 fall 5 cookie srv1
server  lnmpserver2 172.17.22.22:80 check inter 3000 rise 3 fall 5 cookie srv2

 

註意:curl 測試需加-b SRV= 指定的對應cookie訪問,如:curl -b SRV=srv1 172.17.11.11

 

⑤ maxconn <maxconn>:指定此伺服器接受的最大併發連接數;如果發往此伺服器的連接數高於此處指定的值,其將被放置於請求隊列,以等待其它連接被釋放;

註意:此處是放在backend 段的server 後,是後端伺服器的最大併發連接數;

也可放在frontend 段,設置前端的最大併發連接數

 

⑥ maxqueue <maxqueue>:設定請求隊列的最大長度

⑦ backlog <backlog> :當server 的連接數達到上限後的後援隊列長度

 

⑧ observe <mode>:通過觀察伺服器的通信狀況來判定其健康狀態,預設為禁用,其支持的類型有"layer4"和"layer7","layer7"僅能用於http代理場景;

redir <prefix>:啟用重定向功能,將發往此伺服器的GET和HEAD請求均以302狀態碼響應;需要註意的是,在prefix後面不能使用/,且不能使用相對地址,以免造成迴圈;

  例如:server srv1 172.16.100.6:80 redir http://www.baidu.com

  若用curl查詢,記得加-L 跳轉;curl -L 172.17.11.11

⑩ disabled:標記為不可用

 

5、stats 狀態監測web頁面

可以放在任何4段中 default frontent backent listen

stats enable    #啟用統計頁;基於預設的參數啟用stats page
stats uri   /haproxy?stats(預設值)    #自定義stats page uri
stats hide-version    #隱藏統計報告版本信息
stats realm  HAProxy\ Statistics    #頁面登陸信息
stats auth  user:passwd    #驗證賬號和密碼信息
stats refresh 20s     #設定自動刷新時間間隔
stats admin if TRUE    #如果驗證通過,啟用stats page 中的管理功能 

打開狀態訪問頁面 http://192.168.30.6:9527/haproxy?admin

能監控和管理

 

6、option httpchk 健康狀態監測

(1)解釋

對後端伺服器做http 協議健康狀態檢測:通常用於backend

在default、backend、listen使用,禁止在frontend使用

定義基於http 協議的7 層健康狀態檢測機制

 

(2)格式:

option httpchk 預設為:/ OPTIONS HTTP/1.0

option httpchk <uri>

option httpchk <method> <uri>

option httpchk <method> <uri> <version>

http-check expect [!] <match> <pattern> 期望得到的 http協議健康狀態檢測響應內容或指定響應碼

(3)例:

option httpchk GET /index.html HTTP/1.1\r\nhost: #檢測後端的index.html頁面,構造響應報文首部,HTTP/1.1 協議版本,/n換行

http-check expect status 200 #返回的響應碼為200是正常,接受不到200,就不再給後端server調度

7、forwardfor 配置

(1)分析:後端收到服務的請求是haproxy的,所以日誌記錄的請求ip也是haproxy的;如我們想要記錄真實client 的ip,需加forwardfor 選項;

在由haproxy 發往後端主機的請求報文中添加"X-Forwarded-For" 首部,其值為前端客戶端的地址;用於向後端主發送真實的客戶端IP

(2)格式

option forwardfor [ except <network> ] [ header <name> ] [ if-none ]

  [ except <network> ] :請求報請來自此處指定的網路時不予添加此首部,如haproxy 自身所在網路

  [ header <name> ] :使用自定義的首部名稱,而非預設的"X-Forwarded-For"

  [ if-none ] 如果沒有首部才添加首部,如果有使用預設值

(3)為指定的MIME 類型啟用壓縮傳輸功能

  compression algo <algorithm> ... :啟用http 協議的壓縮機制,指明壓縮演算法gzip, deflate

  compression type <mime type> ... :指明壓縮的MIMI 類型

(4)例:option forwardfor except 127.0.0.0/8

還需在nginx、httpd服務的日誌格式中加上"$http_x_forwarded_for" ,才能記錄client 的ip

 

8、 errorfile、errorloc 自定義錯誤頁

(1)errorfile <code> <file> 自定義作為頁面

  <code> :HTTP status code.

  支持200, 400, 403, 408, 500, 502, 503, 504.

  <file> :錯誤頁文件路徑,當然,需在haproxy上事先準備好

    mkdir /etc/haproxy/error_pages

    echo Custom ERROR 503 > /etc/haproxy/error_pages/503.html 定製503錯誤

示例:

errorfile 503 /etc/haproxy/error_pages/503.html

 

(2)errorloc <code> <url> 重定向到其他頁面

相當於errorloc302 <code> <url> ,利用302 重定向至指URL

示例:

errorloc 503 http://www.baidu.com/error_pages/503.html

 

9、修改報文首部

① 在請求報文尾部添加指定首部

reqadd <string> [{if | unless} <cond>]

② 在響應報文尾部添加指定首部

rspadd <string> [{if | unless} <cond>]

示例:reqadd X-via:\ haproxy01 \ 轉譯空格

在後端server nginx上日誌格式加上這條 "$http_x_via"

rspadd Server:\ alonginx 偽造報文首部,加個假的版本信息

 

③ 從請求報文中刪除匹配正則表達式的首部

reqdel <search> [{if | unless} <cond>]

reqidel <search> [{if | unless} <cond>] i不分大小寫

④ 從響應報文中刪除匹配正則表達式的首部

rspdel <search> [{if | unless} <cond>]

rspidel <search> [{if | unless} <cond>] 不分大小寫

示例: rspidel server.* 刪除報文首部的版本信息

 

10、連接超時

① timeout client <timeout>

客戶端最長空閑連接超時時長 預設單位是毫秒

② timeout server <timeout>

後端伺服器最長空閑連接超時時長

③ timeout http-keep-alive <timeout>

持久連接的持久時長

④ timeout http-request <timeout>

一次完整的HTTP 請求的最大等待時長

⑤ timeout connect <timeout>

成功連接後端伺服器的最大等待時長

⑥ timeout client-fin <timeout>

客戶端半連接的空閑時長

⑦ timeout server-fin <timeout>

後端伺服器半連接的空閑時長

 

五、haproxy中的ACL

1、定義

acl:訪問控制列表,用於實現基於請求報文的首部響應報文的內容其它的環境狀態信息來做出轉發決策,這大大增強了其配置彈性。其配置法則通常分為兩步,首先去定義ACL ,即定義一個測試條件,而後在條件得到滿足時執行某特定的動作,如阻止請求或轉發至某特定的後端。

 

2、acl定義的格式

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

① <aclname> 必須:ACL 名稱,區分字元大小寫,且其只能包含大小寫字母、數字、-( 連接線) 、_( 下劃線) 、.( 點號) 和:( 冒號) ;haproxy 中,acl 可以重名,重名是或的關係

② <criterion> 必須:測試標準,即對什麼信息發起測試;測試方式可以由[flags] 指定的標誌進行調整;而有些測試標準也可以需要為其在<value> 之前指定一個操作符[operator]

③ [flags] 非必須

  -i 不區分大小寫

  -m 使用指定的pattern 匹配方法

  -n 不做DNS 解析

  -u 強制每個ACL 必須 唯一ID ,否則多個同名ACL 或關係

  -- 強制flag 結束. 當字元串和某個flag 相似時使用

④ [operator] 非必須

匹配整數值:eq 、ge 、gt 、le 、lt

匹配字元串:

  - exact match (-m str) : 字元串必須完全匹配模式,預設

  - substring match (-m sub) : 在提取的字元串中查找模式 ,如果其中任何一個被髮現,ACL將 將 匹配

  - prefix match (-m beg) : 在提取的字元串首部中查找模式,如果其中任何一個被髮現,ACL 將匹配

  - suffix match (-m end) : 將模式與提取字元串的尾部進行比較,如果其中任何一個匹配,則ACL 進行匹配

  - subdir match (-m dir) : 查看提取出來的用斜線分隔( "/" )的字元串, 如果其中任何一個匹配,則ACL 進行 匹配

  - domain match (-m dom) : 查找提取的用點("." )分隔字元串,如果 其中任何一個匹配,則ACL 進行

 

⑤ <value> 的類型:必須

- boolean

- integer or integer range

- IP address / network

- string (exact, substring, suffix, prefix, subdir, domain)

- regular expression

- hex block

 

3、criterion 標準

(1) base : string 返回第一個主機頭和請求的路徑部分的連接,該請求從第一個斜杠開始,併在問號之前結束,虛擬主機有用

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

base : exact string match 確切的字元串匹配

base_beg : prefix match 首碼匹配

base_dir : subdir match 子目錄匹配

base_dom : domain match 匹配

base_end : suffix match 尾碼匹配

base_len : length match 長度匹配

base_reg : regex match 正則表達式匹配

base_sub : substring match 子串匹配

 

(2) path : string 提取請求的URL 路徑,該路徑從第一個斜杠開始,併在問號之前結束(無主機部分)

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

path : exact string match

path_beg : prefix match

path_dir : subdir match

path_dom : domain match

path_end : suffix match

path_len : length match

path_reg : regex match

path_sub : substring match

 

例:

① acl adminpath path_beg /admin 以admin開頭的

block if deny_src adminpath 都拒絕訪問

② acl imagefile path_end -i .bmp .jpg .png .gif .jpeg 以圖片尾碼結尾的,不區分大小寫

use_backend imagesrvs if imagefile 都給imagesrvs 為名的backend後端server 處理

 

(3) url : string 提取請求中的URL。一個典型的應用是具有預取能力的緩存,以及需要從資料庫聚合多個信息並將它們保存在緩存中的網頁門戶入口

url : exact string match

url_beg : prefix match

url_dir : subdir match

url_dom : domain match

url_end : suffix match

url_len : length match

url_reg : regex match

url_sub : substring match

 

(4) req.hdr([<name>[,<occ>]]) : string 提取在一個HTTP 請求報文的首部

hdr([<name>[,<occ>]]) : exact string match

hdr_beg([<name>[,<occ>]]) : prefix match

hdr_dir([<name>[,<occ>]]) : subdir match

hdr_dom([<name>[,<occ>]]) : domain match

hdr_end([<name>[,<occ>]]) : suffix match

hdr_len([<name>[,<occ>]]) : length match

hdr_reg([<name>[,<occ>]]) : regex match

hdr_sub([<name>[,<occ>]]) : substring match 子串匹配

示例:

① acl bad_curl hdr_sub(User-Agent) -i curl 以curl 訪問的

block if bad_curl 都拒絕

② acl phphost hdr(host) php.magedu.com 訪問php的功能變數名稱

use_backend srvs1 if wwwhost 都給對應的後端server組處理

能實現多個功能變數名稱的分離

 

4、引用執行acl 的設置

use_backend <backend> [{if | unless} <condition>]

當if/unless 一個基於ACL 的條件匹配時切換指定backend

block { if | unless } <condition> 阻止7 層請求if/unless 一個條件匹配

http-request { allow | deny |add-header <name> <fmt> |set-header <name> <fmt> } [ { if | unless } <condition> ] 對7 層請求的訪問控制

例:acl deny_method method HEAD 訪問我首部的請求,就是curl -I

http-request deny if deny_method 拒絕

tcp-request connection {accept|reject} [{if | unless} <condition>] 根據第4層條件對傳入連接執行操作

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.menu(space key)2.space (08307009 U) 按鍵2次)->(EXT)3.BLUE(按鍵4次)->PAL4.enter5.0校準(0對準CAL(按住探頭)出現數字後按校準鍵 校準後探頭返回原位置)6.選擇通道上鍵 ...
  • 本文以SSH為例進行PAM配置來實現相應的認證功能,其它的登錄方式配置相似,詳情可參考文章《PAM - 可插拔認證模塊》。 1、限制用戶的登錄(SSH) (1)使用pam_access自定義限制規則 //新增pam_access模塊認證 [root@iZwz9catu2mrq92b07d1d0Z ~ ...
  • 1、為什麼要使用PAM 為了讓用戶更合理地使用系統,應用程式或服務(如sshd、login、su、password、ftp等)不可避免地需要對用戶進行安全認證,若按照各自的規則去配置非常耗費時間和精力且不能重用。 而PAM提供了統一的API,使應用程式的訪問控制變得簡單方便。 2、介紹 官網:htt ...
  • 1.yum添加epel源 vim /etc/redis.conf 找到redis.conf 並修改 daemonize no(第128行) 為 daemonize yes :set number(顯示行號) . 4.開啟客戶端要確保服務端啟動 redis-server /etc/redis.conf ...
  • 有誰跟我一樣是Linux的初學者麽,接下來的時間學習Linux,希望找到個一同學習的,互相監督,共同進步!!!!!! ...
  • 這幾天在準備網路安裝linux操作系統。最後決定用pxe + kickstart 的方式完成。原理、方案弄完了之後,開始搭建,結果被DHCP給擋住了。這不就得研究研究最簡單最實用的DHCP使用方法。 * 紅色的是必須有 * 綠色的是要註意 * 藍色的是包安裝時,要有的程式包 1. DHCP的實現 2 ...
  • 第1章 Tomcat 1.1 Tomcat簡介 Tomcat是一個免開放源代碼的Web應用伺服器,屬於輕量級應用伺服器,在中小型系統和併發訪問用戶不多的場合下被普遍使用,是開發調試JSP程式的首選,另外它還是Servlet和JSP容器,獨立的Servlet容器是Tomcat的預設模式 其類似Ngin ...
  • 為了讓自己的電腦相對安全一些,我安裝了ubuntu的物理機 因為要經常輸入漢字,我就在unbuntu裡面安裝了搜狗輸入法 1.在搜狗輸入法官網下載Linux版本的安裝包:http://pinyin.sogou.com/linux/,記住下載自己機子對應的版本(看清楚是32位還是64位) 2.找到文件 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...