标签:haproxy
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、/images、/javascript或/stylesheets头。
acl url_static path_beg -i /static /images /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 /images /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 images, 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 /images /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 images, 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
标签:haproxy
原文地址:http://youenstudy.blog.51cto.com/6722910/1717389