目录
九、HAProxy+Keepalived 高可用负载均衡实验
一、 HAProxy 简介
HAProxy(High Availability Proxy)是一款开源的高性能 TCP/HTTP 负载均衡器和反向代理,广泛用于提升应用的可用性、性能和安全性。支持:
-
四层(TCP)和七层(HTTP)负载均衡。
-
会话保持、SSL 终止、健康检查、流量控制等功能。
-
高并发(C10k 问题优化)和低延迟。
二、 核心概念
1. 组件
-
Frontend(前端):定义监听的端口和协议,接收客户端请求。
-
Backend(后端):定义一组服务器(Server)及负载均衡【流量分发】策略。
-
Server:后端真实服务器(如 Web 服务器、数据库)。
-
访问控制列表ACL(Access Control List):根据请求属性(如 URL、Header、IP)定义条件,用于动态路由或安全控制。
2. 工作模式
-
TCP 模式(Layer 4):基于 IP 和端口转发。
-
HTTP 模式(Layer 7):解析 HTTP 头部,支持高级路由。
三、配置文件详解
HAProxy 的配置文件(路径:/etc/haproxy/haproxy.cfg)由两大部分组成,分别是global和proxies部分
- global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
- proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置
以下是一个简单的配置文件实例 :
#全局设置
global
log /dev/log local0
maxconn 50000 # 全局最大连接数
user haproxy # 运行用户
group haproxy
daemon # 后台模式
#默认设置
defaults
mode http # 默认模式(http/tcp)
log global
option httplog # 记录HTTP日志
timeout connect 5s # 连接后端超时
timeout client 30s # 客户端空闲超时
timeout server 30s # 后端服务器响应超时
#前端配置
frontend http-in
bind *:80
acl is_static path_beg -i /static/ # 定义ACL规则:路径以/static开头
use_backend static_servers if is_static
default_backend app_servers # 默认后端
#后端配置
backend app_servers
balance roundrobin # 负载均衡算法
server s1 192.168.1.10:8080 check maxconn 100
server s2 192.168.1.11:8080 check backup # 标记为备份服务器
backend static_servers
server static1 192.168.1.20:80 check
四、编译安装 HAProxy
1、解决lua 环境
[root@localhost ~]# tar xvf lua-5.3.5.tar.gz -C /usr/local/src
[root@localhost ~]# cd /usr/local/src/lua-5.3.5
[root@localhost lua-5.3.5]# ls
doc Makefile README src
[root@localhost lua-5.3.5]# make linux test
[root@localhost lua-5.3.5]# src/lua -v
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
2、编译安装HAProxy
[root@localhost ~]# yum -y install gcc openssl-devel pcre-devel systemd-devel
[root@localhost ~]# tar xf haproxy-3.0.8.tar.gz -C /usr/local/src
[root@localhost ~]# cd /usr/local/src/haproxy-3.0.8/
[root@localhost haproxy-3.0.8]# cat INSTALL #参考INSTALL文件进行编译安装
[root@localhost haproxy-3.0.8]# make TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src LUA_LIB=/usr/local/src/lua-5.3.5/src
[root@localhost haproxy-3.0.8]# make install PREFIX=/apps/haproxy #安装路径
[root@localhost haproxy-3.0.8]# ln -s /apps/haproxy/sbin/haproxy /usr/sbin/ #创建软链接
[root@localhost haproxy-3.0.8]# tree /apps/haproxy/ #查看生成的文件
/apps/haproxy/
├── doc
│ └── haproxy
│ ├── 51Degrees-device-detection.txt
│ ├── architecture.txt
│ ├── configuration.txt
│ ├── cookie-options.txt
│ ├── DeviceAtlas-device-detection.txt
│ ├── intro.txt
│ ├── linux-syn-cookies.txt
│ ├── lua.txt
│ ├── management.txt
│ ├── netscaler-client-ip-insertion-protocol.txt
│ ├── network-namespaces.txt
│ ├── peers.txt
│ ├── peers-v2.0.txt
│ ├── proxy-protocol.txt
│ ├── regression-testing.txt
│ ├── seamless_reload.txt
│ ├── SOCKS4.protocol.txt
│ ├── SPOE.txt
│ └── WURFL-device-detection.txt
├── sbin
│ └── haproxy
└── share
└── man
└── man1
└── haproxy.1
6 directories, 21 files
[root@localhost haproxy-3.0.8]# which haproxy
/usr/sbin/haproxy
[root@localhost haproxy-3.0.8]# haproxy -v
HAProxy version 3.0.8-6036c31 2025/01/29 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2029.
Known bugs: http://www.haproxy.org/bugs/bugs-3.0.8.html
Running on: Linux 4.18.0-553.el8_10.x86_64 #1 SMP Fri May 24 13:05:10 UTC 2024 x86_64
3、haproxy启动脚本
但是现在还缺少配置文件,无法启动haproxy
4、创建自定义的配置文件
[root@localhost haproxy-3.0.8]# mkdir /etc/haproxy
[root@localhost haproxy-3.0.8]# vim /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /apps/haproxy
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
#uid 99
#gid 99
user haproxy
group haproxy
daemon
#nbproc 4
#cpu-map 1 0
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local2 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:123456
5、启动haproxy
[root@localhost haproxy-3.0.8]# mkdir /var/lib/haproxy
[root@localhost haproxy-3.0.8]# chown -R 99.99 /var/lib/haproxy/
[root@localhost haproxy-3.0.8]# useradd -r -s /sbin/nologin -d /var/lib/haproxy haproxy
[root@localhost haproxy-3.0.8]# systemctl restart haproxy #还是启动失败,需要关掉SELINUX和防火墙
Job for haproxy.service failed because the control process exited with error code.
See "systemctl status haproxy.service" and "journalctl -xe" for details.
[root@localhost haproxy-3.0.8]# getenforce
Enforcing
[root@localhost haproxy-3.0.8]# setenforce 0
[root@localhost haproxy-3.0.8]# systemctl stop firewalld
[root@localhost haproxy-3.0.8]# systemctl restart haproxy
6、查看haproxy的状态页面
浏览器访问:http://192.168.8.161:9999/haproxy-status
五、启动本地和远程日志实验
在上面的基础上 下载rsyslog,然后进行配置
#开启远程主机日志
[root@localhost ~]# yum install rsyslog -y
[root@localhost ~]# vim /etc/rsyslog.conf
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
local2.* /var/log/haproxy.log
[root@localhost ~]# systemctl restart rsyslog
[root@localhost ~]# systemctl restart haproxy
[root@localhost ~]#
浏览器访问:http://192.168.8.161:9999/haproxy-status,观察本机和远程主机生成的日志
六、haproxy+Nginx 负载均衡实验
1.web1和web2的配置
下载Nginx并配置静态网页
2.haproxy服务器的配置
在haproxy的配置文件中加入以下配置:
还可以使用listen替换上面的frontend和backend的配置方式,可以简化设置,通常只用于TCP协议的应用
重启服务:systemctl restart haproxy
3.客户端测试
七、HAProxy 实现 MySQL 服务四层负载
注意:如果使用frontend和backend,一定在frontend和backedn段中都指定mode tcp
1.配置haproxy配置文件
#或者使用frontend和backend实现
frontend mysql
bind :3306
mode tcp #必须指定tcp模式
default_backend mysqlsrvs
backend mysqlsrvs
mode tcp #必须指定tcp模式
balance leastconn
server mysql1 192.168.8.156:3306
server mysql2 192.168.8.157:3306
2.在后端服务器上安装和配置mariadb服务
3.测试
八、HAProxy-ACL 案例
访问控制列表(ACL,Access Control Lists)是一种基于包过滤的访问控制技术,它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配),即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃。
ACL配置选项:
acl <aclname> <criterion> [flags] [operator] [<value>]
acl 名称 匹配规范 匹配模式 具体操作符 操作对象类型
定义ACL匹配规范,即:判断条件
hdr string,提取在一个HTTP请求报文的首部
hdr([<name> [,<occ>]]):完全匹配字符串,header的指定信息,<occ> 表示在多值中使用的值的出现次数
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模糊匹配
ACL匹配模式
-i 不区分大小写
-m 使用指定的pattern匹配方法
-n 不做DNS解析
-u 禁止acl重名,否则多个同名ACL匹配或关系
1.域名匹配
haproxy服务器配置子配置文件:
web端配置静态页面:
测试:
2.基于源ip或子网调度访问
测试:
3.基于源地址的访问控制
拒绝指定IP或者IP范围访问
测试:
4.匹配浏览器类型
匹配客户端浏览器,将不同类型的浏览器调动至不同的服务器组
测试:
5.基于文件后缀名实现动静分离
测试:
九、HAProxy+Keepalived 高可用负载均衡实验
1、实验拓扑
2、实验步骤
2.1、主备服务器安装Keepalived、haproxy
2.2、配置Keepalived
主服务器:
备服务器 :
[root@master ~]# scp /etc/keepalived/keepalived.conf 192.168.8.162:/etc/keepalived/
启动Keepalived:
2.3、配置haproxy
主服务器:
备服务器:无需改动,只需要远程传送即可
启动haproxy:
2.4、web端配置
web1和web2配置静态页面
3、测试
验证VIP绑定:
主服务器关掉haproxy或Keepalived:
观察备服务器是否接管VIP: