haproxy (3)

3.17 option httplog


option httplog [ clf ]


啓用記錄HTTP請求、會話狀態和計時器的功能。


clf:使用CLF格式來代替HAProxy默認的HTTP格式,通常在使用僅支持CLF格式的特定日誌分析器時才需要使用此格式。


默認情況下,日誌輸入格式非常簡陋,因爲其僅包括源地址、目標地址和實例名稱,而“option httplog”參數將會使得日誌格式變得豐富許多,其通常包括但不限於HTTP請求、連接計時器、會話狀態、連接數、捕獲的首部及cookie、“frontend”、“backend”及服務器名稱,當然也包括源地址和端口號等。


3.18 option logasap

     no option logasap


option logasap

no option logasap


啓用或禁用提前將HTTP請求記入日誌,不能用於“backend”區段。


默認情況下,HTTP請求是在請求結束時進行記錄以便能將其整體傳輸時長和字節數記入日誌,由此,傳較大的對象時,其記入日誌的時長可能會略有延遲。“option logasap”參數能夠在服務器發送complete首部時即時記錄日誌,只不過,此時將不記錄整體傳輸時長和字節數。此情形下,捕獲“Content-Length”響應首部來記錄傳輸的字節數是一個較好選擇。下面是一個例子。


  listen http_proxy 0.0.0.0:80

      mode http

      option httplog

      option logasap

      log 172.16.100.9 local2


3.17 option httplog


option httplog [ clf ]


啓用記錄HTTP請求、會話狀態和計時器的功能。


clf:使用CLF格式來代替HAProxy默認的HTTP格式,通常在使用僅支持CLF格式的特定日誌分析器時才需要使用此格式。


默認情況下,日誌輸入格式非常簡陋,因爲其僅包括源地址、目標地址和實例名稱,而“option httplog”參數將會使得日誌格式變得豐富許多,其通常包括但不限於HTTP請求、連接計時器、會話狀態、連接數、捕獲的首部及cookie、“frontend”、“backend”及服務器名稱,當然也包括源地址和端口號等。


3.18 option logasap

     no option logasap


option logasap

no option logasap


啓用或禁用提前將HTTP請求記入日誌,不能用於“backend”區段。


默認情況下,HTTP請求是在請求結束時進行記錄以便能將其整體傳輸時長和字節數記入日誌,由此,傳較大的對象時,其記入日誌的時長可能會略有延遲。“option logasap”參數能夠在服務器發送complete首部時即時記錄日誌,只不過,此時將不記錄整體傳輸時長和字節數。此情形下,捕獲“Content-Length”響應首部來記錄傳輸的字節數是一個較好選擇。下面是一個例子。


  listen http_proxy 0.0.0.0:80

      mode http

      option httplog

      option logasap

      log 172.16.100.9 local2


3.20 errorfile


errorfile <code> <file>


在用戶請求不存在的頁面時,返回一個頁面文件給客戶端而非由haproxy生成的錯誤代碼;可用於所有段中。


<code>:指定對HTTP的哪些狀態碼返回指定的頁面;這裏可用的狀態碼有200、400、403、408、500、502、503和504;

<file>:指定用於響應的頁面文件;


例如:

errorfile 400 /etc/haproxy/errorpages/400badreq.http

errorfile 403 /etc/haproxy/errorpages/403forbid.http

errorfile 503 /etc/haproxy/errorpages/503sorry.http


3.21 errorloc 和 errorloc302 


errorloc <code> <url>

errorloc302 <code> <url>



請求錯誤時,返回一個HTTP重定向至某URL的信息;可用於所有配置段中。


<code>:指定對HTTP的哪些狀態碼返回指定的頁面;這裏可用的狀態碼有200、400、403、408、500、502、503和504;

<url>:Location首部中指定的頁面位置的具體路徑,可以是在當前服務器上的頁面的相對路徑,也可以使用絕對路徑;需要注意的是,如果URI自身錯誤時產生某特定狀態碼信息的話,有可能會導致循環定向;


