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大請求事件,默認是毫秒(單位可改)
timeout queue <timeout>
讓客戶端等待隊列最大的時間,一般超時返回503
timeout connect <timeout>
不在隊列的前提下,服務器響應過慢,服務器超時
timeout client <timeout>
定義TCP超時時間,客戶端tcp超時
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上家前綴
cookie功能:第一次會話,server生成隨機cookie提供給客戶使用,客戶將cookie保存在自己的緩存中,後面訪問server時,都會附加用戶,會話標識。
nocache:一旦由cookie,通知緩存服務器怒要緩存用戶數據
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: [確定]
option forwordfor:後端服務器知道那個客戶端過來請求,使用日誌查看,通過x-forward-for。在haproxy上附加客戶端的IP地址,結果haproxy,封裝後給後端服務器。
[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(可以不寫)
[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:
[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.
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
配置案例
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