HAProxy 使用指南:从基础到实战部署

HAProxy 使用指南:从基础到实战部署

一、HAProxy简介

HAProxy(High Availability Proxy)是一款基于C语言开发的开源高性能代理软件,核心定位是"高可用"与"负载均衡",同时支持TCP(四层)和HTTP/HTTPS(七层)协议的应用代理,是企业级架构中常用的流量调度组件,能有效解决单服务器性能瓶颈、保障业务连续性。

1.1 核心功能与价值

  • 高可用性保障:通过实时健康检查自动剔除故障后端节点(如服务器宕机、服务无响应);支持与 Keepalived 配合实现 "双机热备",避免 HAProxy 自身单点故障。

  • 灵活负载均衡

    :将客户端请求均匀分发到多台后端服务器,提供多种调度算法:

    • 轮询(默认,适合后端性能一致场景);
    • 加权轮询(按节点性能分配权重,性能强节点承担更多请求);
    • IP 哈希(同一客户端 IP 固定转发到同一节点,实现会话保持);
    • 最少连接数(请求优先分发到连接数最少的节点,适合后端性能不均场景)。
  • 多协议代理能力

    • 四层代理(TCP):基于 "IP + 端口" 转发,不解析应用层数据,适用于 MySQL、Redis、SSH 等非 HTTP 服务,转发效率高;
    • 七层代理(HTTP/HTTPS):解析 URL、主机名、请求头、Cookie 等应用层信息,支持 SSL 终止(HTTPS 卸载)、请求重写、会话保持等高级功能。
  • 安全防护作用:作为 "流量入口" 隔离后端服务器,避免后端节点直接暴露公网;支持 ACL(访问控制列表)限制非法 IP 访问,抵御简单 DDoS 攻击(如限制单 IP 请求频率)。

1.2 核心优势(为何选择 HAProxy)

  • 高性能与高并发:采用 "事件驱动、单一进程模型",避免多进程 / 多线程的内存开销、锁竞争问题,单进程可支持数万并发连接,CPU / 内存使用率极低。
  • 灵活扩展性:支持 Lua 脚本扩展(动态路由、对接服务发现)、自定义健康检查(基于 HTTP 状态码、数据库查询结果),适配复杂业务场景。
  • 广泛兼容性:运行于 Linux、FreeBSD 等类 Unix 系统,兼容主流 Web 服务器(Nginx、Apache、Tomcat)、数据库(MySQL、PostgreSQL)及中间件(Redis、RabbitMQ),无需修改现有架构即可快速集成。

1.3 适用场景

  • 高负载 Web 站点 :处理数万级并发(如电商大促、直播平台),需会话保持(用户登录状态)或七层路由(如/api转发到 API 服务器、/static转发到静态资源服务器);
  • 微服务架构:作为 API 网关前置负载均衡,按请求头、路径分发流量到不同微服务节点;
  • 数据库 / 中间件代理:通过四层代理实现 MySQL 主从负载均衡(读请求分发到从库)、Redis 集群入口调度。

1.4 行业认可度

HAProxy 因稳定性和高性能,被全球知名平台采用:

  • 代码托管:GitHub、Bitbucket;
  • 社交 / 内容平台:Stack Overflow、Reddit、Tumblr、Twitter;
  • 云计算厂商:亚马逊 AWS、阿里云、腾讯云(部分负载均衡产品基于 HAProxy 二次开发)。

二、负载均衡技术分层(按 OSI 模型)

负载均衡的核心是 "将流量分发到多台服务器",按工作的网络层级(对应 OSI 模型)可分为二层、三层、四层、七层,整体规律为:层级越低,转发效率越高;层级越高,功能越灵活

2.1 二层负载均衡(数据链路层)

  • 工作原理:基于 "虚拟 MAC 地址(VIP-MAC)" 转发 ------ 负载均衡器对外暴露虚拟 MAC,客户端请求该 MAC 后,负载均衡器仅替换数据包的 "目标 MAC" 为后端真实服务器 MAC,后端处理后直接响应客户端(无需经过负载均衡器)。
  • 关键特点:转发效率极高(仅处理数据链路层帧),但仅支持局域网内转发(MAC 地址不可跨网段),不感知 IP 和端口。
  • 适用场景:局域网内低延迟、高吞吐业务(如数据库集群)。
  • 典型产品:F5 BIG-IP(二层模式)、华为云 ELB(二层模式)。

