当前位置:首页 > 行业动态 > 正文

haproxy怎么设置负载均衡

在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但请求无法到达,可能是什么原因?
答:可能原因包括:

  1. 防火墙规则阻止访问(检查iptables/firewalld)
  2. 后端服务未正确绑定地址(如仅监听127.0.0.1)
  3. SELinux/AppArmor策略限制
  4. HAProxy用户权限不足(需root或相应权限)
  5. 网络命名空间问题(如Docker容器网络配置)

问:如何调整超时参数应对高延迟网络?
答:根据业务特性调整以下参数:

# 在defaults段配置:
timeout connect 10s      # 建立连接超时时间
timeout client 60s       # 客户端空闲超时时间
timeout server 60s       # 服务器端空闲超时时间

对于长连接应用(如数据库):

  • 增大timeout server至分钟级(如timeout server 300s
  • 启用option http-keep-alive保持连接
0