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 节点 1 | hap-node-1 | 10.10.2.176 |
| Web 节点 2 | hap-node-2 | 10.10.2.134 |
通用前置操作(所有节点):
$ setenforce 0$ systemctl stop firewalld$ hostnamectl set-hostname <对应主机名>三、在线环境部署
3.1 配置阿里云仓库
$ 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 -y3.2 安装服务
# 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 源
[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=centosbaseurl=ftp://[hap-server_IP]/gpgcheck=0enabled=1EOF[root@hap-server ~]# yum clean all && yum makecache4.2 各 node 节点配置 FTP 源
[root@hap-node-1 ~]# mv /etc/yum.repos.d/* /media/[root@hap-node-1 ~]# cat >> /etc/yum.repos.d/local.repo <<EOF[centos]name=centosbaseurl=ftp://[hap-server_IP]/gpgcheck=0enabled=1EOF[root@hap-node-1 ~]# yum clean all && yum makecachehap-node-2 节点重复上述操作。
注意:源文档此处节点 2 命令仍写的是
hap-node-1,是写法笔误,实际执行时主机名应为对应节点。
之后安装 HAProxy / httpd 的步骤与在线一致。
五、HAProxy 配置文件
配置 Frontend、Backend 与监听器:
[root@hap-server ~]# cd /etc/haproxy/[root@hap-server haproxy]# mv haproxy.cfg haproxy.cfg.bak[root@hap-server haproxy]# vi /etc/haproxy/haproxy.cfgglobal 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后端,按轮询分发到两台 Apachecheck:开启对后端的健康检查
六、校验与启动
# 配置语法校验[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.176It is 10.10.2.134It 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后面的算法即可切换调度策略(如leastconn、source) - 健康检查参数和超时时间建议根据实际业务调整,不要直接照搬默认值
HAProxy 负载均衡从原理到部署
https://blog.xeu.asia/posts/haproxy-load-balancer/