2.2 三层负载均衡(网络层)

  • 工作原理:基于 "虚拟 IP 地址(VIP)" 转发 ------ 负载均衡器对外暴露 VIP,客户端请求该 IP 后,负载均衡器替换数据包的 "目标 IP" 为后端真实 IP,后端处理后将响应返回给负载均衡器,再由负载均衡器替换 "源 IP" 为 VIP 后响应客户端。
  • 关键特点:支持跨网段转发(IP 可路由),转发效率较高,但不感知端口和应用层数据,无法按端口区分服务。
  • 适用场景:跨网段、对延迟敏感的非 HTTP 服务(如跨机房数据库备份集群)。
  • 典型产品:LVS-DR 模式(Linux Virtual Server)、华为云 ELB(三层模式)。

2.3 四层负载均衡(传输层)

  • 工作原理:基于 "IP + 端口(VIP:Port)" 转发 ------ 负载均衡器对外暴露 "VIP + 端口"(如 192.168.1.100:80),客户端请求后,负载均衡器按 "IP + 端口" 判断服务类型,替换 "目标 IP + 端口" 为后端真实地址,转发请求。
  • 关键特点:支持 TCP/UDP 协议(覆盖绝大多数服务),转发效率接近三层,可按端口区分服务;但不感知应用层数据,无法实现精细化路由。
  • 适用场景:需区分端口的 TCP/UDP 服务(如 MySQL 3306 端口、Redis 6379 端口、游戏 UDP 服务)。
  • 典型产品:LVS-NAT 模式、F5 BIG-IP、HAProxy(四层模式)、Nginx(四层模式)。

2.4 七层负载均衡(应用层)

  • 工作原理:基于 "应用层协议信息" 转发 ------ 负载均衡器解析 HTTP、HTTPS 等协议的内容(如 URL、主机名、请求头),按预设规则(如 URL=/api 转发到 API 服务器)将请求分发到后端节点。
  • 关键特点:功能极灵活(支持 SSL 终止、请求重写、会话保持、静态资源缓存);但转发效率低于四层,对 CPU 性能要求较高。
  • 适用场景:Web 服务、API 网关(如电商平台不同页面路由、HTTPS 服务卸载)。
  • 典型产品:HAProxy(七层模式)、Nginx(七层模式)、Kong、APISIX。

三、HAProxy 安装部署

HAProxy 有两种安装方式:yum安装(简单,适合快速部署)和源码安装(灵活,可自定义功能和路径)。

3.1 yum 安装(快速部署)

适用于 CentOS/RHEL 系统,直接通过官方仓库安装:

java 复制代码
[root@hrz1 ~]# yum -y install haproxy
  • 安装后默认路径:
    • 配置文件:/etc/haproxy/haproxy.cfg
    • 二进制文件:/usr/sbin/haproxy
    • 服务管理:通过systemctl直接管理(如systemctl start haproxy)。

3.2 源码安装(自定义部署)

