What is HAProxy
HAProxy是一个使用C语言编写的自由及开放源代码软件,它提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理功能。HAProxy由法国开发者威利塔罗(Willy Tarreau)在2000年开发,特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。以下是HAProxy的详细介绍:
一、主要特点
- 高性能:HAProxy运行在当前的硬件上,支持高达数百万级别的并发连接,并且具有极低的延迟。
- 高可靠性:HAProxy的实现基于事件驱动、单一进程模型,这种模型支持非常大的并发连接数,同时保持高度的可靠性和稳定性。
- 高灵活性:HAProxy支持基于cookie的持久性、自动故障切换、正则表达式及web状态统计等功能,使得它可以灵活地应对各种复杂的负载均衡需求。
- 安全性:HAProxy的运行模式使得它可以很简单安全地整合进用户当前的架构中,同时可以保护用户的web服务器不被暴露到网络上。
二、支持功能
- TCP和HTTP反向代理:HAProxy可以作为TCP和HTTP的反向代理,将客户端的请求转发到后端服务器。
- SSL/TLS支持:HAProxy支持SSL/TLS加密,可以保护客户端与服务器之间的通信安全。
- 负载均衡算法:HAProxy支持多达8种负载均衡算法,如轮询(roundrobin)、最少连接(leastconn)等,可以根据实际需求选择合适的算法。
- 会话保持:HAProxy支持基于cookie、用户IP等多种方式的会话保持,确保来自同一客户端的请求被转发到同一台后端服务器上。
- 健康检查:HAProxy可以对后端服务器进行健康检查,确保只有健康的服务器才能接收请求。
三、应用场景
HAProxy不仅适用于Web服务器负载均衡,还能应用于数据库、邮件服务器、缓存服务器等多种场景。通过HAProxy,可以有效地提高系统的可用性和性能,降低单点故障的风险。
四、安装与配置
HAProxy的安装和配置相对简单,可以从官方网站下载源码包进行编译安装,也可以通过包管理器进行安装。配置HAProxy时,需要定义前端(frontend)和后端(backend),并设置相应的负载均衡算法和会话保持方式等参数。
五、版本更新
HAProxy不断更新以提供更好的功能和性能。例如,最新版本可能包含新的负载均衡算法、更好的健康检查机制或增强的安全性功能。因此,建议定期检查并更新HAProxy到最新版本。
综上所述,HAProxy是一款功能强大、性能卓越、灵活可靠的负载均衡软件,广泛应用于各种高负载、高并发的Web服务场景中。
HAProxy基本配置信息
HAProxy的配置文件
global
HAProxy配置文件中的global
部分包含了全局配置参数,这些参数对于HAProxy的性能、安全性、日志记录等方面都至关重要。正确配置这些参数可以确保HAProxy的稳定运行和高效工作。
proxies
proxies配置段是HAProxy配置文件的核心部分,通过defaults、frontend、backend和listen四个子段的灵活配置,可以实现对HAProxy代理和负载均衡功能的全面控制。在实际应用中,需要根据具体的业务需求和场景来选择合适的配置参数和策略。
环境部署
Haproxy服务器:20.0.0.30
Nginx 服务器1:20.0.0.31
Nginx 服务器2:20.0.0.32
haproxy 服务器部署(20.0.0.30)
1.关闭防火墙,将安装Haproxy所需软件包传到/opt目录下
systemctl stop firewalld
setenforce 0haproxy-1.5.19.tar.gz2.编译安装 Haproxy
yum install -y pcre-devel bzip2-devel gcc gcc-c++ maketar zxvf haproxy-1.5.19.tar.gz
cd haproxy-1.5.19/
make TARGET=linux2628 ARCH=x86_64
make install——————————————————————————参数说明———————————————————————————————————————————————————————
TARGET=linux26 #内核版本,
#使用uname -r查看内核,如:2.6.18-371.el5,此时该参数用TARGET=linux26;kernel大于2.6.28的用TARGET=linux2628ARCH=x86_64 #系统位数,64位系统
————————————————————————————————————————————————————————————————————————————————————————3.Haproxy服务器配置
mkdir /etc/haproxycp examples/haproxy.cfg /etc/haproxy/cd /etc/haproxy/vim haproxy.cfgglobal #全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关
--4~5行--修改,定义haproxy日志输出设置和日志级别,local0为日志设备,默认存放到系统日志log /dev/log local0 info #修改log /dev/log local0 notice #修改#log loghost local0 infomaxconn 4096 #最大连接数,需考虑ulimit -n限制,推荐使用10240
--8行--注释,chroot运行路径,为该服务自设置的根目录,一般需将此行注释掉#chroot /usr/share/haproxyuid 99 #用户UIDgid 99 #用户GIDdaemon #守护进程模式nbproc 1 #添加,设置并发进程数,建议与当前服务器CPU核数相等或为其2倍defaults #配置默认参数,这些参数可以被用到Listen,frontend,backend组件 log global #引入global定义的日志格式mode http #模式为http(7层代理http,4层代理tcp)option httplog #日志类别为http日志格式option dontlognull #不记录健康检查日志信息retries 3 #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用redispatch #当服务器负载很高时,自动结束当前队列处理比较久的连接maxconn 2000 #最大连接数,“defaults”中的值不能超过“global”段中的定义#contimeout 5000 #设置连接超时时间,默认单位是毫秒#clitimeout 50000 #设置客户端超时时间,默认单位是毫秒#srvtimeout 50000 #设置服务器超时时间,默认单位是毫秒timeout http-request 10s #默认http请求超时时间timeout queue 1m #默认队列超时时间timeout connect 10s #默认连接超时时间,新版本中替代contimeout,该参数向后兼容timeout client 1m #默认客户端超时时间,新版本中替代clitimeout,该参数向后兼容timeout server 1m #默认服务器超时时间,新版本中替代srvtimeout,该参数向后兼容timeout http-keep-alive 10s #默认持久连接超时时间timeout check 10s #设置心跳检查超时时间--删除下面所有listen项--,添加
listen webcluster 0.0.0.0:80 #haproxy实例状态监控部分配置,定义一个名为webcluster的应用option httpchk GET /test.html #检查服务器的test.html文件balance roundrobin #负载均衡调度算法使用轮询算法roundrobinserver inst1 20.0.0.31:80 check inter 2000 fall 3 #定义在线节点server inst2 20.0.0.32:80 check inter 2000 fall 3—————————————————————参数说明————————————————————————————————————————————————————————————
balance roundrobin #负载均衡调度算法
#轮询算法:roundrobin;最小连接数算法:leastconn;来源访问调度算法:source,类似于nginx的ip_hashcheck inter 2000 #表示启用对此后端服务器执行健康检查,设置健康状态检查的时间间隔,单位为毫秒连续三次检测不到心跳频率则认为该
fall 3 #表示节点失效
若节点配置后带有“backup”表示该节点只是个备份节点,仅在所有在线节点都失效该节点才启用。不携带“backup”,表示为主节点,和其它在线节点共同提供服务。
————————————————————————————————————————————————————————————————————————————————————————4.添加haproxy 系统服务
cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxychmod +x /etc/init.d/haproxychkconfig --add /etc/init.d/haproxyln -s /usr/local/sbin/haproxy /usr/sbin/haproxyservice haproxy start 或 /etc/init.d/haproxy start
节点服务器部署(20.0.0.31 、20.0.0.32)
#关闭防火墙、安全机制
systemctl stop firewalld
setenforce 0#安装必要组件
yum install -y pcre-devel zlib-devel gcc gcc-c++ make #创建系统用户
useradd -M -s /sbin/nologin nginx#编译安装nginx
cd /opt
tar -zxvf nginx-1.12.0.tar.gz -C /opt/cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make installmake && make install--20.0.0.31---
echo "this is test port31" > /usr/local/nginx/html/test.html--20.0.0.32---
echo "this is test port32" > /usr/local/nginx/html/test.htmlln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/systemctl start nginx #启动nginx 服务
HAProxy的算法
HAProxy是一款高性能的负载均衡器和代理服务器,支持多种负载均衡算法,以满足不同场景下的需求。以下是HAProxy支持的主要算法及其特点:
1. Round Robin(轮询)
- 特点:最简单的负载均衡算法,按照后端服务器的权重轮流分配请求。当服务器的处理时间平均分配时,此算法运行最流畅和公平。
- 动态性:支持权重的运行时调整及慢启动机制,最大支持4095个后端主机。
- 适用场景:适用于大多数场景,尤其是服务器处理时间相对均衡的情况。
2. Static-RR(静态轮询)
- 特点:类似于Round Robin,但不支持运行时调整权重及慢启动机制。每个服务器根据权重轮流使用,对服务器数量没有限制。
- 动态性:静态算法,权重在服务器运行时改变不生效,除非重启服务器,但重启会导致此前所有连接断开。
- 适用场景:适用于服务器权重相对固定,不需要频繁调整的场景。
3. Leastconn(最少连接)
- 特点:连接数最少的服务器优先接收连接。这是一种动态算法,支持权重的动态改变和慢启动。
- 适用场景:建议用于长会话场景,如LDAP、SQL等协议,而不适合短会话协议,如HTTP。因为对于短会话,计算连接数带来的性能消耗可能超过其带来的收益。
4. First(首选)
- 特点:根据服务器在列表中的位置,自上而下进行调度。前面服务器的连接数达到上限后,新请求才会分配给下一台服务器。
- 适用场景:一般用于测试环境或特定场景下,以确保某些服务器优先处理请求。
5. Source(源地址)
- 特点:根据请求源IP进行负载均衡,可以确保来自同一个IP的主机使用同一个后端服务器。
- 适用场景:适用于需要基于源IP进行会话保持的场景。
6. URI(请求URI)
- 特点:根据请求的URI进行负载均衡。适用于基于URL的负载均衡场景。
- 适用场景:适用于需要根据请求内容(如特定URL)进行负载均衡的场景。
7. UrlParam(请求URL参数)
- 特点:根据请求的URL参数进行负载均衡,需要指定参数名称。
- 适用场景:适用于需要根据URL中的特定参数进行负载均衡的场景,如追踪请求中的用户标识。
8. HDR(请求头)
- 特点:根据HTTP请求头来锁定每一次HTTP请求。可用于特定场景下的负载均衡。
- 适用场景:适用于需要根据HTTP请求头中的特定信息(如User-Agent)进行负载均衡的场景。
9. RDp-Cookie(Cookie)
- 特点:根据Cookie值进行负载均衡,可用于保持会话的一致性。
- 适用场景:适用于需要保持用户会话一致性的场景,如电子商务网站等。
额外说明
- 会话保持和Session共享:HAProxy支持用户IP识别和Cookie识别来实现会话保持和Session共享,以解决负载请求分发到不同服务器时可能导致Session会话不同步的问题。
- 四层负载均衡与七层负载均衡:HAProxy支持TCP(四层)和HTTP(七层)两种代理模式。四层负载均衡基于IP+端口进行负载均衡,而七层负载均衡则基于应用层内容进行负载均衡,能够更精细地控制负载均衡策略。
总结
HAProxy的高级功能及配置
基于 cookie 的会话保持
使用cookie
关键字来配置后端服务器基于 cookie 的会话持久连接。
配置示例
listen statsmode httpbind 172.20.2.189:9999stats enablelog globalstats uri /haproxy_statusstats auth haadmin:stevenuxfrontend WEB_PORT_80bind 172.20.2.189:8080mode httpuse_backend web_prot_http_nodesbackend web_prot_http_nodesmode httpbalance roundrobinoption forwardforcookie SRV-COOKIE insert indirect nocache maxidle 30m maxlife 8hserver node1 172.20.2.37:80 send-proxy cookie srv1-cookie weight 1 check inter 3000 fall 3 rise 5server node2 172.20.2.43:80 cookie srv2-cookie weight 1 check inter 3000 fall 3 rise 5server node3 172.20.2.44:80 cookie srv3-cookie weight 1 check inter 3000 fall 3 rise 5server node4 172.20.2.45:80 cookie srv4-cookie weight 1 check inter 3000 fall 3 rise 5
访问测试–client-node1
[root@client-node1 ~]# curl --cookie "SRV-COOKIE=srv1-cookie" http://172.20.2.189:8080
node1 172.20.2.37
[root@client-node1 ~]# curl --cookie "SRV-COOKIE=srv4-cookie" 172.20.2.189:8080
node4 172.20.2.45
[root@client-node1 ~]# curl --cookie "SRV-COOKIE=srv3-cookie" 172.20.2.189:8080
node3 172.20.2.44
[root@client-node1 ~]# curl --cookie "SRV-COOKIE=srv2-cookie" 172.20.2.189:8080
HAProxy 状态页配置和使用
HAProxy 提供了 WEB 信息界面,用来查看和管理后端服务器的状态信息。在配置
文件中使用stats
关键字指明各个控制状态页的参数。
状态页配置选项
stats enable # 基于默认的参数启用stats page
# 默认参数使用如下:- stats uri : /haproxy?stats- stats realm : "HAProxy Statistics"- stats auth : no authentication- stats scope : no restrictionstats hide-version # 隐藏HAProxy版本
stats refresh <delay> # 设定WEB页面自动刷新时间间隔
stats uri <prefix> # 自定义stats page uri,默认值:/haproxy?stats
stats realm <realm> # 账户认证时的提示信息,示例:stats realm : HAProxy\ Statistics
stats auth <user>:<passwd> # 认证时的账号和密码,可使用多次,默认:no authentication
stats admin { if | unless } <cond> # 启用stats page中的管理功能
启用状态页配置
listen statsmode httplog globalbind 172.20.2.189:9999stats enablestats refresh 5sstats realm Status\ Page\ Input\ Passwd:stats uri /haproxy_statusstats auth haadmin1:stevenuxstats auth haadmin2:s3cr3tpass
HAProxy 日志配置和使用
HAProxy 可以配置将日志记录到指定的主机或者日志文件中,需要配合 Rsyslog
服务使用。
日志配置
root@ubuntu-suosuoli-node1:~# vim /etc/haproxy/haproxy.cfgglobal#log /dev/log local0#log /dev/log local1 noticelog 127.0.0.1 local6 info......
listen statsmode httplog globalbind 172.20.2.189:9999stats enablestats refresh 5sstats uri /haproxy_statusstats realm Status\ Page\ Input\ Passwd:stats auth haadmin1:stevenuxstats auth haadmin2:s3cr3tpassfrontend WEB_PORT_80bind 172.20.2.189:8080mode httpuse_backend web_prot_http_nodesbackend web_prot_http_nodesmode httplog globalbalance roundrobinoption forwardforcookie SRV-COOKIE insert indirect nocache maxidle 30m maxlife 8hserver node1 172.20.2.37:80 send-proxy cookie srv1-cookie weight 1 check inter 3000 fall 3 rise 5server node2 172.20.2.43:80 cookie srv2-cookie weight 1 check inter 3000 fall 3 rise 5server node3 172.20.2.44:80 cookie srv3-cookie weight 1 check inter 3000 fall 3 rise 5server node4 172.20.2.45:80 cookie srv4-cookie weight 1 check inter 3000 fall 3 rise 5root@ubuntu-suosuoli-node1:~# systemctl restart rsyslog.service
Rsyslog 配置
root@ubuntu-suosuoli-node1:~# vim /etc/rsyslog.conf
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
local6.* /var/log/haproxy.log
......
root@ubuntu-suosuoli-node1:~# systemctl restart rsyslog.service
验证日志
root@ubuntu-suosuoli-node1:~# tail -f /var/log/haproxy.log
2020-01-13T21:39:26+08:00 localhost haproxy[47072]: 172.20.1.1:57926 [13/Jan/2020:21:39:26.088] stats stats/<STATS> 0/0/0/0/1 200 24731 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy_status HTTP/1.1"
Jan 13 21:39:26 localhost haproxy[47072]: 172.20.1.1:57926 [13/Jan/2020:21:39:26.088] stats stats/<STATS> 0/0/0/0/1 200 24731 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy_status HTTP/1.1"
2020-01-13T21:39:26+08:00 localhost haproxy[47072]: 172.20.1.1:57926 [13/Jan/2020:21:39:26.243] stats stats/<STATS> 0/0/0/1/1 200 24731 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy_status HTTP/1.1"
Jan 13 21:39:26 localhost haproxy[47072]: 172.20.1.1:57926 [13/Jan/2020:21:39:26.243] stats stats/<STATS> 0/0/0/1/1 200 24731 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy_status HTTP/1.1"
2020-01-13T21:39:26+08:00 localhost haproxy[47072]: 172.20.1.1:57926 [13/Jan/2020:21:39:26.408] stats stats/<STATS> 0/0/0/0/2 200 24731 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy_status HTTP/1.1"
Jan 13 21:39:26 localhost haproxy[47072]: 172.20.1.1:57926 [13/Jan/2020:21:39:26.408] stats stats/<STATS> 0/0/0/0/2 200 24731 - - LR-- 1/1/0/0/0 0/0 "GET /haproxy_status HTTP/1.1"
...
自定义日志
HAProxy 允许用户自定义日志,以将特定信息记录在日志。
配置参数说明
capture cookie <name> len <length> # 捕获请求和响应报文中的 cookie并记录日志
capture request header <name> len <length> # 捕获请求报文中指定的首部内容和长度并记录日志
capture response header <name> len <length> # 捕获响应报文中指定的内容和长度首部并记录日志## 如如如如如如如
capture request header Host len 256
capture request header User-Agent len 512
capture request header Referer len 15
配置示例
root@ubuntu-suosuoli-node1:~# vim /etc/haproxy/haproxy.cfg
global#log /dev/log local0#log /dev/log local1 noticelog 127.0.0.1 local6 info.......
listen statsmode httplog globalbind 172.20.2.189:9999option httplogcookie SRV-COOKIE insert indirect nocache maxidle 30m maxlife 8hcapture request header X-Forwarded-For len 15capture request header User-Agent len 256stats enablestats refresh 5sstats uri /haproxy_statusstats realm Status\ Page\ Input\ Passwd:stats auth haadmin1:stevenuxstats auth haadmin2:s3cr3tpass
......
验证日志格式
root@ubuntu-suosuoli-node1:~# tail -f /var/log/haproxy.log
......
Jan 13 21:51:43 localhost haproxy[47212]: 172.20.1.1:58236 [13/Jan/2020:21:51:43.406] stats stats/<STATS> 0/0/0/0/2 200 25009 - - LRNN 2/1/0/0/0 0/0 {|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0} "GET /haproxy_status HTTP/1.1"
2020-01-13T21:51:44+08:00 localhost haproxy[47212]: 172.20.1.1:58236 [13/Jan/2020:21:51:44.781] stats stats/<STATS> 0/0/0/1/2 200 25012 - - LRNN 2/1/0/0/0 0/0 {|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0} "GET /haproxy_status HTTP/1.1"
Jan 13 21:51:44 localhost haproxy[47212]: 172.20.1.1:58236 [13/Jan/2020:21:51:44.781] stats stats/<STATS> 0/0/0/1/2 200 25012 - - LRNN 2/1/0/0/0 0/0 {|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0} "GET /haproxy_status HTTP/1.1"
2020-01-13T21:51:44+08:00 localhost haproxy[47212]: 172.20.1.1:58236 [13/Jan/2020:21:51:44.813] stats stats/<NOSRV> 0/-1/-1/-1/0 503 221 - - SCIN 2/1/0/0/0 0/0 {|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0} "GET /favicon.ico HTTP/1.1"
Jan 13 21:51:44 localhost haproxy[47212]: 172.20.1.1:58236 [13/Jan/2020:21:51:44.813] stats stats/<NOSRV> 0/-1/-1/-1/0 503 221 - - SCIN 2/1/0/0/0 0/0 {|Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0} "GET /favicon.ico HTTP/1.1"
......
HAProxy 的 ACL 使用
ACL 配置选项
ACL-name
ACL 名称,可以使用大字母 A-Z 小写字母 a-z 数字 0-9 冒号:点.中横线和下划线,
并且严格区分大小写,如 Image_site 和 image_site 完全是两个 acl。
ACL-criterion
hdr([<name> [,<occ>]]):完全匹配字符串,header 的指定信息
hdr_beg([<name> [,<occ>]]):前缀匹配,header 中指定匹配内容的 begin
hdr_end([<name> [,<occ>]]):后缀匹配,header 中指定匹配内容 end
hdr_dom([<name> [,<occ>]]):域匹配,header 中的 domain name
hdr_dir([<name> [,<occ>]]):路径匹配,header 的 uri 路径
hdr_len([<name> [,<occ>]]):长度匹配,header 的长度匹配
hdr_reg([<name> [,<occ>]]):正则表达式匹配,自定义表达式(regex)模糊匹配
hdr_sub([<name> [,<occ>]]):子串匹配,header 中的 uri 模糊匹配
dst #目标IP
dst_port #目标PORTsrc # 源IP
src_port # 源PORT
hdr(<string>) 用于测试请求头部首部指定内容
hdr_dom(host) 请求的host名称,如 www.magedu.com
hdr_beg(host) 请求的host开头,如 www. img. video. download. ftp.
hdr_end(host) 请求的host结尾,如 .com .net .cn
path_beg 请求的URL开头,如/static、/images、/img、/css
path_end 请求的URL中资源的结尾,如 .gif .png .css .js .jpg .jpeg
ACL-flags
ACL 匹配模式
-i
不区分大小写
-m
使用指定的 pattern 匹配方法
-n
不做 DNS 解析
-u
禁止 acl 重名,否则多个同名 ACL 匹配或关系
ACL-operator
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-value
- Boolean # 布尔类型的值
- integer or integer range # 整数或整数范围,比如用于匹配端口范围
- IP address / network # IP 地址或 IP 范围, 192.168.0.1 ,192.168.0.1/24
- string--> www.suosuoli.cnexact –精确比较substring—子串suffix-后缀比较prefix-前缀比较subdir-路径, /wp-includes/js/jquery/jquery.jsdomain-域名,www.suosuoli.cn
- regular expression # 正则表达式
- hex block # 16 进制
ACL 调用
调用 ACL 时可以使用基本的逻辑与,或,非等关系来匹配多个样本
- 与:隐式(默认)使用
- 或:使用"or" 或 "||"表示
- 否定:使用"!" 表示
# if后面的即为定义的ACL名称,可以是一个或多个
if valid_src valid_port # 与关系,A 和 B 都要满足为 true
if invalid_src || invalid_port # 或,A 或者 B 满足一个为 true
if ! invalid_src # 非,取反,A 和 B 哪个也不满足为 true
ACL 示例
域名匹配
frontend WEB_PORT_80bind 172.20.2.189:8080mode httpuse_backend web_prot_http_nodesacl acl1 hdr_dom(host) blog.suosuoli.cn # 定义ACLuse_backend suosuoli_host if acl1 # 如果ACL(acl1)匹配,(即样本hdr_dom(host) 和 # blog.suosuoli.cn匹配)则挑选suosuoli_host后端服务器处理请求default_backend default_hostbackend default_hostmode httpserver host1 172.20.2.44:80 check inter 2000 fall 3 rise 5backend suosuoli_host # suosuoli_host后端服务器组mode httpserver host1 172.20.2.45:80 check inter 2000 fall 3 rise 5
基于源 IP 或子网调度
frontend WEB_PORT_80bind 172.20.2.189:8080mode http# use_backend web_prot_http_nodes#acl acl1 hdr_dom(host) blog.suosuoli.cnacl ip_range_acl src 172.20.1.0/24 172.20.2.44 # 如果客户端源地址来自172.20.1.0/24网段或# 者172.20.2.44就将请求转发给suosuoli_host服务器组use_backend suosuoli_host if ip_range_acl# block if ip_range_acl # 拒绝该请求default_backend default_hostbackend default_hostmode httpserver host1 172.20.2.44:80 check inter 2000 fall 3 rise 5backend suosuoli_hostmode httpserver host1 172.20.2.45:80 check inter 2000 fall 3 rise 5
匹配浏览器类型
frontend WEB_PORT_80bind 172.20.2.189:8080mode http# use_backend web_prot_http_nodes#acl acl1 hdr_dom(host) blog.suosuoli.cn#acl ip_range_acl src 172.20.1.0/24 172.20.2.44# 匹配FireFox浏览器,将其请求调度给172.20.2.45acl user-agent-acl hdr(User-Agent) -m sub -i "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0"redirect prefix http://172.20.2.45 if user-agent-acl#use_backend suosuoli_host if ip_range_acldefault_backend default_hostbackend default_hostmode httpserver host1 172.20.2.44:80 check inter 2000 fall 3 rise 5backend suosuoli_hostmode httpserver host1 172.20.2.45:80 check inter 2000 fall 3 rise 5
基于文件后缀名实现动静分离
frontend WEB_PORT_80bind 172.20.2.189:8080mode httpacl php_handle path_end -i .phpuse_backend server_php if php_handleacl image_handle path_end -i .jpg .webp .jpeg .gif .pnguse_backend server_image if image_handle#use_backend suosuoli_host if ip_range_acldefault_backend default_hostbackend server_phpmode httpserver host1 172.20.2.44:80 check inter 2000 fall 3 rise 5backend server_imagemode httpserver host1 172.20.2.45:80 check inter 2000 fall 3 rise 5
匹配访问路径实现动静分离
frontend WEB_PORT_80bind 172.20.2.189:8080mode httpacl static_handle path_beg -i /static /images /javascriptuse_backend server_static if static_handle#acl image_handle path_end -i .jpg .webp .jpeg .gif .png#use_backend server_image if image_handledefault_backend default_hostbackend server_phpmode httpserver host1 172.20.2.44:80 check inter 2000 fall 3 rise 5backend server_staticmode httpserver host1 172.20.2.45:80 check inter 2000 fall 3 rise 5
基于 ACL 的 HTTP 访问控制
frontend WEB_PORT_80bind 172.20.2.189:8080mode httpacl php_handle path_end -i .phpuse_backend server_php if php_handleacl image_handle path_end -i .jpg .webp .jpeg .gif .pnguse_backend server_image if image_handle#use_backend suosuoli_host if ip_range_aclacl deny_vicious_guy src 172.20.1.1http-request deny if deny_vicious_guyhttp-request allowdefault_backend default_hostbackend server_phpmode httpserver host1 172.20.2.44:80 check inter 2000 fall 3 rise 5backend server_imagemode httpserver host1 172.20.2.45:80 check inter 2000 fall 3 rise 5
自定义 HAProxy 错误界面
基于错误页面文件实现
defaults
#option forwardfor
#no option http-use-htx
#...... #以下三行
errorfile 500 /usr/local/haproxy/html/500.html
errorfile 502 /usr/local/haproxy/html/502.html
errorfile 503 /usr/local/haproxy/html/503.html
基于 HTTP 重定向实现
defaults
#option http-keep-alive
#option forwardfor
#no option http-use-htx
#...... 以下一行
errorloc 503 http://192.168.7.102/error_page/503.html
HAProxy 四层负载
四层负载示例
listen redis-portbind 192.168.7.102:6379mode tcpbalance leastconnserver server1 192.168.7.104:6379 checkserver server1 192.168.7.103:6379 check backup
使用 ACL 进行四层访问控制
listen web_hostbind 192.168.7.101:80mode httpbalance roundrobinlog globaloption httplogacl static_path path_beg -i /static /images /javascriptuse_backend static_path_host if HTTP_1.1 TRUE static_pathacl invalid_src src 192.168.1.0/24 192.168.7.102tcp-request connection reject if invalid_srcdefault_backend default_webbackend php_server_hostmode httpserver web1 192.168.7.103 check inter 2000 fall 3 rise 5backend static_path_hostmode httpserver web1 192.168.7.104 check inter 2000 fall 3 rise 5backend default_webmode httpserver web1 192.168.7.102:80 check inter 2000 fall 3 rise 5
HAProxy 的压缩功能配置
对响应给客户端的报文进行压缩,以节省网络带宽,但是会占用部分 CPU 性能
配置项说明
compression algo # 启用http协议中的压缩机制,常用算法有gzip deflateidentity # 调试使用的压缩方式gzip # 常用的压缩方式,与各浏览器兼容较好deflate # 有些浏览器不支持raw-deflate # 新出的压缩方式
compression type # 要压缩的文件类型
配置示例
listen web_hostbind 192.168.7.101:80mode httpbalance roundrobinlog globaloption httplog#capture request header X-Forwarded-For len 15#capture request header User-Agent len 512compression algo gzip deflatecompression type compression type text/plain text/html text/css text/xml text/javascript application/javascriptcookie SERVER-COOKIE insert indirect nocacheserver web1 192.168.7.103:80 cookie web1 check inter 3000 fall 3 rise 5server web2 192.168.7.104:80 cookie web2 check inter 3000 fall 3 rise 5