Haproxy 的 ACL 规则及实战案例

文章目录

  • 一、ACL 规则
    • 1.概述
    • 2.主要功能
    • 3.语法
  • 二、Haproxy 实现智能负载均衡
    • 1.实验环境
    • 2.配置 Apache 服务器
    • 3.基于地址的访问控制
    • 4.基于访问文件的控制与重定向
    • 5.实现动静分离功能的智能负载均衡


一、ACL 规则

1.概述

  • 比起使用 LVS 做负载均衡,Haproxy 能提供更加强大的功能
  • 因为 Haproxy 支持 ACL 规则,用于定义三层到七层的规则来匹配一些特殊的请求,实现基于请求报文首部、相应报文内容或者是一些其他状态信息,从而根据需要进行不同的策略转发响应

2.主要功能

可以根据 ACL 规则 完成以下两种主要功能:

  1. 通过设置 ACL 规则来检查客户端请求是否符合规则,将不符合规则要求的请求直接终端
  2. 符合 ACL 规则请求由 backend 指定的后端服务器池执行基于 ACL 规则的负载均衡,不符合的可以直接中断响应,也可以交由其他服务器池执行

3.语法

  • Haproxy 中的 ACL 规则设置在 frontend 部分,语法:
acl 名称 方法 -i [匹配的路径或文件]
  • 说明如下:
    • acl:定义 ACL 规则的关键字,后面需自定义的 ACL 名称,名称区分大小写,也可以重名,这样就可以把多个测试条件设定为一个共同的 ACL
    • 方法:是用来设定实现 ACL 的方法
  • Haproxy 定义的 ACL 常用方法如下:
常用方法 解释
hdr_beg(host) 检测请求报文首部开头部分是否匹配指定的模式
hdr_end(host) 检测请求报文首部结尾部分是否匹配指定的模式
hdr_reg(host) 正则匹配
url_sub 表示请求 url 中包含什么字符串
url_dir 表示请求 url 中存在哪些字符串作为部分地址路径
path_beg 检测请求的 URL 是否匹配路径开头
path_end 检测请求的 URL 是否匹配路径结尾
dst 目标地址
dst_port 目标端口
src 源地址
src_prot 源端口
  • -i:表示忽略大小写,后面需跟上匹配的路径或者文件或者正则表达式,与 ACL 规则一起使用的 Haproxy 选项有 use_backend 和 default_backend,其中use_backend 后面需要设置一个 backend 实例名称,表示在满足 ACL 规则后接收用户请求的后端 backend 服务器池是哪个;此时 default_backend 表示没有满足 ACL 条件的请求默认使用哪个后端 backend 服务器池

二、Haproxy 实现智能负载均衡

  • Haproxy 可以工作在七层模型下,因此可以通过设定 ACL 规则实现 Haproxy 的智能负载均衡
  • 本实例使用了一台 Haproxy 服务器,三台 Web 服务器,模拟搭建了一套 Web 群集,来进行 ACL 规则的设置

1.实验环境

主机名 角色 操作系统 IP 地址 主要软件
CentOS 7-1 Haproxy 服务器 CentOS 7 192.168.126.11 haproxy-1.59.tar.gz
CentOS 7-2 Nginx 服务器 1 CentOS 7 192.168.126.12 nginx-1.12.2.tar
CentOS 7-3 Nginx 服务器 2 CentOS 7 192.168.126.13 nginx-1.12.2.tar
CentOS 7-4 Apache 服务器 CentOS 7 192.168.126.14 httpd-2.4.6-67.el7.centos.x86_64 以及 php-5.4.16-42.el7.x86_64
Win10 客户端 192.168.126.10 Windows 10 Edge 浏览器

2.配置 Apache 服务器

  • Haproxy 与 Nginx 的安装与配置不再复述,以下只给出安装 Apache 服务器环境的代码,设置测试页面以待后续测试
  • 有必要可以去看我之前的博客,本实验是跟着之前的配置继续做的,只用再添加一个 Apache 服务器即可,传送门如下:
    • 使用 Haproxy 搭建 Web 群集(搭建步骤、日志以及参数优化)
    • Haproxy 解决群集 session 共享问题以及配置 Web 监控平台
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#关闭防火墙及安全策略

yum -y install httpd php
#安装必要软件包

vim /etc/httpd/conf/httpd.conf
#第95行,去掉注释,修改参数
ServerName www.xcf.com:80


vim /var/www/html/test.php
#添加以下测试网页内容
<?php
phpinfo();
?>


systemctl start httpd.service
systemctl enable httpd.service
#开启服务及开机自启动

echo "192.168.126.14 www.xcf.com" >> /etc/hosts
#配置域名映射
  • 配置好了 Apache 服务器,我们去 客户端 Win10 进行测试
  • 因为没有 DNS ,所以需要在 windows 主机中的 hosts 文件中添加解析记录,之后访问 http://www.xcf.com/test.php 进行测试
    Haproxy 的 ACL 规则及实战案例_第1张图片
    Haproxy 的 ACL 规则及实战案例_第2张图片