1. 安装HAProxy编译依赖
java 复制代码
[root@hrz1 ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel gcc-c++ zlib-devel lua
  • 操作目的 :安装编译HAProxy所需的工具链依赖库(HAProxy需源码编译,依赖这些组件才能正常编译并启用核心功能)。
  • 关键组件解释
    • make/gcc/gcc-c++:编译工具链(make用于解析Makefile,gcc是C编译器,gcc-c++是C++编译器,HAProxy部分代码依赖C++);
    • pcre-devel:Perl兼容正则表达式库(HAProxy的URL路由、Rewrite等功能依赖此库);
    • openssl-devel:SSL/TLS加密库(启用HAProxy的HTTPS代理、SSL终止功能);
    • zlib-devel:数据压缩库(支持HAProxy对HTTP响应进行gzip压缩);
    • bzip2-devel:bzip2压缩格式支持库(辅助压缩功能);
    • systemd-devel:systemd服务管理库(让HAProxy支持被systemd托管,实现开机自启、平滑重启);
    • lua:Lua脚本支持(HAProxy可通过Lua脚本扩展复杂业务逻辑,如动态路由);
  • 参数-y :自动确认所有安装提示(无需手动输入y确认)。
2. 创建HAProxy专用系统用户
java 复制代码
[root@hrz1 ~]# useradd -r -M -s /sbin/nologin haproxy  
# 验证用户(输出uid、gid即正常)
[root@hrz1 ~]# id haproxy
uid=988(haproxy) gid=982(haproxy) 组=982(haproxy)
  • 操作目的 :创建一个非登录、无家目录的系统用户,用于运行HAProxy进程(遵循"最小权限原则",避免用root直接运行服务,降低安全风险)。
  • 参数含义
    • -r:创建"系统用户"(UID范围通常在1000以下,区别于普通用户);
    • -M:不创建用户家目录(HAProxy无需家目录存储数据);
    • -s /sbin/nologin:指定用户登录shell为/sbin/nologin(禁止该用户通过SSH或终端登录系统);
    • haproxy:用户名(与服务名一致,便于管理)。
3. 查看HAProxy源码包
java 复制代码
[root@hrz1 ~]# ls
haproxy-2.1.3.tar.gz 
  • 操作目的 :确认HAProxy源码压缩包(haproxy-2.1.3.tar.gz)已存在于当前目录(后续需解压编译)。
  • 注:2.1.3是HAProxy的稳定版本,需确保压缩包未损坏(可通过md5sum校验)。
4. 解压HAProxy源码包
java 复制代码
[root@hrz1 ~]# tar -xzvf haproxy-2.1.3.tar.gz 
  • 操作目的 :将源码压缩包解压到当前目录,生成编译所需的源码目录(haproxy-2.1.3)。
  • 参数含义
    • -x:执行"解压"操作;
    • -z:处理gzip格式的压缩包(.tar.gz后缀的包需此参数);
    • -v:显示解压过程(打印每个文件的解压信息,便于排查异常);
    • -f:指定要解压的文件(必须放在参数最后,后跟文件名)。
6. 进入HAProxy源码目录
java 复制代码
[root@hrz1 ~]# cd haproxy-2.1.3/
  • 操作目的:进入解压后的源码目录(所有编译命令需在此目录执行,因Makefile位于该目录下)。
7. 清理残留编译文件
java 复制代码
[root@hrz1 haproxy-2.1.3]# make clean
  • 操作目的 :清理源码目录中可能残留的"旧编译产物"(如.o目标文件、二进制文件),避免影响本次编译(尤其适用于重新编译的场景)。
8. 编译HAProxy(核心步骤)
java 复制代码
[root@hrz1 haproxy-2.1.3]# make -j $(grep 'processor' /proc/cpuinfo |wc -l)  \
> TARGET=linux-glibc  \
> USE_OPENSSL=1  \
> USE_ZLIB=1  \
> USE_PCRE=1  \
> USE_SYSTEMD=1
  • 操作目的:根据系统环境和需求,编译生成HAProxy二进制文件(启用SSL、压缩、正则、systemd支持)。
  • 关键参数拆解
    1. -j $(grep 'processor' /proc/cpuinfo |wc -l)
      并行编译(-j指定编译线程数),括号内命令用于"自动获取CPU核心数"(如4核CPU则用4线程,大幅提升编译速度);
    2. TARGET=linux-glibc:指定目标系统为"Linux + glibc库"(适配绝大多数Linux发行版,如CentOS、RHEL);
    3. USE_OPENSSL=1:启用OpenSSL支持(HAProxy可处理HTTPS流量、配置SSL证书);
    4. USE_ZLIB=1:启用zlib支持(对HTTP响应进行gzip压缩,减少网络带宽占用);
    5. USE_PCRE=1:启用PCRE正则支持(实现URL路由、域名匹配等复杂转发规则);
    6. USE_SYSTEMD=1:启用systemd支持(HAProxy可被systemd管理,支持平滑重启、状态监控);
  • 注:\是Linux命令换行符,用于将长命令拆分行显示,不影响执行逻辑。
9. 安装HAProxy到指定目录
java 复制代码
[root@hrz1 haproxy-2.1.3]# make install PREFIX=/usr/local/haproxy 
  • 操作目的 :将编译好的HAProxy文件(二进制、配置模板、文档等)安装到/usr/local/haproxy目录(自定义安装路径,便于管理,避免与系统默认文件混淆)。
  • PREFIX含义 :指定"安装前缀目录",安装后目录结构如下:
    • /usr/local/haproxy/sbin/haproxy:HAProxy主二进制文件;
    • /usr/local/haproxy/share:文档、示例配置等;
    • /usr/local/haproxy/man:man手册(man haproxy可查看帮助)。
10. 复制HAProxy二进制到系统路径
java 复制代码
[root@hrz1 haproxy-2.1.3]# cp haproxy /usr/sbin/ 
  • 操作目的 :将源码目录中编译好的haproxy二进制文件,复制到/usr/sbin/(系统默认的"系统命令路径",后续可直接在任意目录执行haproxy命令,无需输入完整路径)。
11. 配置HAProxy所需内核参数
java 复制代码
[root@hrz1 haproxy-2.1.3]# vim /etc/sysctl.conf     //编辑内核参数配置文件
[root@hrz1 haproxy-2.1.3]# sysctl -p                // 生效内核参数
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
  • 操作目的:修改Linux内核参数,确保HAProxy正常工作(负载均衡依赖IP转发和非本地IP绑定)。
  • 参数解释
    1. net.ipv4.ip_nonlocal_bind = 1:允许HAProxy绑定"非本地IP"(如虚拟IP/VIP,用于高可用场景,如Keepalived+HAProxy);
    2. net.ipv4.ip_forward = 1:开启IP转发功能(HAProxy需将客户端请求"转发"到后端Web服务器,不开启则无法转发);
  • sysctl -p :立即加载/etc/sysctl.conf中的配置(无需重启系统即可生效)。
12. 创建HAProxy配置文件目录,编写HAProxy主配置文件(核心配置)
java 复制代码
[root@hrz1 haproxy-2.1.3]# mkdir /etc/haproxy
[root@hrz1 haproxy-2.1.3]# vim /etc/haproxy/haproxy.cfg

以下是配置文件内容的逐段解释 (HAProxy配置分为globaldefaultslisten三大块,逻辑上从全局到局部继承):

四、HAProxy 配置解析

HAProxy 配置文件采用五段式结构globaldefaultsfrontendbackendlisten),各段落职责明确且支持配置继承,默认配置文件路径为/etc/haproxy/haproxy.cfg(源码安装需手动创建)。