需要留意的是,這兩個關鍵字都會返回302狀態嗎,這將使得客戶端使用同樣的HTTP方法獲取指定的URL,對於非GET法的場景(如POST)來說會產生問題,因爲返回客戶的URL是不允許使用GET以外的其它方法的。如果的確有這種問題,可以使用errorloc303來返回303狀態碼給客戶端。


3.22 errorloc303


errorloc303 <code> <url>


請求錯誤時,返回一個HTTP重定向至某URL的信息給客戶端;可用於所有配置段中。


<code>:指定對HTTP的哪些狀態碼返回指定的頁面;這裏可用的狀態碼有400、403、408、500、502、503和504;

<url>:Location首部中指定的頁面位置的具體路徑,可以是在當前服務器上的頁面的相對路徑,也可以使用絕對路徑;需要注意的是,如果URI自身錯誤時產生某特定狀態碼信息的話,有可能會導致循環定向;


例如:


backend webserver

  server 172.16.100.6 172.16.100.6:80 check maxconn 3000 cookie srv01

  server 172.16.100.7 172.16.100.7:80 check maxconn 3000 cookie srv02

  errorloc 403 /etc/haproxy/errorpages/sorry.htm

  errorloc 503 /etc/haproxy/errorpages/sorry.htm


timeout http-request <timeout>

面對客戶端的UI大請求事件,默認是毫秒(單位可改)

wKiom1ZXzRqD89TEAABL3sVjd-s743.jpg


timeout queue <timeout>

讓客戶端等待隊列最大的時間,一般超時返回503

wKioL1ZXzg6BOU7dAABV6N7zL2U512.jpg

timeout connect <timeout>

不在隊列的前提下,服務器響應過慢,服務器超時

wKioL1ZXzr_wErbcAABakuw-aDQ689.jpg

timeout client <timeout>

定義TCP超時時間,客戶端tcp超時

wKiom1ZXzx_RSYx2AABIOfVHSGs611.jpg

timeout server <timeout>

服務器與客戶端建立tcp會話的超時時間


timeout http-keep-alive <timeout>

保持連接的超時時間,客戶端長連接一側多長時間


timeout check

健康狀態檢測的超時





cookie:啓用後端服務器會話粘性的功能。目的是注重客戶端的身份信息。haproxy如何篡改客戶端和server發來的cookie。

    rewrite:重寫,server提供新的cookie

    insert:server在響應用戶名請求時,server附加cookie信息,haproxy內部插入haproxy認爲要插入的信息

    prefix:在cookie上家前綴

wKioL1ZXr3XjLdkqAACg96bor0w442.jpg

cookie功能:第一次會話,server生成隨機cookie提供給客戶使用,客戶將cookie保存在自己的緩存中,後面訪問server時,都會附加用戶,會話標識。

wKiom1ZXsBjhHEBkAADiunE0JIw984.jpg



nocache:一旦由cookie,通知緩存服務器怒要緩存用戶數據

wKioL1ZXsyPSkyKEAADsVimEXRs242.jpg

cookie的粘性設置

[root@node200 ~]# vim /etc/haproxy/haproxy.cfg

 81 backend appsrvs

 82     balance     roundrobin

 83     option httpchk

 84     cookie SERVERID insert indirect nocache

 85     server  node2 192.168.112.130:80 check inter 2 rise 1 fall 3 cookie node2

 86     server  node3 192.168.112.140:80 check inter 2 rise 1 fall 3 cookie node3

 87 #    server  app3 127.0.0.1:5003 check

 88  #   server  app4 127.0.0.1:5004 check

 89 listen stats_pages

 90 bind *:9001

 91 stats enable

 92 stats uri /haproxyadmin?stats

[root@node200 ~]# service haproxy restart

停止 haproxy:                                             [確定]

正在啓動 haproxy:                                         [確定]

wKioL1ZVar-T9ogyAAMRLO-iH84975.jpg



option forwordfor:後端服務器知道那個客戶端過來請求,使用日誌查看,通過x-forward-for。在haproxy上附加客戶端的IP地址,結果haproxy,封裝後給後端服務器。