3.基于地址的访问控制

  • 如果定义来源地址为 192.168.126.10(客户端)的主机访问 Web 群集则拒绝,可以添加 ACL 规则定义来源主机,使用 block 选项后面添加 if 进行判断
  • 以下放出配置文件完整代码
---Haproxy 服务器---

vim /etc/haproxy/haproxy.cfg

# this config needs haproxy-1.1.28 or haproxy-1.2.1

global
        log /dev/log    local0 info
        log /dev/log    local1 notice
        #log loghost    local0 info
        maxconn 4096
        #chroot /usr/share/haproxy
        uid 99
        gid 99
        daemon
        debug
        #quiet

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        redispatch
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000

frontend main
        bind *:80
        acl forbid src 192.168.126.10
        block if forbid
        default_backend webcluster

#listen  webcluster 0.0.0.0:80
        #option httpchk GET /test.html
        #balance roundrobin
        #server inst1 192.168.126.12:80 check inter 2000 fall 3
        #server inst2 192.168.126.13:80 check inter 2000 fall 3

listen stats
        bind 0.0.0.0:8080
        stats refresh 30s
        stats uri /stats
        stats realm Haproxy Manager
        stats auth admin:admin
        stats hide-version
        stats admin if TRUE

backend webcluster
        option httpchk GET /test.html
        cookie SESSION_COOKIE insert indirect nocache
        server inst1 192.168.126.12:80 check inter 2000 fall 3
        server inst2 192.168.126.13:80 check inter 2000 fall 3
        

systemctl restart haproxy.service
#重启服务生效

Haproxy 的 ACL 规则及实战案例_第3张图片

  • 现在测试一下用客户端来访问 Web 群集 http://192.168.126.11/test.html
    Haproxy 的 ACL 规则及实战案例_第4张图片
  • 用 Apache 服务器 再来访问 Web 群集测试一下
    Haproxy 的 ACL 规则及实战案例_第5张图片

4.基于访问文件的控制与重定向

  • 修改 Harpoxy 配置文件的 frontend 部分,重新定义 ACL 规则
vim /etc/haproxy/haproxy.cfg

frontend main
        bind *:80
        acl forbid src 192.168.126.10
        block if forbid
        default_backend webcluster
#复制模板,添加以下部分
frontend main
        bind *:80
        acl denyfile path_end .html
        http-request deny if denyfile
        errorloc 403 http://www.xcf.com
        default_backend webcluster


systemctl restart haproxy.service
  • 通过以上配置,检测如果请求的 url 请求的页面是以 .html 结尾则决绝此次请求,检测到错误代码 403 则会直接跳转到 http://www.xcf.com
  • 再次打开客户端浏览器访问 Web 群集网页进行测试
    Haproxy 的 ACL 规则及实战案例_第6张图片
  • 之前有过设置,这里算是"双重"拒绝访问了,而且是 403 ,这里我们再刷新试试,可以看到成功跳转了
    Haproxy 的 ACL 规则及实战案例_第7张图片

5.实现动静分离功能的智能负载均衡

  • 修改 Haproxy 配置文件的 frontend 的 backend 部分,重新定义 ACL 规则,以及添加后端真实服务器
vim /etc/haproxy/haproxy.cfg

frontend main
        bind *:80
        acl usr_static path_beg -i /static /images /img /css
        acl usr_static path_end -i .html .jpg .png .jpeg .gif .swf .css .xml .txt .pdf
        use_backend webcluster if usr_static
        default_backend app

backend webcluster
        option httpchk GET /test.html
        balance roundrobin
        server inst1 192.168.126.12:80 check inter 2000 fall 3
        server inst2 192.168.126.13:80 check inter 2000 fall 3

backend app
        option httpchk GET /test.php
        server inst3 192.168.126.14:80 check inter 2000 fall 3
        
systemctl restart haproxy.service
  • 定义 ACL 名称为 usr_static,如果访问的是匹配以后缀 .html、 .jpeg、 .xml 等结尾的静态文件,那么会直接跳转至 webcluster 这个 backend
  • 如果访问不匹配定义的这些静态文件,那么会直接跳转至默认 backend app 响应,这里也可以设置多台真实服务器组成一个服务器群集
  • 在 win10 客户端分别访问 test.html 与 test.php 页面进行测试
    Haproxy 的 ACL 规则及实战案例_第8张图片
    Haproxy 的 ACL 规则及实战案例_第9张图片

你可能感兴趣的:(Web,服务器群集,haproxy,acl,实现动静分离功能的智能负载均衡,基于访问文件的控制与重定向,基于地址的访问控制)