4.1 配置文件整体结构

段落 归属 核心作用 配置优先级
global 全局设定 进程级参数(与操作系统资源、日志基础配置相关),不被其他段落继承 仅作用于 HAProxy 进程,唯一
defaults 代理设定 默认规则模板,被frontend/backend/listen继承 其他段落参数 > defaults
frontend 代理设定 前端请求入口(接收客户端请求,按规则匹配后端) 自定义规则,指向backend
backend 代理设定 后端服务集群(管理真实服务器,含健康检查、负载均衡算法) 接收frontend转发的请求
listen 代理设定 frontend+backend组合体(适合简单场景,如监控页面、单集群转发) 自身包含 "接收 + 转发" 逻辑

4.2 各段落详细配置(附示例)

4.2.1 global 段:全局进程级配置

作用:配置 HAProxy 进程的基础环境,修改后需重启 HAProxy 生效。

ini 复制代码
global
    log 127.0.0.1 local0 info    # 日志:本地127.0.0.1的local0设备,级别info
    maxconn 20480                 # 全局最大并发连接数(按服务器性能调整,4核8G建议20000-50000)
    pidfile /var/run/haproxy.pid  # PID文件路径(systemd管理需依赖)
    user haproxy                  # 运行HAProxy的用户(对应步骤2创建的haproxy用户)
    group haproxy                 # 运行HAProxy的用户组
    daemon                        # 后台守护进程模式(生产环境必配)
    # nbproc 2                   # 可选:进程数(多核服务器设为CPU核心数,提升并发)
  • 日志级别说明(从低到高,生产环境常用info):

    级别名称 代码 描述
    emerg 0 系统不可用(如进程崩溃)
    alert 1 必须立即处理的事件(如所有后端故障)
    crit 2 关键事件(如单个后端集群故障)
    err 3 错误事件(如健康检查失败、连接超时)
    warning 4 警告事件(如连接数接近阈值)
    notice 5 普通但重要的事件(如服务启动 / 重载)
    info 6 有用信息(如请求日志、转发记录)
    debug 7 调试信息(不建议生产使用)
4.2.2 defaults 段:默认规则模板

作用:定义通用配置,被其他段落继承,减少重复配置。

