HAProxy是一款高性能的TCP/HTTP负载均衡器,特别适用于高并发Web服务场景。作为从业多年的系统架构师,我见证过HAProxy在日活千万级电商系统中的稳定表现。其核心优势在于:
YUM安装(推荐新手)
bash复制yum install -y haproxy
优势:
源码编译安装(适合定制需求)
bash复制make TARGET=linux-glibc PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
适用场景:
提示:生产环境建议使用官方提供的RPM包,既保持稳定性又便于版本管理。我曾遇到过自编译版本在CentOS 8上出现内存泄漏的情况。
HAProxy配置采用分段式结构,主要包含以下核心部分:
conf复制global
log 127.0.0.1 local2 # 日志输出到本地syslog的local2设施
chroot /var/lib/haproxy # 安全隔离目录
pidfile /var/run/haproxy.pid
user haproxy # 降权运行
group haproxy
daemon # 守护进程模式
maxconn 4000 # 单进程最大连接数
关键参数说明:
maxconn需要根据ulimit -n调整,通常设置为系统限制的80%nbproc在多核服务器可启用多进程(需配合CPU绑定)conf复制defaults
mode http # 工作模式(http/tcp)
log global
option httplog # 记录HTTP日志
option dontlognull # 不记录空连接
retries 3 # 后端服务器重试次数
timeout http-request 5s # 客户端请求超时
timeout connect 5s # 连接后端超时
timeout client 1m # 客户端空闲超时
timeout server 1m # 后端响应超时
maxconn 3000 # 前后端连接数限制
超时设置经验值:
conf复制listen admin_status
bind 0.0.0.0:5990 # 监控端口
stats refresh 5s # 刷新频率
stats uri /admin?status # 访问路径
stats auth admin:admin # 认证信息
stats admin if TRUE # 启用管理功能
安全建议:
conf复制frontend main
bind *:80
acl is_web hdr_reg(host) -i ^(www\.example\.com|web\.example\.com)$
acl is_api hdr_dom(host) -i api.example.com
use_backend web_servers if is_web
use_backend api_servers if is_api
default_backend static_servers
backend web_servers
balance roundrobin
cookie SERVERID insert nocache
server web1 192.168.1.10:80 check inter 2000 rise 2 fall 3
server web2 192.168.1.11:80 check inter 2000 rise 2 fall 3
backend api_servers
balance leastconn
server api1 192.168.1.20:8080 check
server api2 192.168.1.21:8080 check
ACL匹配技巧:
hdr_reg支持正则匹配hdr_dom匹配完整域名path_beg匹配URL路径开头conf复制option httpchk GET /health
http-check expect status 200
高级检查方式:
conf复制http-check expect string "OK"
conf复制option mysql-check user haproxy_check
主备机配置差异点:
conf复制vrrp_instance VI_1 {
state MASTER # 主机为MASTER,备机为BACKUP
priority 100 # 主机权重高于备机(如90)
}
VIP漂移测试方法:
bash复制tcpdump -i eth0 vrrp -vv
bash复制#!/bin/bash
COUNT=$(ps -C haproxy --no-header | wc -l)
if [ $COUNT -eq 0 ];then
systemctl restart haproxy
sleep 3
NEW_COUNT=$(ps -C haproxy --no-header | wc -l)
if [ $NEW_COUNT -eq 0 ];then
systemctl stop keepalived
fi
fi
部署要点:
bash复制echo "net.ipv4.tcp_max_syn_backlog = 10240" >> /etc/sysctl.conf
echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf
sysctl -p
建议值:
tcp_tw_reuse = 1 快速回收TIME_WAIT连接tcp_fin_timeout = 30 调小FIN超时conf复制global
tune.bufsize 32768 # 缓冲区大小
tune.maxrewrite 1024 # 最大重写空间
backend servers
option tcpka # 启用TCP keepalive
option splice-auto # 零拷贝转发
查看实时日志:
bash复制journalctl -u haproxy -f
关键日志字段:
HRSP_1xx 信息类响应HRSP_2xx 成功响应HRSP_5xx 服务器错误问题1:502 Bad Gateway
排查步骤:
timeout server设置问题2:连接数不足
解决方案:
conf复制global
maxconn 10000
nbproc 4
cpu-map 1 0 # 绑定CPU核心
在实际运维中,我发现80%的HAProxy问题源于配置错误。建议每次修改后使用严格语法检查:
bash复制haproxy -c -f /etc/haproxy/haproxy.cfg
对于大型部署,可以考虑使用Consul+HAProxy实现动态服务发现。我曾在一个微服务架构中通过这种方案将配置维护工作量降低了70%。