您的位置:首页 > 教育 > 培训 > 一篇文章带你了解HAProxy。理论远远比不上实践!!!!!!

一篇文章带你了解HAProxy。理论远远比不上实践!!!!!!

2024/12/22 0:17:16 来源:https://blog.csdn.net/HUHUD521/article/details/141111427  浏览:    关键词:一篇文章带你了解HAProxy。理论远远比不上实践!!!!!!

What  is  HAProxy

HAProxy是一个使用C语言编写的自由及开放源代码软件,它提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理功能。HAProxy由法国开发者威利塔罗(Willy Tarreau)在2000年开发,特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。以下是HAProxy的详细介绍:

一、主要特点

  1. 高性能:HAProxy运行在当前的硬件上,支持高达数百万级别的并发连接,并且具有极低的延迟。
  2. 高可靠性:HAProxy的实现基于事件驱动、单一进程模型,这种模型支持非常大的并发连接数,同时保持高度的可靠性和稳定性。
  3. 高灵活性:HAProxy支持基于cookie的持久性、自动故障切换、正则表达式及web状态统计等功能,使得它可以灵活地应对各种复杂的负载均衡需求。
  4. 安全性:HAProxy的运行模式使得它可以很简单安全地整合进用户当前的架构中,同时可以保护用户的web服务器不被暴露到网络上。

二、支持功能

  1. TCP和HTTP反向代理:HAProxy可以作为TCP和HTTP的反向代理,将客户端的请求转发到后端服务器。
  2. SSL/TLS支持:HAProxy支持SSL/TLS加密,可以保护客户端与服务器之间的通信安全。
  3. 负载均衡算法:HAProxy支持多达8种负载均衡算法,如轮询(roundrobin)、最少连接(leastconn)等,可以根据实际需求选择合适的算法。
  4. 会话保持:HAProxy支持基于cookie、用户IP等多种方式的会话保持,确保来自同一客户端的请求被转发到同一台后端服务器上。
  5. 健康检查: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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com