1243 字
6 分钟
HAProxy 负载均衡从原理到部署

一、HAProxy 理论#

1.1 什么是 HAProxy#

HAProxy(High Availability Proxy)是一款开源、高性能的负载均衡器与代理服务器,专为 TCP 和 HTTP 应用而设计。它将客户端请求分发到多台后端服务器,提升应用的可用性与性能,支持多种负载均衡算法和健康检查机制。

1.2 优势#

  • 高性能:事件驱动模型,单机可处理大量并发连接
  • 灵活性:多种算法和调度策略,适应不同场景
  • 高可用:健康检查 + 故障转移
  • 功能丰富:SSL 终止、HTTP 重写、压缩等

1.3 整体架构#

组件作用
Frontend(前端)接受客户端请求,按规则处理
Backend(后端)定义一组服务器,处理前端转发的请求
Server(服务器)真正处理请求的后端机器
Listener(监听器)在 Frontend 上监听特定 IP/端口

工作流程:

客户端 → Frontend → 按规则选择 Backend → 转发到具体 Server → 原路返回

1.4 负载均衡算法#

算法说明
roundrobin(轮询)请求依次分配给每个后端
leastconn(最少连接)分配给当前连接数最少的服务器
source(源地址哈希)按客户端 IP 哈希,同一客户端总落到同一服务器
加权轮询按服务器权重分配比例

1.5 健康检查与会话保持#

  • 健康检查:周期性探测后端,故障节点自动摘除(TCP 检查、HTTP 请求检查等)
  • 会话保持:通过源地址哈希或 Cookie,保证同一客户端的请求落到同一台后端

二、环境规划#

实验三节点:

角色主机名IP
负载均衡器hap-server(HAProxy 安装节点)
Web 节点 1hap-node-110.10.2.176
Web 节点 2hap-node-210.10.2.134

通用前置操作(所有节点):

Terminal window
$ setenforce 0
$ systemctl stop firewalld
$ hostnamectl set-hostname <对应主机名>

三、在线环境部署#

3.1 配置阿里云仓库#

Terminal window
$ mv /etc/yum.repos.d/* /media/
$ curl -o /etc/yum.repos.d/CentOS-Base.repo \
http://mirrors.aliyun.com/repo/Centos-7.repo
$ yum clean all && yum makecache
$ yum update -y

3.2 安装服务#

Terminal window
# hap-server
[root@hap-server ~]# yum install -y haproxy
# hap-node-1
[root@hap-node-1 ~]# yum install -y httpd
[root@hap-node-1 ~]# echo "It is 10.10.2.176" >> /var/www/html/index.html
[root@hap-node-1 ~]# systemctl start httpd
# hap-node-2
[root@hap-node-2 ~]# yum install -y httpd
[root@hap-node-2 ~]# echo "It is 10.10.2.134" >> /var/www/html/index.html
[root@hap-node-2 ~]# systemctl start httpd

四、离线环境部署#

差异只在仓库配置——使用 ISO 挂载 + FTP 共享,其余步骤与在线一致。

想要把 HAProxy 及其依赖直接打包成可分发的 RPM 仓库,参考 [[posts/centos-local-yum-repo/index.md]] 的 yum-plugin-downloadonly + createrepo 方案。

4.1 hap-server 准备 FTP 源#

Terminal window
[root@hap-server ~]# mv /etc/yum.repos.d/* /media/
[root@hap-server ~]# mount CentOS-7-x86_64-DVD-2009.iso /mnt/
[root@hap-server ~]# rpm -ivh /mnt/Packages/vsftpd-3.0.2-28.el7.x86_64.rpm
[root@hap-server ~]# echo "anon_root=/mnt/" >> /etc/vsftpd/vsftpd.conf
[root@hap-server ~]# systemctl start vsftpd
[root@hap-server ~]# cat >> /etc/yum.repos.d/local.repo <<EOF
[centos]
name=centos
baseurl=ftp://[hap-server_IP]/
gpgcheck=0
enabled=1
EOF
[root@hap-server ~]# yum clean all && yum makecache

4.2 各 node 节点配置 FTP 源#

Terminal window
[root@hap-node-1 ~]# mv /etc/yum.repos.d/* /media/
[root@hap-node-1 ~]# cat >> /etc/yum.repos.d/local.repo <<EOF
[centos]
name=centos
baseurl=ftp://[hap-server_IP]/
gpgcheck=0
enabled=1
EOF
[root@hap-node-1 ~]# yum clean all && yum makecache

hap-node-2 节点重复上述操作。

注意:源文档此处节点 2 命令仍写的是 hap-node-1,是写法笔误,实际执行时主机名应为对应节点。

之后安装 HAProxy / httpd 的步骤与在线一致。


五、HAProxy 配置文件#

配置 Frontend、Backend 与监听器:

Terminal window
[root@hap-server ~]# cd /etc/haproxy/
[root@hap-server haproxy]# mv haproxy.cfg haproxy.cfg.bak
[root@hap-server haproxy]# vi /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend main *:80
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend web
backend static
balance roundrobin
server static 127.0.0.1:4331 check
backend web
balance roundrobin
# 修改成自己的主机名和 IP
server hap-node-1 10.10.2.176:80 check
server hap-node-2 10.10.2.134:80 check

配置说明:

  • frontend main *:80:在 80 端口监听所有入口流量
  • acl url_static:判断是否为静态资源请求,分流到 static 后端
  • default_backend web:其他请求走 web 后端,按轮询分发到两台 Apache
  • check:开启对后端的健康检查

六、校验与启动#

Terminal window
# 配置语法校验
[root@hap-server ~]# haproxy -f /etc/haproxy/haproxy.cfg -c
# 启动并查看状态
[root@hap-server ~]# systemctl restart haproxy
[root@hap-server ~]# systemctl status haproxy

浏览器访问 http://hap-server-IP/,反复刷新可看到响应在两台节点间轮换:

It is 10.10.2.176
It is 10.10.2.134
It is 10.10.2.176
...

七、常见问题#

现象排查点
启动失败haproxy -f /etc/haproxy/haproxy.cfg -c 看具体错误行
浏览器一直访问同一台浏览器有缓存,强制刷新或换无痕窗口
后端节点反复掉线后端 httpd 是否已起、安全组/防火墙是否放行 80
离线源拉不到包检查 vsftpd 是否启动,anon_root 路径与 ISO 挂载是否一致

八、小结#

  • 在线 vs 离线 的唯一差异在 YUM 仓库的准备方式,HAProxy 与 httpd 的配置完全相同
  • 配置文件的核心是 frontend/backend 与 ACL,理解了这两个概念就能套用到几乎所有场景
  • 调整 balance 后面的算法即可切换调度策略(如 leastconnsource
  • 健康检查参数和超时时间建议根据实际业务调整,不要直接照搬默认值
HAProxy 负载均衡从原理到部署
https://blog.xeu.asia/posts/haproxy-load-balancer/
作者
Xeu
发布于
2026-05-21
许可协议
CC BY-NC-SA 4.0