ini 复制代码
defaults
    mode http                   # 默认协议模式(http=七层,tcp=四层,health=废弃)
    log global                  # 继承global段日志配置
    option dontlognull          # 不记录空连接日志(客户端连后未发请求断开,减少冗余)
    option httpclose            # 每次请求后关闭TCP连接(兼容HTTP/1.0,HTTP/1.1用`option http-keep-alive`)
    option httplog              # 记录HTTP详细日志(含请求方法、URL、状态码等)
    # option forwardfor         # 可选:添加X-Forwarded-For头(后端服务器获取客户端真实IP)
    option redispatch           # 后端故障时,自动重分发请求到健康节点
    balance roundrobin          # 默认负载均衡算法(轮询)
    # 超时配置(单位默认ms,可显式指定s/m/h)
    timeout connect 10s         # 连接后端超时(10秒未连通则视为后端不可用)
    timeout client 10s          # 客户端与HAProxy空闲超时(10秒无请求则断开)
    timeout server 10s          # 后端响应HAProxy超时(10秒无响应则视为超时)
    timeout check 10s           # 健康检查超时(10秒无响应则视为节点故障)
    maxconn 60000               # 每个frontend/backend的最大并发(不超过global的maxconn)
    retries 3                   # 连接失败重试次数(3次失败则标记节点不可用)
  • 时间单位说明(超时参数专用):

    单位后缀 含义 换算关系 示例(5 秒)
    us 微秒 1us = 1/1000000 秒 不常用
    ms 毫秒(默认) 1ms = 1/1000 秒 timeout connect 5000ms
    s 1s = 1000ms timeout connect 5s
    m 分钟 1m = 60s timeout tunnel 10m
    h 小时 1h = 60m timeout http-keep-alive 1h
    d 1d = 24h 不常用
4.2.3 frontend 段:前端请求入口

作用:HAProxy 的 "流量入口",监听指定端口,按 ACL 规则转发到对应后端。

ini 复制代码
frontend http_80_in  # 前端节点名称(自定义,如"http_80_in"表示HTTP 80端口入口)
    bind 0.0.0.0:80  # 监听地址与端口(0.0.0.0=所有网卡,80=HTTP默认端口)
    mode http        # 协议模式(与后端保持一致,此处为七层Web服务)
    log global       # 继承全局日志配置
    option forwardfor # 启用X-Forwarded-For头(后端需信任HAProxy IP才能获取真实客户端IP)
    
    # 示例:ACL规则(按域名匹配转发)
    acl is_www hdr(host) -i www.example.com  # 匹配Host=www.example.com的请求
    acl is_api hdr(host) -i api.example.com  # 匹配Host=api.example.com的请求
    
    # 转发规则
    use_backend www_back if is_www  # 匹配is_www则转发到www_back后端
    use_backend api_back if is_api  # 匹配is_api则转发到api_back后端
    default_backend default_back    # 未匹配任何规则时,转发到default_back后端
  • ACL 规则常用匹配条件:

    匹配条件 示例 作用
    域名(Host) acl is_www hdr(host) -i www.example.com 匹配指定域名请求
    URL 路径 acl is_static path_beg -i /static /img 匹配 URL 以/static/img开头的请求
    客户端 IP acl allow_ip src 192.168.100.0/24 匹配指定网段客户端
    请求方法 acl is_post method POST 匹配 POST 请求(如表单提交)
4.2.4 backend 段:后端服务集群

作用:管理真实服务器集群,定义节点 IP、健康检查、权重等。

ini 复制代码
backend www_back  # 后端集群名称(需与frontend的use_backend对应)
    mode http        # 协议模式(与前端一致)
    option redispatch # 后端故障时重分发请求
    balance source   # 负载均衡算法(源IP哈希,实现会话保持)
    option httpchk GET /index.html  # HTTP健康检查(访问/index.html判断节点健康,需后端存在该文件)
    
    # 后端节点配置:格式=server 节点名 IP:端口 [选项]
    server web1 192.168.100.20:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3
    server web2 192.168.100.30:80 cookie 1 weight 1 check inter 2000 rise 2 fall 3
    # server web3 192.168.100.40:80 backup  # 可选:备份节点(仅主节点全故障时启用)
  • 节点选项说明:
    • cookie N:分配 Cookie 值(配合balance source实现会话保持);
    • weight N:权重(默认 1,权重比 = 请求分配比,如 web1 权重 3、web2 权重 1,则 web1 接收 3/4 请求);
    • check:启用健康检查;
    • inter 2000:健康检查间隔(2000ms=2 秒);
    • rise 2:节点故障后,连续 2 次检查正常则标记为 "健康";
    • fall 3:节点连续 3 次检查失败则标记为 "故障";
    • backup:标记为备份节点。