wKioL1ZXtPnBA2GXAAB40WOOj2g373.jpg

[root@node200 ~]# vim /etc/haproxy/haproxy.cfg

  73 backend appsrvs

 74     balance     roundrobin

 75     mode http

 76    # option httpchk

 77    # cookie SERVERID insert indirect nocache    

 78     server  node2 192.168.112.130:80 check

 79     server  node3 192.168.112.140:80 check

 80     option forwardfor except 127.0.0.1(可以不寫)


wKiom1ZVc6uS6B8HAAARdqMRKdc159.jpg

[root@node2 ~]# vim /etc/httpd/conf/httpd.conf 

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

[root@node2 ~]# service httpd reload

重新載入 httpd:

wKioL1ZWY9qT34gIAACBOL9x3AY714.jpg

[root@node2 ~]# tail /var/log/httpd/access_log

192.168.112.200 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (X11; Linux

192.168.112.200 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (X11; Linux

192.168.112.200 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (X11; Linux

192.168.112.1 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 6

192.168.112.1 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 6

192.168.112.1 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 6

192.168.112.1 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 6

192.168.112.1 - - "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.

spacer.gif

wKioL1ZWZDyC6BHbAAC76WSI8yc398.jpg

wKioL1ZWZD2gIOJkAACsMPZNcV8941.jpg


option http-server-close;no option http-server-close

長連接超時,主動關閉服務器連接;

注意:如果啓用長連接,必須啓動此選項


option http-pretend-keeplived;no option http-pretend-keeplived

haproxy通告webserver是否假裝長連接,保持長連接;客戶端一側長連接,web端需要長連接。


option httpclose;no option httpclose

一般是第一次請求,haproxy分析併發送webserver,然後第二次haproxy不會檢查,管道直接連接webserver(當粘性定位)。

option httpclos:haproxy會對每個請求做作請求。首部:“connection:close”的時候會做檢查。


option redispatch;no option redispatch

當連接發生錯誤時,是否需要重新會話調度。


redirect

URL重定向

示例:acl secure dst_port 8080

acl login_page url_beg /login

acl secure dst_port 8080

redirect prefix http://zye.com if login_page !secure(之間是與的關係)

 注意:acl相同屬於“或”的關係。


五 ACL


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


  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中可以指定多個測試條件,這些測試條件需要由邏輯操作符指定其關係。條件間的組合測試關係有三種:“與”(默認即爲與操作)、“或”(使用“||”操作符)以及“非”(使用“!”操作符)。


5.1 常用的測試標準(criteria)


5.1.1 be_sess_rate <integer>


be_sess_rate(backend) <integer>


用於測試指定的backend上會話創建的速率(即每秒創建的會話數)是否滿足指定的條件;常用於在指定backend上的會話速率過高時將用戶請求轉發至另外的backend,或用於阻止ddos***行爲。例如:


    backend dynamic

        mode http

        acl being_scanned be_sess_rate gt 50

        redirect location /error_pages/denied.html if being_scanned


5.1.2 fe_sess_rate <integer>


fe_sess_rate(frontend) <integer>


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


    frontend mail

        bind :25

        mode tcp

        maxconn 500

        acl too_fast fe_sess_rate ge 500

        tcp-request inspect-delay 50ms(以50秒做TCP訪問控制)

        tcp-request content accept if ! too_fast

        tcp-request content accept if WAIT_END

標註:tcp-request:tcp層次中做訪問控制


5.1.3 hdr <string>


hdr(header) <string>


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


    hdr(Connection) -i close


5.1.4 method <string>


method <string>


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


5.1.5 path_beg <string>


  URL scheme://host:port/path/to/somewhere 中的 /path/to/somewhere


用於測試請求的URL是否以<string>指定的模式開頭。下面的例子用於測試URL是否以/static、/p_w_picpaths、/javascript或/stylesheets頭。


    acl url_static       path_beg       -i /static /p_w_picpaths /javascript /stylesheets


5.1.6 path_end <string>


用於測試請求的URL是否以<string>指定的模式結尾。例如,下面的例子用戶測試URL是否以jpg、gif、png、css或js結尾。


    acl url_static       path_end       -i .jpg .gif .png .css .js


    


5.1.7 hdr_beg <string>


用於測試請求報文的指定首部的開頭部分是否符合<string>指定的模式。例如,下面的例子用記測試請求是否爲提供靜態內容的主機img、video、download或ftp。


    acl host_static hdr_beg(host) -i img. video. download. ftp.


5.1.8 hdr_end <string>


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


其它的creterion:

  dst_port, src_port, src, dst, url_beg, url_end, path, url_reg, path_reg

動靜分離

[root@node200 ~]# vim /etc/haproxy/haproxy.cfg

 63 frontend  main

 64     bind *:80

 65      acl url_static       path_beg       -i /static /p_w_picpaths /javascript /stylesheets

 66     acl url_static       path_end       -i .jpg .gif .png .css .js

 67 mode http

 68     use_backend static          if url_static

 69     default_backend             appsrvs

 70 #---------------------------------------------------------------------

 71 # static backend for serving up p_w_picpaths, stylesheets and such

 72 #---------------------------------------------------------------------

 73 backend static

 74 balance roundrobin

 75 server static1 192.168.112.131 check

 76 server static2 192.168.112.120 check

 77 

 78 backend appsrvs 

 79     balance     roundrobin

 80     mode http

 81     option httpchk

 82     cookie SERVERID insert indirect nocache    

 83     server  node2 192.168.112.130:80 check cookie node2

 84     server  node3 192.168.112.140:80 check cookie node3


reqadd:客戶端請求報文發送至後端服務器,在http尾部添加首部,目的時對後端服務器的日誌,程序調用。

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

acl is-ssl dst_port 81

regadd X-proto:\ is ssl


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

從後端服務器響應客戶端時,在http添加首部在響應報文。

acl is-ssl dst_port 81

regadd X-proto:\ is ssl


構建響應報文

[root@node200 ~]# vim /etc/haproxy/haproxy.cfg

 63 frontend  main

 64     bind *:80

 65     rspadd X-Via:\ zye  

 67 #     acl url_static       path_beg       -i /static /p_w_picpaths /javascri    pt /stylesheets

 68 #    acl url_static       path_end       -i .jpg .gif .png .css .js

 69 

 70 mode http

 71   #  use_backend static          if url_static

 72     default_backend             appsrvs

 73 #---------------------------------------------------------------------

 74 # static backend for serving up p_w_picpaths, stylesheets and such

 75 #---------------------------------------------------------------------

 76 #backend static

 77 #balance roundrobin

 78 #server static1 192.168.112.131 check

 79 #server static2 192.168.112.120 check

 80 

wKiom1ZWtvWQBSVIAAIXbqLFaKw686.jpg



配置案例


1. http服務器配置示例


#---------------------------------------------------------------------

# 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


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                 30000


listen stats

    mode http

    bind 0.0.0.0:1080

    stats enable

    stats hide-version

    stats uri     /haproxyadmin?stats

    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

    default_backend servers


frontend healthcheck

    bind :1099

    mode http

    option httpclose

    option forwardfor

    default_backend servers


backend servers

  balance roundrobin

    server websrv1 192.168.10.11:80 check maxconn 2000

    server websrv2 192.168.10.12:80 check maxconn 2000

    



2. 負載均衡MySQL服務的配置示例


#---------------------------------------------------------------------

# 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


defaults

    mode                    tcp

    log                     global

    option                  httplog

    option                  dontlognull

    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                 600


listen stats

    mode http

    bind 0.0.0.0:1080

    stats enable

    stats hide-version

    stats uri     /haproxyadmin?stats

    stats realm   Haproxy\ Statistics

    stats auth    admin:admin

    stats admin if TRUE



frontend mysql

    bind *:3306

    mode tcp

    log global

    default_backend mysqlservers


backend mysqlservers

    balance leastconn

    server dbsrv1 192.168.10.11:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300

    server dbsrv2 192.168.10.12:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300





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