Haproxy搭建web集群
Haproxy搭建web集群
一、HAProxy 是什么?核心作用有哪些?
HAProxy(High Availability Proxy)是一款开源的高性能负载均衡与反向代理软件,主要用于处理高并发场景下的流量分发,其核心作用包括:
- 负载均衡
将客户端请求均匀分配到多个后端服务器,避免单节点过载,提升系统整体吞吐量。支持多种负载均衡算法(如轮询、最少连接、源 IP 哈希等)。 - 反向代理
作为客户端与后端服务器的中间层,隐藏服务器真实 IP,同时可对请求进行过滤、缓存、改写等处理(如修改 HTTP 头、响应压缩)。 - 高可用性保障
通过健康检查机制实时监控后端服务器状态,自动剔除故障节点,待节点恢复后重新加入集群,确保服务可用性。 - 流量处理与优化
支持 TCP、HTTP、HTTPS、WebSocket 等协议的流量转发,可处理 SSL 卸载、会话保持、请求限流等高级功能。
二、HAProxy 工作在网络模型的哪一层?
HAProxy 是四层(传输层)和七层(应用层)兼顾的代理软件,具体分层能力如下:
层级 | 协议支持 | 典型功能 |
---|---|---|
四层(TCP) | TCP、UDP | 基于 IP 和端口进行流量转发,适用于数据库、Redis、MQ 等 TCP 服务的负载均衡。 |
七层(HTTP/HTTPS) | HTTP、HTTPS、WebSocket | 基于 HTTP 请求内容(如 URL、Header、Cookie)进行转发,支持 URL 重写、请求过滤等。 |
三、HAProxy 的核心优势:为什么选择它?
HAProxy 相比其他代理工具(如 Nginx、LVS)的优势可从以下维度解析:
1. 高性能与高并发处理能力
- 事件驱动架构:单进程多线程模型,无需为每个连接创建独立进程,资源消耗低,单机可处理数万并发连接。
- 低延迟特性:四层转发时延迟极低(约 1-2ms),七层 HTTP 处理时性能优于多数应用层代理。
- 硬件资源优化:支持 CPU 亲和性、零拷贝技术,减少内核态与用户态数据拷贝开销。
2. 四层与七层功能的灵活性
- 全层级支持:同时具备四层负载均衡(如 TCP 转发)和七层 HTTP/HTTPS 处理能力,无需额外组件即可处理混合协议场景。
- 协议扩展性:通过 Lua 脚本可自定义七层请求处理逻辑(如动态路由、请求认证)。
3. 高可用性与健康检查机制
- 多维度健康检查:支持 HTTP、TCP、ICMP 等协议的健康检查,可自定义检查频率、失败阈值(如配置
check inter 2000 fall 3
表示每 2 秒检查一次,3 次失败则标记为故障)。 - 自动故障转移:实时剔除故障节点,支持权重动态调整(如根据服务器负载动态分配流量)。
4. 配置简洁与功能完整性
- 统一配置文件:通过简单的配置语法即可实现复杂功能(如负载均衡、SSL 卸载、会话保持),无需像 Nginx 一样拆分多个配置文件。
- 丰富的统计接口:内置 HTTP 监控页面,可实时查看后端节点负载、请求量、错误率等指标。
5. 与其他代理工具的对比优势
对比维度 | HAProxy | Nginx | LVS |
---|---|---|---|
层级支持 | 四层 + 七层 | 七层为主(四层需额外模块) | 仅四层 |
性能 | 高并发场景下表现优异 | 七层处理性能较好,四层较弱 | 四层性能最强,七层不支持 |
功能复杂度 | 配置简洁,功能全面 | 七层功能丰富,配置较复杂 | 仅支持基本四层负载均衡 |
适用场景 | 混合协议、高可用、高并发场景 | 静态资源缓存、HTTP 反向代理 | 纯四层流量转发(如 L4 负载均衡) |
四、典型应用场景
- Web 服务集群:为 HTTP/HTTPS 服务分配流量,支持会话保持(如基于 Cookie 的会话绑定)。
- 数据库与中间件集群:为 MySQL、Redis、Kafka 等 TCP 服务提供负载均衡,提升集群可用性。
- 微服务网关:作为入口层代理,处理服务发现、请求路由与流量控制。
- 高可用场景:配合 Keepalived 实现 HAProxy 自身的主备切换,避免单点故障。
五,示例
搭建环境
描述 | 主机 |
---|---|
haproxy | 192.168.10.101 |
web1 | 192.168.10.102 |
web2 | 192.168.10.103 |
客户端 | 192.168.10.104 |
配置两台web
!!!操作都是一样的但是网站内容要不一样
# 在web1和web2服务器上执行以下操作
[root@web1 ~]# dnf -y install httpd # 使用dnf包管理器自动(-y)安装Apache HTTP服务器
[root@web1 ~]# echo "web1">/var/www/html/index.html # 创建网站首页,内容为"web1" !!!web2服务器上 echo 网站内容web2
[root@web1 ~]# systemctl start httpd # 启动HTTP服务
[root@web1 ~]# systemctl enable httpd # 设置HTTP服务开机自启(原命令缺失此步骤)
[root@web1 ~]# curl 127.0.0.1 # 本地测试访问,验证服务是否正常响应
web1 # 预期输出,表示访问成功
配置haproxy
# 在HAProxy服务器上执行以下操作
[root@haproxy ~]# dnf -y install haproxy # 使用dnf包管理器自动(-y)安装HAProxy负载均衡软件
[root@haproxy ~]# cd /etc/haproxy/ # 切换到HAProxy配置目录
[root@haproxy haproxy]# ls # 查看目录内容
conf.d haproxy.cfg # 显示配置目录下的文件和子目录
[root@haproxy haproxy]# vim haproxy.cfg # 使用vim编辑器修改主配置文件(按i进入编辑模式,编辑后按Esc输入:wq保存退出)
1.1haproxy关键说明
1.2 配置文件位置:/etc/haproxy/haproxy.cfg
是 HAProxy 的主配置文件路径
1.3 配置目录结构
haproxy.cfg
:主配置文件conf.d/
:可存放子配置文件的目录 (通过include
指令引用)
1.4 编辑建议
- 生产环境建议先备份:
cp haproxy.cfg haproxy.cfg.bak
- 修改后需验证配置:
haproxy -c -f /etc/haproxy/haproxy.cfg
- 重载配置生效:
systemctl reload haproxy
2.1 vim编辑 haproxy内容说明
# --------------------
# 全局配置段 - 影响整个 HAProxy 进程
# --------------------
globallog 127.0.0.1 local2 # 将日志发送到本地 rsyslog 的 local2 设施 !!!此设置跟下文配置日志有关chroot /var/lib/haproxy # 限制 HAProxy 进程的文件系统访问权限pidfile /var/run/haproxy.pid # 进程 ID 文件位置user haproxy # 运行 HAProxy 的用户group haproxy # 运行 HAProxy 的用户组daemon # 以守护进程模式运行maxconn 4000 # 全局最大连接数限制# --------------------
# 默认配置段 - 为后续部分提供默认参数
# --------------------
defaultsmode http # 默认工作在 HTTP 模式(七层代理)log global # 使用 global 段定义的日志配置option httplog # 启用 HTTP 日志格式option dontlognull # 不记录空请求retries 3 # 后端服务器连接失败时的重试次数timeout http-request 5s # HTTP 请求超时时间timeout queue 1m # 请求在队列中的最大等待时间timeout connect 5s # 连接到后端服务器的超时时间timeout client 1m # 客户端连接超时时间timeout server 1m # 服务器连接超时时间timeout http-keep-alive 5s # HTTP 长连接超时时间timeout check 5s # 健康检查的超时时间maxconn 3000 # 每个前端/后端的最大连接数限制# --------------------
# 监听配置段 - 定义负载均衡的服务
# --------------------
listen mywebbind *:80 # 绑定到所有接口的 80 端口option httpchk GET /index.html # 使用 HTTP GET /index.html 进行健康检查balance roundrobin # 负载均衡算法:轮询server web1 192.168.10.102:80 check inter 2000 fall 3 # 后端服务器1,每2秒检查一次,3次失败标记为不可用server web2 192.168.10.103:80 check inter 2000 fall 3 # 后端服务器2,配置同上
2.2配置说明:
-
全局配置:
log
:将日志发送到本地 rsyslog,方便集中管理chroot
:增强安全性,限制进程访问范围maxconn
:控制资源使用,防止过载
-
默认参数:
mode http
:启用七层代理,可处理 HTTP 特定功能- 多个
timeout
参数:优化不同阶段的连接超时策略 option httplog
:提供更详细的 HTTP 请求日志
-
负载均衡服务:
-
bind *:80
:创建 HTTP 服务监听 -
balance roundrobin
:简单的轮询算法,平均分配请求 -
server
配置:定义后端 Web 服务器,包含健康检查设置
check
:启用健康检查inter 2000
:检查间隔为 2000 毫秒(2 秒)fall 3
:连续 3 次检查失败则认为服务器不可用
-
编辑完成
[root@haproxy haproxy]# haproxy -c -f /etc/haproxy/haproxy.cfg # 检查配置文件语法
[root@haproxy haproxy]# systemctl enable haproxy # 设置HAProxy开机自启
[root@haproxy haproxy]# systemctl restart haproxy # 重启HAProxy服务
[root@haproxy haproxy]# systemctl status haproxy # 查看服务运行状态
客户端验证
客户端访问haproxy:192.168.10.101
[root@localhost ~]# curl 192.168.10.101
web2
[root@localhost ~]# curl 192.168.10.101
web1
配置日志文件
为什么 HAProxy 需要搭配 rsyslog?
HAProxy 本身通过syslog
协议发送日志,但不直接写入文件,需借助 rsyslog(或其他 syslog 服务)接收并存储。
- HAProxy 配置中指定日志发送目标(如本地 rsyslog),而 rsyslog 负责将日志写入具体文件。
rsyslog(或其他 syslog 服务)接收并存储。
什么是rsyslog?
rsyslog 是 Linux 系统中常用的日志处理服务,是 syslog 的增强版,主要用于收集、存储、过滤和转发系统及应用程序的日志信息
[root@haproxy ~]# vim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp # 加载 UDP 日志接收模块(imudp = Input UDP)
$UDPServerRun 514 # 启动 UDP 514 端口监听(标准 syslog 端口)local2.* /var/log/haproxy.log # 将 local2 设施的所有级别日志写入 haproxy.log
&~ # 停止后续处理(避免日志重复记录)
~ [root@haproxy ~]# systemctl restart rsyslog ###重启服务
####注意直接访问是没有生成这个文件的我们得需要访问才会生成这个文件
root@haproxy ~]# cat /var/log/haproxy.log
Apr 7 15:53:39 localhost haproxy[9186]: 192.168.10.104:44204 [07/Apr/2025:15:53:39.498] myweb myweb/web1 0/0/0/1/1 200 230 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Apr 7 15:53:39 localhost haproxy[9186]: 192.168.10.104:44208 [07/Apr/2025:15:53:39.884] myweb myweb/web2 0/0/0/1/1 200 230 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Apr 7 15:53:40 localhost haproxy[9186]: 192.168.10.104:44212 [07/Apr/2025:15:53:40.157] myweb myweb/web1 0/0/0/1/1 200 230 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Apr 7 15:53:40 localhost haproxy[9186]: 192.168.10.104:44226 [07/Apr/2025:15:53:40.431] myweb myweb/web2 0/0/1/1/2 200 230 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
Apr 7 15:53:40 localhost haproxy[9186]: 192.168.10.104:44228 [07/Apr/2025:15:53:40.695] myweb myweb/web1 0/0/0/1/1 200 230 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"