4.2.5 listen 段:前端 + 后端组合体

作用:同时包含 "请求接收" 和 "后端转发",适合简单场景(如监控页面、单集群转发),是 HAProxy 1.3 前的唯一配置方式。

ini 复制代码
listen admin_stats  # 组合配置名称(如"admin_stats"表示监控页面)
    bind 0.0.0.0:8189  # 监听端口(监控页面访问端口,避免与业务端口冲突)
    stats enable        # 启用监控功能
    mode http           # 协议模式(监控页面为Web服务)
    log global          # 继承全局日志配置
    stats uri /haproxy_stats    # 监控页面访问路径(完整URL:http://HAProxy_IP:8189/haproxy_stats)
    stats realm Haproxy\ Statistics  # 登录提示信息(\转义空格)
    stats auth admin:admin        # 登录账号密码(格式:用户名:密码,可配置多个)
    stats admin if TRUE           # 登录后可手动下线/上线后端节点(便于维护)
    stats refresh 30s             # 监控页面自动刷新间隔(30秒)

五、HAProxy 服务管理与日志配置

5.1 创建 systemd 服务文件(实现开机自启)

源码安装的 HAProxy 需手动创建 systemd 服务文件

java 复制代码
[root@hrz1 haproxy-2.1.3]# vim /usr/lib/systemd/system/haproxy.service

以下是服务文件内容的逐段解释(systemd通过此文件管理HAProxy的启动、停止、重载):

ini 复制代码
[Unit]
Description=HAProxy Load Balancer  # 服务描述(`systemctl status haproxy`时显示)
After=syslog.target network.target  # 服务启动依赖:在syslog(日志服务)和network(网络服务)之后启动(确保依赖服务就绪)

[Service]
# 启动前检查:验证haproxy.cfg配置文件语法是否正确(-c:检查配置,-q:安静模式,仅报错不输出正常信息)
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg   -c -q
# 启动命令:-Ws:以systemd兼容模式运行(支持平滑重启),-f:指定配置文件,-p:指定PID文件
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg  -p /var/run/haproxy.pid
# 重载命令:发送USR2信号给HAProxy主进程(实现"平滑重载配置",不中断现有连接)
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target  # 服务安装目标:在"多用户模式"(系统正常运行模式)下启用(开机自启的关键)

5.2 重新加载systemd配置(让服务文件生效)

java 复制代码
[root@hrz1 haproxy-2.1.3]# systemctl daemon-reload   
  • 操作目的 :systemd仅在启动时加载服务文件,修改或新增服务文件后,需执行此命令"重新扫描服务文件",否则systemctl无法识别新的haproxy.service

5.3 配置HAProxy日志输出(单独记录日志)

bash 复制代码
# 编辑rsyslog配置文件(系统日志服务,HAProxy日志需通过rsyslog写入文件)
$ModLoad imuxsock # 加载"本地系统日志支持模块"(处理通过logger命令或本地设备发送的日志)
$ModLoad imjournal # 加载"systemd日志支持模块"(读取systemd管理的服务日志)
local0.*                /var/log/haproxy.log  # 关键配置:将local0设备的所有日志(HAProxy日志)写入/var/log/haproxy.log
  • 操作目的 :让HAProxy的日志单独存储到/var/log/haproxy.log(避免与系统日志混合,便于后续排查问题)。
  • 注:此配置通常添加到/etc/rsyslog.conf/etc/rsyslog.d/目录下的自定义文件(如haproxy.conf)。

5.4 重启rsyslog服务(让日志配置生效)

java 复制代码
[root@hrz1 haproxy-2.1.3]# systemctl restart rsyslog
  • 操作目的:重启系统日志服务,使"HAProxy日志输出到单独文件"的配置生效。

5.5 启动HAProxy并设置开机自启

java 复制代码
[root@hrz1 haproxy-2.1.3]# systemctl restart haproxy.service  // 重启HAProxy服务(首次启动等同于启动)
[root@hrz1 haproxy-2.1.3]# systemctl enable haproxy.service   // 设置HAProxy开机自启(系统重启后自动运行)
  • 验证启动状态 :可执行systemctl status haproxy.service,若显示active (running)则表示服务正常运行。

19.网页测试

5.6 查看HAProxy日志(验证服务正常工作)

