一、配置文件
#--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global log 127.0.0.1 local2 #[err warning info debug] chroot /usr/local/haproxy-1.7.3 pidfile /var/run/haproxy.pid #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件 maxconn 4000 #最大连接数,默认4000 user haproxy group haproxy daemon #创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon" #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http #默认的模式,tcp是4层,http是7层,health只会返回OK,若是混合模式则mode不需要设置 log global #采用全局定义的日志 option dontlognull #不记录健康检查的日志信息 option httpclose #每次请求完毕后主动关闭http通道 option httplog #日志类别http日志格式 混合模式 此处还需要加上 tcplog #option forwardfor #传递客户端真实ip到后端服务器,从Http Header中获得客户端ip option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器 timeout http-request 10s #http请求超时时间 timeout queue 1m #一个请求在队列里的超时时间 timeout connect 10s #连接后端服务器超时 timeout client 10s #客户端连接超时 timeout server 10s #服务器连接超时 timeout http-keep-alive 10s #设置http-keep-alive的超时时间 timeout check 10s #检测超时 maxconn 60000 #最大连接数 retries 3 #3次连接失败就认为服务不可用,也可以通过后面设置 ########监控页面配置######## listen admin_stats bind 0.0.0.0:8089 #监听端口 stats enable #启用状态监控 mode http log global stats uri /stats #监控页面URL访问路径 stats realm HaproxyStatistics #监控页面密码框上提示文本 stats auth admin:admin #监控页面用户名和密码设置 #stats hide-version #隐藏监控页面上HAProxy的版本信息 stats admin if TRUE #当通过认证才可管理 stats refresh 30s #统计页面自动刷新时间(有些版本该选项已取消) ########WEB配置################# listen web1080 bind 0.0.0.0:1080 mode http option httplog log global maxconn 3000 balance leastconn acl client1 src 10.47.254.12/32 acl client2 src 10.47.39.16/32 #redirect location https://www.baidu.com if client1 #重定向client1的访问到百度 http-request deny|allow if client1 || client2 #七层的请求访问控制,拒绝或允许client1和client2的访问 tcp-request connection reject|accept if client1 #四层的请求访问控制,拒绝或允许client1的访问 server web33 192.168.80.33:8007 cookie 1 check inter 2000 rise 3 fall 3 weight 2 server web34 192.168.80.34:8007 cookie 2 check inter 2000 rise 3 fall 3 weight 1 server web35 192.168.80.35:8007 cookie 3 check inter 1500 rise 3 fall 3 backup #定义后端服务器的内部名称[web33,web34,web35],该名称将会呈现在日志或警报中 #后端服务器的IP地址,支持端口映射[192.168.80.33:8007] #指定该服务器的SERVERID为1[cookie 1] #健康监测频率[check inter 2000]、监测的间隔时长,单位毫秒 #监测正常3次后被认为后端服务器是可用的[rise 3] #监测失败3次后被认为后端服务器是不可用的[fall 3] #分发的权重[weight 2]、最后为备份用的后端服务器,当正常的服务器全部都宕机后,才会启用备份服务器[backup] #--------------------------------------------------------------------- # main frontend which proxys to the backends 这里不需要动静分离,所以全部注释掉 #--------------------------------------------------------------------- #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 #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- #backend static # balance roundrobin # server static 127.0.0.1:4331 check #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- #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 #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- #errorloc 503 http://www.osyunwei.com/404.html errorfile 403 /etc/haproxy/errorfiles/403.http errorfile 500 /etc/haproxy/errorfiles/500.http errorfile 502 /etc/haproxy/errorfiles/502.http errorfile 503 /etc/haproxy/errorfiles/503.http errorfile 504 /etc/haproxy/errorfiles/504.http
二、acl规则
acl acl名称 acl方法 -i [匹配的路径或者方法]
-i:表示不区分大小写,后边跟上匹配的路径或文件或正则表达式
常用的acl方法:
1. be_sess_rate(backend) <integer>
用于测试指定的backend上会话创建的速率(即每秒创建的会话数)是否满足指定的条件;常用于在指定backend上的会话速率过高时将用户请求转发至另外的backend,或用于阻止攻击行为。例如:
backend dynamic
mode http
acl being_scanned be_sess_rate gt 50
redirect location /error_pages/denied.html if being_scanned
2. 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 50
tcp-request inspect-delay 50ms
tcp-request content accept if ! too_fast
tcp-request content accept if WAIT_END
3. method <string>
测试HTTP请求报文中使用的方法
acl client1 method GET
4. path_beg <string>
用于测试请求的URL是否以<string>指定的模式开头。下面的例子用于测试URL是否以/static、/iilannis、/javascript或/stylesheets开头。
acl url_static path_beg -i /static /iilannis /javascript /stylesheets
5. path_end <string>
用于测试请求的URL是否以<string>指定的模式结尾。例如,下面的例子用户测试URL是否以jpg、gif、png、css或js结尾。
acl url_static path_end -i .jpg .gif .png .css .js
6. path_reg <string>
正则匹配URI
acl client1 path_reg -i ^/baidu
7. hdr(header) <string>
用于测试请求报文中的所有首部或指定首部是否满足指定的条件;指定首部时,其名称不区分大小写,且在括号“()”中不能有任何多余的空白字符。测试服务器 端的响应报文时可以使用shdr()。例如下面的例子用于测试首部Connection的值是否为close。
hdr(Connection) -i close
8. hdr_beg <string>
用于测试请求报文的指定首部的开头部分是否符合<string>指定的模式。例如,下面的例子用记测试请求是否为提供静态内容的主机img、video、download或ftp。
acl host_static hdr_beg(host) -i img. video. download. ftp.
9. hdr_end <string>
用于测试请求报文的指定首部的结尾部分是否符合<string>指定的模式。例如,下面的例子用记测试请求是否为
10. hdr_reg <string>
正则匹配
acl bbs hdr_reg(host) -i ^(bbs.test.com|shequ.test.com|forum)
use_backend bbs_pool if bbs || bbs_path
11. acl逻辑关系
acl规则可用在frontend、listen、backend中,不能用在default中
同一个acl中可以指定多个测试条件,这些测试条件需要由逻辑操作符指定其关系。条件间的组合测试关系有三种:
“与”(使用“and”关键字或省略),例:
frontend web_server
bind *:80
acl badguy src 10.0.10.1
acl denyfile path /1.html
http-request deny if badguy denyfile
“或”(使用“||”操作符或“or”关键字),例:
frontend web_server
bind *:80
acl badguy src 10.0.10.1
acl denyfile path /1.html
http-request deny if badguy || denyfile
“非”(使用“!”操作符),例:
frontend web_server
bind *:80
http-request deny if ! badguy
三、haproxy日志配置
1、编辑“/etc/rsyslog.conf”打开如下配置项:
[root@haproxy ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
2、在/etc/rsyslog.d/目录下创建haproxy.conf文件
[root@haproxy ~]# vim /etc/rsyslog.d/haproxy.conf
#Save haproxy log
local2.* /var/log/haproxy.log
3、编辑/etc/sysconfig/rsyslog文件
[root@haproxy ~]# vim /etc/sysconfig/rsyslog
# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-r -c 2"
# -r:打开接受外来日志消息的功能,其监控514 UDP端口
# -m:修改syslog的内部mark消息写入间隔时间(0为关闭),例如240为每隔240分钟写入一次"--MARK--"信息;
4、重启rsyslog服务
[root@haproxy ~]# /etc/init.d/rsyslog restart
5、自定义日志格式
capture request header Host len 64
capture request header User-Agent len 128
capture request header X-Forwarded-For len 100
capture request header Referer len 200
capture response header Server len 40
capture response header Server-ID len 40
log-format %ci:%cp %si:%sp %B %U %ST %r %b %f %bi %hrl %hsl
参考链接:
https://www.linuxidc.com/Linux/2018-03/151169.htm #haproxy配置详解
https://cbonte.github.io/haproxy-dconv/ #haproxy官方文档
https://www.jianshu.com/p/60dcac5c032c
http://blog.51cto.com/eric1/1854574 #自定义haproxy日志格式