当随着访问量的增加时,原来的单台服务器难以承受大量的访问时,就需要使用负载均衡来分担服务器的压力。本文介绍使用HAProxy实现一个免费、高效、可靠的高可用负载均衡解决方案。
HAProxy简介 #
HAProxy(High Availability Proxy)是一款高性能的TCP/HTTP负载均衡器和反向代理服务器,由法国人Willy Tarreau开发,采用C语言编写。它以轻量、高效、稳定著称,广泛应用于高并发场景,如大型网站、API服务、数据库负载均衡等,是构建高可用架构的核心组件之一。适合处理高负载站点的七层数据请求,对外可屏蔽内部的真实Web服务器,防止内部服务器遭受外部攻击。
核心功能 #
-
负载均衡
- 支持多种协议:HTTP、HTTPS、TCP(如数据库、SSH)、UDP(v2.3+实验性支持)。
- 丰富的负载均衡算法:
- 静态算法:轮询(Round Robin)、加权轮询(Weighted RR)、源IP哈希(Source IP Hash,会话保持)。
- 动态算法:最小连接数(Least Connections)、加权最小连接(Weighted LC)、URL哈希(URL Hash)等。
- 健康检查:主动/被动检查后端服务器状态,自动剔除故障节点,恢复后重新加入。
-
反向代理
- 隐藏后端服务器,保护内部架构,统一入口流量。
- 支持路径路由(基于URL路径转发到不同后端服务,如
/api→API服务器,/static→静态资源服务器)。 - SSL/TLS终结:解密HTTPS流量,减轻后端服务器负担,同时支持SSL证书管理。
-
高可用与性能优化
- 无状态设计:支持水平扩展,可部署多实例配合Keepalived实现故障转移。
- 低资源消耗:单进程事件驱动模型(类似Nginx),处理十万级并发连接,内存占用极低。
- 连接复用:复用后端服务器TCP连接,减少握手开销。
- 缓存与压缩:缓存静态资源,支持Gzip压缩,提升响应速度。
-
安全防护
- DDoS防护:限制单IP连接数、请求速率。
- WAF基础功能:过滤恶意请求(如SQL注入、XSS)。
- 访问控制:基于IP、用户认证(Basic Auth)等限制访问。
-
监控与日志
- 内置统计页面(
/haproxy?stats),实时展示流量、后端状态、错误率等指标。 - 详细日志记录,支持自定义日志格式,便于问题排查和性能分析。
- 内置统计页面(
应用场景 #
- Web服务负载均衡:分发HTTP/HTTPS请求到多台应用服务器(如Nginx、Tomcat、Node.js)。
- 数据库读写分离:通过TCP模式代理MySQL,将读请求分发到从库,写请求路由到主库。
- API网关:统一API入口,实现路由、认证、限流、监控。
- 高可用集群:配合Keepalived实现负载均衡器自身的故障转移,避免单点故障。
- CDN节点流量分发:在CDN架构中分发用户请求到边缘节点。
与其他工具对比 #
| 工具 | 特点对比 |
|---|---|
| HAProxy | 性能极强,支持TCP/UDP,配置灵活,适合复杂负载均衡场景,但HTTP功能(如缓存)较弱。 |
| Nginx | HTTP功能丰富(缓存、Rewrite、SSL),轻量易用,适合静态资源+反向代理,但TCP负载均衡能力弱于HAProxy。 |
| LVS | 工作在Linux内核层(L4/L7),性能顶尖,但配置复杂,依赖内核模块,灵活性较低。 |
HAProxy解决方案 #
- 客户端IP:将客户端IP进行Hash计算并保存,当相同的IP访问代理服务器时可以转发至相同的后端服务器;
- Cookie:依靠真实服务器发送给客户端的Cookie信息进行会话保持;
- Session:保存真实服务器的Session及服务标识,实现会话保持功能;
实验拓扑图 #

实验配置 #
HAProxy配置 #
1、安装HAProxy
$ yum install -y haproxy
2、修改配置文件
$ [root@CentOS7] ~$ vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
frontend haproxy_inbound
bind *:80
default_backend haproxy_httpd
backend haproxy_httpd
balance roundrobin
option httpchk GET /index.html # 健康检查
server web1 192.168.10.129:80 check
server web2 192.168.10.130:80 check
3、内核优化
$ vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
4、开启日志服务
# 修改日志配置文件
$ vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
# 重启日志服务
$ systemctl restart syslog
5、开启HAProxy
$ haproxy -f /etc/haproxy/haproxy.cfg
后端Web服务器配置 #
后端服务器配置基本相同,为了验证试验效果,后端网页不同 1、配置网卡
$ vim /etc/sysconfig/network-scripts/ifcfg-ens33554984
NAME=ens33554984
BOOTPROTO='static'
ONBOOT="yes"
IPADDR=192.168.10.129
GATEWAY=192.168.10.128 #网关指向HAProxy的内网IP
TYPE="Ethernet"
$ systemctl restart network
2、Apache配置 网页文件做修改,其他配置相同
[root@CentOS7] ~$ yum install -y httpd
# Web-1
[root@CentOS7] ~$ echo "This is Web-1" > /var/www/html/index.html
# Web-2
[root@CentOS7] ~$ echo "This is Web-2" > /var/www/html/index.html
[root@CentOS7] ~$ systemctl start httpd
[root@CentOS7] ~$ systemctl enable httpd
测试 #
重启HAProxy
$ systemctl restart haproxy.service
浏览器打开 http://192.168.10.128,刷新网页,便可以看到在Web-1和Web-2之间轮询。实现一个负载均衡。