bash 复制代码
[root@hrz1 haproxy-2.1.3]# vim /var/log/haproxy.log 
# 日志内容示例
Sep 23 18:26:06 localhost haproxy[65774]: 192.168.100.1:50012 [23/Sep/2025:18:26:06.958] webcluster webcluster/rs1 0/0/0/1/1 200 235 - - --NI 2/2/0/0/0 0/0 "GET / HTTP/1.1"
Sep 23 18:26:07 localhost haproxy[65774]: 192.168.100.1:50013 [23/Sep/2025:18:26:07.375] webcluster webcluster/rs2 0/0/1/0/1 200 235 - - --NI 2/2/0/0/0 0/0 "GET / HTTP/1.1"
Sep 23 18:26:07 localhost haproxy[65774]: 192.168.100.1:50014 [23/Sep/2025:18:26:07.775] webcluster webcluster/rs1 0/0/1/0/1 200 235 - - --NI 2/2/0/0/0 0/0 "GET / HTTP/1.1"
Sep 23 18:26:08 localhost haproxy[65774]: 192.168.100.1:50015 [23/Sep/2025:18:26:08.062] webcluster webcluster/rs2 0/0/1/1/2 200 235 - - --NI 2/2/0/0/0 0/0 "GET / HTTP/1.1"
  • 日志字段逐段解释 (以第一条日志为例):
    1. Sep 23 18:26:06:日志时间;
    2. localhost:HAProxy服务器主机名;
    3. haproxy[65774]:HAProxy进程名及PID;
    4. 192.168.100.1:50012:客户端IP和端口(发起请求的客户端);
    5. [23/Sep/2025:18:26:06.958]:请求接收时间;
    6. webcluster webcluster/rs1:请求所属集群(webcluster)及转发的后端服务器(rs1,即192.168.100.20);
    7. 0/0/0/1/1:时间统计(单位:毫秒),依次为:客户端到HAProxy时间/HAProxy到后端连接时间/后端响应时间/HAProxy到客户端响应时间/总时间;
    8. 200:HTTP状态码(200表示请求成功);
    9. 235:响应数据大小(单位:字节);
    10. "GET / HTTP/1.1":客户端请求(方法GET,路径/,协议HTTP/1.1);
  • 日志验证结论:客户端(192.168.100.1)的请求被轮询分发到rs1和rs2,状态码均为200,说明HAProxy负载均衡功能正常。

进程名及PID;

  1. 192.168.100.1:50012:客户端IP和端口(发起请求的客户端);

  2. [23/Sep/2025:18:26:06.958]:请求接收时间;

  3. webcluster webcluster/rs1:请求所属集群(webcluster)及转发的后端服务器(rs1,即192.168.100.20);

  4. 0/0/0/1/1:时间统计(单位:毫秒),依次为:客户端到HAProxy时间/HAProxy到后端连接时间/后端响应时间/HAProxy到客户端响应时间/总时间;

  5. 200:HTTP状态码(200表示请求成功);

  6. 235:响应数据大小(单位:字节);

  7. "GET / HTTP/1.1":客户端请求(方法GET,路径/,协议HTTP/1.1);

  • 日志验证结论:客户端(192.168.100.1)的请求被轮询分发到rs1和rs2,状态码均为200,说明HAProxy负载均衡功能正常。
相关推荐
東雪蓮☆3 小时前
ELK 企业级日志分析系统实战教程
linux·运维·elk
泽虞4 小时前
《C++程序设计》笔记p4
linux·开发语言·c++·笔记·算法
什么半岛铁盒4 小时前
C++项目:仿muduo库高并发服务器--------Any类的实现
linux·服务器·数据库·c++·mysql·github
吃不胖没烦恼4 小时前
Alibaba Cloud Linux 3 +Docker 部署 ThinkPHP6 (宝塔环境)
linux·运维·docker
骄傲的心别枯萎5 小时前
RV1126 NO.30:RV1126多线程获取音频AI的PCM数据
linux·ffmpeg·音视频·pcm·视频编解码
zz-zjx5 小时前
Apache 生产环境操作与 LAMP 搭建指南
linux·运维·apache
峰顶听歌的鲸鱼5 小时前
29.Linux防火墙管理
linux·运维·网络·笔记·学习方法
长不大的程序员5 小时前
Linux系统-debian系的软件包管理
linux·运维·服务器·debian
jun~5 小时前
SQLMap绕过 Web 应用程序保护靶机(打靶记录)
linux·笔记·学习·安全·web安全