当前位置: 首页 > news >正文

Haproxy搭建web集群

Haproxy搭建web集群

一、HAProxy 是什么?核心作用有哪些?

HAProxy(High Availability Proxy)是一款开源的高性能负载均衡与反向代理软件,主要用于处理高并发场景下的流量分发,其核心作用包括:

  1. 负载均衡
    将客户端请求均匀分配到多个后端服务器,避免单节点过载,提升系统整体吞吐量。支持多种负载均衡算法(如轮询、最少连接、源 IP 哈希等)。
  2. 反向代理
    作为客户端与后端服务器的中间层,隐藏服务器真实 IP,同时可对请求进行过滤、缓存、改写等处理(如修改 HTTP 头、响应压缩)。
  3. 高可用性保障
    通过健康检查机制实时监控后端服务器状态,自动剔除故障节点,待节点恢复后重新加入集群,确保服务可用性。
  4. 流量处理与优化
    支持 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. 与其他代理工具的对比优势
对比维度HAProxyNginxLVS
层级支持四层 + 七层七层为主(四层需额外模块)仅四层
性能高并发场景下表现优异七层处理性能较好,四层较弱四层性能最强,七层不支持
功能复杂度配置简洁,功能全面七层功能丰富,配置较复杂仅支持基本四层负载均衡
适用场景混合协议、高可用、高并发场景静态资源缓存、HTTP 反向代理纯四层流量转发(如 L4 负载均衡)

四、典型应用场景

  • Web 服务集群:为 HTTP/HTTPS 服务分配流量,支持会话保持(如基于 Cookie 的会话绑定)。
  • 数据库与中间件集群:为 MySQL、Redis、Kafka 等 TCP 服务提供负载均衡,提升集群可用性。
  • 微服务网关:作为入口层代理,处理服务发现、请求路由与流量控制。
  • 高可用场景:配合 Keepalived 实现 HAProxy 自身的主备切换,避免单点故障。

五,示例

搭建环境

描述主机
haproxy192.168.10.101
web1192.168.10.102
web2192.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配置说明:
  1. 全局配置:

    • log:将日志发送到本地 rsyslog,方便集中管理
    • chroot:增强安全性,限制进程访问范围
    • maxconn:控制资源使用,防止过载
  2. 默认参数:

    • mode http:启用七层代理,可处理 HTTP 特定功能
    • 多个 timeout 参数:优化不同阶段的连接超时策略
    • option httplog:提供更详细的 HTTP 请求日志
  3. 负载均衡服务:

    • 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"

相关文章:

  • 使用 Prometheus 访问 TDengine ---
  • 计算机导论期末快速复习指南
  • 第一章 SQL编程系列-数据库介绍与安装
  • Unity UI 核心类解析之Graphic
  • crawl4ai 框架的入门讲解和实战指南——基于Python的智能爬虫框架,集成AI(如NLP/OCR)实现自动化数据采集与处理
  • DDS 问题排查
  • 基于自然语言处理的智能问答系统(模型训练+部署测试)
  • 【图片识别改名】批量识别图片中的文字对图片进行改名,识别文字对图片重新命名的操作步骤和注意事项
  • python学智能算法(十四)|机器学习朴素贝叶斯方法进阶-CountVectorizer文本处理简单测试
  • CD45.【C++ Dev】STL库的list的使用
  • 前端基础知识CSS系列 - 14(CSS提高性能的方法)
  • windows,java后端开发常用软件的下载,使用配置
  • Spring MVC参数绑定终极手册:单多参对象集合JSON文件上传精讲
  • Python 开发环境全栈隔离架构:从 Anaconda 到 PyCharm 的四级防护体系
  • mcp-server-chart Quickstart
  • Android中Native向System Service进行Binder通信的示例
  • Tensorflow推理时遇见PTX错误,安装CUDA及CuDNN, 解决问题!
  • C++实现手写strlen函数
  • 什么是池化
  • 图像特征检测算法ORB
  • 莱芜二中网站/十大小说网站排名
  • 建设网站都要学些什么问题/制作网站代码
  • 舞蹈培训机构网站模板/无锡百度推广代理商
  • 做二手房的网站技巧/怎样做好网络营销推广
  • 兰州网站设计/宁波优化关键词首页排名
  • WordPress一键采集插件/合肥seo快排扣费