HAproxy用法深入

報文修改:

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

[except <network>]-請求報文請來自此處指定的網絡時不予以添加此
首部--如haproxy所在網絡
默認配置:
option forwardfor except 127.0.0.0/8
需要更改後端服務器日誌配置:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Forwarded-For}i" combined
效果展示:
192.168.23.36 - - [04/Nov/2018:10:27:10 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0" 172.20.23.20
192.168.23.36 - - [04/Nov/2018:10:27:11 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/7.29.0" 172.20.23.20

[header <name>]:使用自定義的首部名稱,而非"X-Forwarded-For"
具體使用:
option forwardfor except 127.0.0.0/8 header xxx
使用後需要更改後端服務器端日誌格式!
具體使用:
option forwardfor except 127.0.0.0/8 header HostClient

[if-none] 如果沒有首部才添加首部 如果有使用默認值

在請求報文尾部添加指定首部:
reqadd <string> [{if|unless} <cond>]
具體應用:
reqadd testheader:\ test
結果展示:
192.168.23.36 - - [04/Nov/2018:11:28:49 +0800] "HEAD / HTTP/1.1" 200 - "-" "curl/7.29.0" test

在響應報文尾部添加指定首部:
rspadd <string> [{if|unless} <cond>]
示例:
rsqadd X-Via:\ HAPorxy
\ -----轉移空白字符
請求報文中刪除匹配正則表達式的首部:
reqdel <search> [{if|unless} <cond>]
reqidel <search> [{if|unless} <cond>] --不區分大小寫

從響應報文中刪除匹配正則表達式的首部:
rspdel <search> [{if|unless} <cond>]
rspidel <search> [{if|unless} <cond>] --不區分大小寫

示例:rspidel server.*

刪除響應報文的server:
frontend web
bind 172.20.23.36:80
default_backend httpd
rspidel server.*
backend httpd
balance roundrobin
server srv1 192.168.23.41:80 check
server srv2 192.168.23.40:80 check
server sorryserver 127.0.0.1:8080 check backup

添加報文頭部--響應首部:
frontend web
bind 172.20.23.36:80
default_backend httpd
rspidel server.* --刪除server響應首部
rspadd Server:\ nginx --添加自定義首部
backend httpd
balance roundrobin
reqadd testheader:\ test
server srv1 192.168.23.41:80 check
server srv2 192.168.23.40:80 check
server sorryserver 127.0.0.1:8080 check backup

總結:
1 對於前端使用響應相關命令
2 對於後端使用請求相關命令

錯誤頁面配置:

errorfile <code> <file>自定義錯誤頁面
<code>:HTTP status code
支持200|400|403|408|500|502|503|504
<file>:錯誤頁面文件路徑
具體使用:
frontend web
bind 172.20.23.36:80
default_backend httpd
errorfile 503 /etc/haproxy/errorfile/503.html

errorloc <code> <url>
相當於errorloc 302 <code> <url>--利用302重定向至URL
具體案例:
errorloc 503 http://172.20.23.36/test/503.html
壓縮功能:

爲指定的MIME類型啓用壓縮傳輸功能:
compression algo <algorithm>..:啓用http協議的壓縮機制,指明壓縮
算法gzip|deflate

compression type <mine type>...:指明壓縮的MIMI類型
7層健康性檢查:

frontend web
bind 172.20.23.36:80
default_backend httpd
backend httpd
balance roundrobin
option httpchk GET /test.html
http-check expect status 200
server srv1 192.168.23.41:80 check
server srv2 192.168.23.40:80 check
server sorryserver 127.0.0.1:8080 check backup
簡單使用:
option httpchk [請求方法] [uri]
具體使用:
option httpchk GET /test.html
ACL:

Haproxy--------ACL
訪問控制列表[ACL]的使用提供了一個靈活的解決方案來執行容器交換
並且通常基於從請求中提取的內容,響應或任何環境狀態決策

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

<aclname>--ACL名稱 可以使用字母數字 - _ , 區分字符代銷寫
<criterion> --比較的標準和條件

<value>的類型:

  • boolean
  • integer or integer range --整數範圍
  • IP address /netmask --IP/掩碼
  • sting --字符串
  • regular expression --正則表達式
  • hex block --十六進制

<flags>
-i 不區分大小寫
-m 使用指定的paatterm匹配方法
-n 不做DNS解析
-u 強制每個ACL必須唯一ID
-- 強制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進行匹配

ACL中的邏輯關係:

  • 與:隱式(默認)使用
  • 或:使用"or"或"||"表示
  • 否定:使用"!"表示
    簡單示例:
    if invalid_src invalid_port --與關係
    if invalid_src || invalid_port --或關係
    if !invalid_src invalid_port --非關係
    不滿足第一個但是滿足第二個

<criterion> --條件
dst --目標IP
dst_port --目標端口
src --源IP
src_port --源端口
簡單用法:
acl invalid_src src 172.20.23.20

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

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

path_beg /images/ --以/images/開頭
path_end .jpg --以jpg結尾
path_reg ^/images.*.jpeg$ --正則表達式
path_sub image --包括了image字串檢查每一個/xx/
path_dir jpegs --包括jpegs文件夾
path_dom linux --使用linux域 xxx.[linux].com
對比案例:
/images/jpegs/20181104/log.jpg
具體使用:
拒絕某IP用戶訪問:配合errorfile
frontend web
bind 172.20.23.36:80
default_backend httpd
acl false_IP src 172.20.23.20
block if false_IP
errorfile 403 /etc/haproxy/errorfile/403.html
backend httpd
balance roundrobin
server srv1 192.168.23.41:80 check
server srv2 192.168.23.40:80 check
server sorryserver 127.0.0.1:8080 check backup

具體使用2:
拒絕所有test爲前綴的訪問
frontend web
bind 172.20.23.36:80
default_backend httpd
acl false_page path_beg /test
block if false_page
errorfile 403 /etc/haproxy/errorfile/403.html
backend httpd
balance roundrobin
server srv1 192.168.23.41:80 check
server srv2 192.168.23.40:80 check
server sorryserver 127.0.0.1:8080 check backup

實現動靜分離:
use_backend [backname] if
具體提使用:
frontend web
bind 172.20.23.36:80
default_backend httpd
acl false_page path_beg /test
block if false_page
acl php_page path_end .php
use_backend vip if php_page --當訪問php後綴的就網vip組中的主機調度
errorfile 403 /etc/haproxy/errorfile/403.html
backend httpd
balance roundrobin
server srv1 192.168.23.41:80 check
server srv2 192.168.23.40:80 check
server sorryserver 127.0.0.1:8080 check backup
backend vip
balance roundrobin
server vip1 192.168.23.42:80 check
server vip2 192.168.23.43:80 check

url:string
提取請求中的URL,一個典型的應用時具有預取能力的緩存
以及需要從數據庫聚合多個信息並將它們保存在緩存中的網頁門戶入口
推薦使用path

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_agent hdr_sub(User-Agent) -i curl wget
block if bad_agent
拒絕使用curl和wget訪問!
測試:
wget -O -- 172.20.23.20

實現訪問不同主機名稱調度到不同的後端主機:
frontend web
bind 172.20.23.36:80
default_backend httpd
acl false_page path_beg /test
block if false_page
acl php_page path_end .php
use_backend vip if php_page
errorfile 403 /etc/haproxy/errorfile/403.html
acl bad_agent hdr_sub(Host) -i www.a.com
use_backend vip if bad_agent
backend httpd
balance roundrobin
server srv1 192.168.23.41:80 check
server srv2 192.168.23.40:80 check
server sorryserver 127.0.0.1:8080 check backup
backend vip
balance roundrobin
server vip1 192.168.23.42:80 check
server vip2 192.168.23.43:80 check

status : integer
返回在響應報文中的狀態碼

系統預定義ACL
TRUE --總是匹配
FALSE --總是不匹配
HTTP --匹配http協議
HTTP_1.0 --匹配1.0協議
HTTP_1.1 --匹配1.1協議
HTTP_CONTENT --匹配已經存在的內容長度
HTTP_URL_ABS --匹配URL絕對路徑
HTTP_URL_SLASH --匹配URL相對路徑
HTTP_URL_STAR --匹配URL等於"*"
LOACLHOST --匹配從localhost來的連接
METH——CONNECT --匹配HTTP CONNECT方法
METH_GET --匹配使用get爲請求方法的
METH-HEAD --匹配使用head爲請求方法的

其它配置項:
當被acl匹配到時就切換到指定backend
use_backend [backendname] if [aclname]
阻止7層請求如果acl匹配成功
block if [aclname]

http-request {allow|deny|add-header}
acl niceguy src 172.20.23.1
acl bedguy src 172.20.23.2
具體使用:白名單
http-request allow niceguy
http-request deny bedguy

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

示例:
listen ssh
bind :22222
balance roundrobin
mode tcp
acl false_ip src 172.20.23.20
tcp-request connection reject if false_ip
server ssh1 192.168.23.40:22 check
server ssh2 192.168.23.41:22 check

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章