haproxy怎么设置负载均衡
- 行业动态
- 2025-05-11
- 2
在haproxy.cfg中配置frontend监听端口,定义backend使用balance roundrobin,添加server条目指向各节点IP及端口,保存
HAProxy负载均衡配置详解
HAProxy基础概念
HAProxy是一款高性能的TCP/HTTP负载均衡器,支持多种协议(HTTP/HTTPS/TCP/UDP),广泛应用于Web服务、数据库中间层等场景,其核心功能包括流量分发、健康检查、会话保持、SSL卸载等。
安装HAProxy
不同系统的安装命令:
# CentOS/RHEL yum install haproxy -y # Ubuntu/Debian apt-get update && apt-get install haproxy -y
核心配置文件结构
主配置文件为/etc/haproxy/haproxy.cfg
,包含以下关键段:
| 配置段 | 作用 |
|————–|——————————|
| global | 全局参数(日志、进程优先级) |
| defaults | 默认参数(超时、缓冲区) |
| frontend | 前端监听配置 |
| backend | 后端服务器池定义 |
| monitor | 监控插件(需额外配置) |
基础HTTP负载均衡配置示例
配置前端(接收请求)
frontend http_front bind :80 # 监听80端口 mode http # HTTP协议模式 default_backend http_back # 默认转发到http_back后端
配置后端(服务器池)
backend http_back mode http balance roundrobin # 轮询算法 server web1 192.168.1.10:80 check inter 2s # 健康检查每2秒 server web2 192.168.1.11:80 check inter 2s
完整配置示例
global log /var/log/haproxy.log local0 maxconn 4096 defaults log global option httplog timeout connect 5s timeout client 50s timeout server 50s frontend http_front bind :80 mode http default_backend http_back backend http_back mode http balance roundrobin server web1 192.168.1.10:80 check inter 2s fall 3 rise 2 server web2 192.168.1.11:80 check inter 2s fall 3 rise 2
负载均衡算法对比
算法类型 | 适用场景 | 特点 |
---|---|---|
roundrobin | 均摊流量 | 无状态,严格按顺序轮流分配 |
leastconn | 长连接场景 | 优先分配给当前连接数最少的服务器 |
source | IP地址哈希 | 根据客户端IP计算哈希值,固定分配到特定服务器(会话保持) |
uri | 基于请求URI | 相同URL请求分配到同一服务器 |
hdr(自定义头部) | 复杂路由需求 | 根据HTTP头中的特定字段进行分流 |
健康检查配置
关键参数说明:
check
: 启用健康检查inter
: 检查间隔(单位秒)fall
: 失败判定次数rise
: 恢复成功次数port
: 指定检查端口(非80/443时)
示例:检查HTTPS服务
server api_server 192.168.1.20:443 ssl check inter 5s port 4443
SSL终端卸载配置
配置证书
frontend https_front bind :443 ssl crt /etc/haproxy/cert.pem ca-crt /etc/haproxy/ca.pem mode http default_backend http_back
强制HTTPS跳转
frontend https_front # ...其他配置 redirect scheme https if !{ ssl_fc }
高级功能配置
基于Cookie的会话保持
backend http_back cookie SERVERID insert indirect nocache
动态服务器列表
通过脚本修改/var/lib/haproxy/stats
文件实现动态添加/删除服务器。
多数据中心负载均衡
backend multi_dc balance leastconn server ny_dc 10.0.0.1:80 check inter 10s server la_dc 10.1.0.1:80 check inter 10s
故障转移与高可用
VRRP+HAProxy集群
- 使用虚拟IP(VIP)实现故障转移
- 配置示例:
frontend vip_front bind 192.168.1.254:80 default_backend http_back
Keepalived配置
# 主节点配置 global_defs { notification_email { admin@example.com } } vrrp_instance VI_1 { state MASTER interface eth0 virtual_ipaddress { 192.168.1.254 } }
日志与监控
日志格式配置
global log /var/log/haproxy.log local0 logformat custom_format # 自定义格式示例: logformat custom_format %ci:%cp [%tr] %ft %b %D %Tq %Tw %Tc %{+Q}r %ST %{+Q}f %{+Q}hc %{+Q}hb %{+Q}ht %{+Q}hh %{+Q}HC %{+Q}SC %{+Q}RE %{+Q}PI %{+Q}PE %{+Q}PL %{+Q}SD %{+Q}SA %{+Q}RM %{+Q}U %{+Q}UA %{+Q}G %{+Q}H %{+Q}L %{+Q}p %{+Q}P %{+Q}PS %{+Q}PA %{+Q}CS(%t) %{+Q}ac %{+Q}res(%r) %{+Q}req(%R) %{+Q}len(%B) %{+Q}rc(%s) %{+Q}rt(%Tt) %{+Q}wt(%Tw) %{+Q}ct(%Tc) %{+Q}status(%st) %{+Q}bytes(%b) %{+Q}rate(%rr) %{+Q}hit(%{+Q}h) %{+Q}miss(%{+Q}m) %{+Q}stall(%{+Q}st) %{+Q}pipe(%{+Q}ppl) %{+Q}upstream(%{+Q}u) %{+Q}cache(%{+Q}cch) %{+Q}comment(%[un]cap) %{+Q}method(%rm) %{+Q}uri(%ru) %{+Q}protocol(%rp) %{+Q}domain(%rd) %{+Q}referer(%rr) %{+Q}user_agent(%ua) %{+Q}cookie(%uc) %{+Q}forwarded(%[un]ff) %{+Q}ssl_version(%{+Q}sslv) %{+Q}ssl_cipher(%{+Q}sslc) %{+Q}ssl_session(%{+Q}sslr) %{+Q}gzip(%[un]gz) %{+Q}chunked(%[un]chk) %{+Q}keep_alive(%[un]ka) %{+Q}upgrade(%[un]up) %{+Q}websocket(%[un]ws) %{+Q}push(%[un]pu) %{+Q}dav(%[un]dav) %{+Q}esi(%[un]esi) %{+Q}varnish(%[un]vc) %{+Q}x-cache(%[un]xc) %{+Q}surrogate(%[un]sg) %{+Q}x-cluster(%[un]xcl) %{+Q}x-forwarded-for(%[un]xff) %{+Q}true_client(%[un]tc) %{+Q}request_id(%[un]rid) %{+Q}response_time(%[un]rt) %{+Q}upstream_response_time(%[un]urt) %{+Q}upstream_addr(%[un]uad) %{+Q}backend_name(%[un]bn) %{+Q}server_name(%[un]sn) %{+Q}server_id(%[un]sid) %{+Q}server_port(%[un]sp) %{+Q}server_state(%[un]ss) %{+Q}server_queue(%[un]sq) %{+Q}server_weight(%[un]sw) %{+Q}server_check_status(%[un]scs) %{+Q}server_check_desc(%[un]scd) %{+Q}server_check_interval(%[un]sci) %{+Q}server_check_rise(%[un]scr) %{+Q}server_check_fall(%[un]scf) %{+Q}server_check_last_chg(%[un]sclc) %{+Q}server_check_next_chg(%[un]scn) %{+Q}server_check_type(%[un]sct) %{+Q}server_check_status_code(%[un]scscode) %{+Q}server_check_message(%[un]scm) %{+Q}server_check_trace(%[un]sct) %{+Q}server_check_sock(%[un]scs) %{+Q}server_check_family(%[un]scf) %{+Q}server_check_proto(%[un]scp) %{+Q}server_check_addr(%[un]sca) %{+Q}server_check_port(%[un]scp) %{+Q}server_check_timeout(%[un]sctmo) %{+Q}server_check_retry(%[un]sctr) %{+Q}server_check_delay(%[un]scdly) %{+Q}server_check_jitter(%[un]scj) %{+Q}server_check_status_age(%[un]sca) %{+Q}server_check_last_good(%[un]slg) %{+Q}server_check_last_bad(%[un]slb) %{+Q}server_check_total_failures(%[un]stf) %{+Q}server_check_total_successes(%[un]sts) %{+Q}server_check_consecutive_failures(%[un]scf) %{+Q}server_check_consecutive_successes(%[un]scs) %{+Q}server_check_max_failures(%[un]smf) %{+Q}server_check_max_successes(%[un]sms) %{+Q}server_check_min_failures(%[un]smif) %{+Q}server_check_min_successes(%[un]smis) %{+Q}server_check_avg_response_time(%[un]sart) %{+Q}server_check_min_response_time(%[un]sminrt) %{+Q}server_check_max_response_time(%[un]smaxrt) %{+Q}server_check_total_response_time(%[un]start) %{+Q}server_check_response_times(%[un]srt) %{+Q}server_check_status_codes(%[un]scscodes) %{+Q}server_check_messages(%[un]scms) %{+Q}server_check_traces(%[un]scts) %{+Q}server_check_socks(%[un]scs) %{+Q}server_check_families(%[un]scfam) %{+Q}server_check_protos(%[un]scpro) %{+Q}server_check_addrs(%[un]scadr) %{+Q}server_check_ports(%[un]scpor) %{+Q}server_check_timeouts(%[un]sctmos) %{+Q}server_check_retrys(%[un]sctr) %{+Q}server_check_delays(%[un]scdlys) %{+Q}server_check_jitters(%[un]scjs) %{+Q}server_check_status_ages(%[un]scag) %{+Q}server_check_last_goods(%[un]slgs) %{+Q}server_check_last_bads(%[un]slbs) %{+Q}server_check_total_failuress(%[un]stfs) %{+Q}server_check_total_successess(%[un]stss) %{+Q}server_check_consecutive_failuress(%[un]scfs) %{+Q}server_check_consecutive_successess(%[un]scss) %{+Q}server_check_max_failuress(%[un]smfs) %{+Q}server_check_max_successess(%[un]sms) %{+Q}server_check_min_failuress(%[un]smifs) %{+Q}server_check_min_successess(%[un]smis) %{+Q}server_check_avg_response_times(%[un]sarts) %{+Q}server_check_min_response_times(%[un]sminrts) %{+Q}server_check_max_response_times(%[un]smaxrts) %{+Q}server_check_total_response_times(%[un]starts) %{+Q}server_check_response_timespans(%[un]srtspans) %{+Q}server_check_status_codespans(%[un]scscodespans) %{+Q}server_check_messagespans(%[un]scmspans) %{+Q}server_check_tracespans(%[un]sctsspans) %{+Q}server_check_sockspans(%[un]scsspans) %{+Q}server_check_familyspans(%[un]scfamspans) %{+Q}server_check_protospans(%[un]scprospans) %{+Q}server_check_addrspans(%[un]scadrspans) %{+Q}server_check_portspans(%[un]scporspans) %{+Q}server_check_timeoutspans(%[un]sctmospans) %{+Q}server_check_retryspans(%[un]sctrspans) %{+Q}server_check_delayspans(%[un]scdlyspans) %{+Q}server_check_jitterspans(%[un]scjspans) %{+Q}server_check_status_agespans(%[un]scagspans) %{+Q}server_check_last_goodspans(%[un]slgspans) %{+Q}server_check_last_badspans(%[un]slbsspans) %{+Q}server_check_total_failurespans(%[un]stfsspans) %{+Q}server_check_total_successspans(%[un]stssspans) %{+Q}server_check_consecutive_failurespans(%[un]scfsspans) %{+Q}server_check_consecutive_successspans(%[un]scssspans) %{+Q}server_check_max_failurespans(%[un]smfsspans) %{+Q}server_check_max_successspans(%[un]smsspans) %{+Q}server_check_min_failurespans(%[un]smifsspans) %{+Q}server_check_min_successspans(%[un]smisspans) %{+Q}server_check_avg_response_timespans(%[un]sartspans) %{+Q}server_check_min_response_timespans(%[un]sminrtspans) %{+Q}server_check_max_response_timespans(%[un]smaxrtspans) %{+Q}server_check_total_response_timespans(%[un]startspans) %{+Q}server_check_response_timeranges(%[un]srtranges) %{+Q}server_check_status_coderanges(%[un]scscoderanges) %{+Q}server_check_messageranges(%[un]scmranges) %{+Q}server_check_traceranges(%[un]sctsranges) %{+Q}server_check_sockranges(%[un]scsranges) %{+Q}server_check_familyranges(%[un]scfamranges) %{+Q}server_check_protoranges(%[un]scproranges) %{+Q}server_check_addrranges(%[un]scadrranges) %{+Q}server_check_portranges(%[un]scporranges) %{+Q}server_check_timeoutranges(%[un]sctmoranges) %{+Q}server_check_retryranges(%[un]sctrranges) %{+Q}server_check_delayranges(%[un]scdlyranges) %{+Q}server_check_jitterranges(%[un]scjsranges) %{+Q}server_check_status_ageranges(%[un]scagranges) %{+Q}server_check_last_goodranges(%[un]slgranges) %{+Q}server_check_last_badranges(%[un]slbsranges) %{+Q}server_check_total_failureranges(%[un]stfsranges) %{+Q}server_check_total_successranges(%[un]stssranges) %{+Q}server_check_consecutive_failureranges(%[un]scfsranges) %{+Q}server_check_consecutive_successranges(%[un]scssranges) %{+Q}server_check_max_failureranges(%[un]smfsranges) %{+Q}server_check_max_successranges(%[un]smsranges) %{+Q}server_check_min_failureranges(%[un]smifsranges) %{+Q}server_check_min_successranges(%[un]smisranges) %{+Q}server_check_avg_response_timeranges(%[un]sartranges) %{+Q}server_check_min_response_timeranges(%[un]sminrtranges) %{+Q}server_check_max_response_timeranges(%[un]smaxrtranges) %{+Q}server_check_total_response_timeranges(%[un]startranges) %}" | tee -a /var/log/haproxy.log
集成Prometheus监控
# 在defaults段添加: stats socket /run/haproxy/stat inet stream
部署haproxy-exporter
组件导出指标。
十一、常见问题与优化建议
后端服务器频繁上下线
- 检查健康检查阈值(fall/rise参数)
- 增加检查间隔(inter参数)
- 启用慢启动(rise参数)
SSL性能优化
- 启用硬件加速(如OpenSSL引擎)
- 配置OCSP Stapling减少握手延迟
- 调整缓冲区大小:
bufsize 16384
连接复用配置
# 在defaults段添加: option http-keep-alive
FAQs
问:后端服务器显示UP但请求无法到达,可能是什么原因?
答:可能原因包括:
- 防火墙规则阻止访问(检查iptables/firewalld)
- 后端服务未正确绑定地址(如仅监听127.0.0.1)
- SELinux/AppArmor策略限制
- HAProxy用户权限不足(需root或相应权限)
- 网络命名空间问题(如Docker容器网络配置)
问:如何调整超时参数应对高延迟网络?
答:根据业务特性调整以下参数:
# 在defaults段配置: timeout connect 10s # 建立连接超时时间 timeout client 60s # 客户端空闲超时时间 timeout server 60s # 服务器端空闲超时时间
对于长连接应用(如数据库):
- 增大
timeout server
至分钟级(如timeout server 300s
) - 启用
option http-keep-alive
保持连接