HAProxy 知识整理:从负载均衡原理到实战配置
一、负载均衡概述负载均衡Load Balance简称 LB是一种服务或基于硬件设备实现的高可用反向代理技术。它将特定的业务如 Web 服务、网络流量等分担给一个或多个后端服务器实现流量分担从而提高业务的并发处理能力、保证高可用性并方便后期的水平动态扩展。1.1 为什么需要负载均衡动态水平扩展对用户无感知地增加服务器。提升并发能力解决单服务器性能瓶颈。节约公网 IP降低 IT 成本。隐藏内部服务器 IP提高内部服务器安全性。配置简单、功能丰富、性能强劲支持四层和七层负载并发可达数万甚至数十万。1.2 负载均衡类型1.2.1 硬件负载均衡F5美国 F5 网络公司Netscaler美国思杰公司Array华耀AD-1000深信服1.2.2 四层负载均衡通过IP Port决定转发去向。对流量进行 NAT 处理转发至后端服务器。记录 TCP/UDP 连接由哪台服务器处理后续同一连接的流量都转发到该服务器。常见软件LVS重量级、Nginx轻量级可缓存、HAProxy模拟四层转发。1.2.3 七层负载均衡通过虚拟 URL 或主机 IP 进行流量识别根据应用层信息如 HTTP 头部、URL决定负载均衡策略。代理客户端与后端服务器建立连接如 Nginx 可代理前后端。常见软件Nginx基于 HTTP 协议、HAProxy支持会话保持、标记、路径转移等。1.2.4 四层与七层负载均衡的区别对比项四层负载均衡七层负载均衡分层位置传输层及以下应用层及以下性能无需解析报文内容吞吐量高可解析应用层内容URL、Cookie、Header 等原理基于 IP Port基于虚拟 URL 或主机 IP功能类比类似于路由器类似于代理服务器安全性无法识别 DDoS 攻击可防御 SYN Cookie/Flood 攻击二、HAProxy 简介HAProxy 是法国开发者 Willy Tarreau 于 2000 年使用 C 语言开发的开源软件是一款具备高并发万级以上、高性能的 TCP 和 HTTP 负载均衡器。它支持基于 Cookie 的持久性、自动故障切换、正则表达式及 Web 状态统计。企业版网站HAProxy Technologies | Powering the Worlds Busiest Applications社区版网站http://www.haproxy.orgGitHubHAProxy · GitHub2.1 企业版与社区版功能对比功能社区版企业版高级 HTTP/TCP 负载平衡和持久性支持支持高级健康检查支持支持应用程序加速支持支持高级安全特性支持支持高级管理支持支持24×7 支持服务不支持支持实时仪表盘不支持支持VRRP 和 Route Health Injection HA 工具不支持支持ACL、映射和 TLS 票证密钥同步不支持支持基于应用程序的高级 DDoS 和 Bot 保护不支持支持Bot机器人监测不支持支持Web 应用防火墙不支持支持HTTP 协议验证不支持支持实时集群追踪不支持支持三、HAProxy 安装与配置3.1 安装# CentOS/RHEL dnf install haproxy -y 查看版本 haproxy -v3.2 配置文件结构HAProxy 的配置文件haproxy.cfg由两大部分组成global全局配置段进程、安全、性能、Debug 参数proxies代理配置段defaults为 frontend、backend、listen 提供默认配置frontend前端相当于 Nginx 的server {}backend后端相当于 Nginx 的upstream {}listen同时拥有前端和后端配置配置简单生产推荐使用3.3 global 配置示例global log 127.0.0.1 local2 # 定义全局 syslog 服务器 chroot /var/lib/haproxy # 锁定运行目录 pidfile /var/run/haproxy.pid # 指定 pid 文件 maxconn 100000 # 指定最大连接数 user haproxy # 运行用户 group haproxy # 运行组 daemon # 以守护进程方式运行 stats socket /var/lib/haproxy/stats # 指定套接字文件3.4 多进程与多线程配置global nbproc 2 # 指定 work 进程数量 cpu-map 1 0 # 第一个 work 绑定第一个 CPU 核心 cpu-map 2 1 # 第二个 work 绑定第二个 CPU 核心 nbthread 2 # 指定每个进程的线程数量与 nbproc 互斥 maxsslconn 100000 # 每个进程 SSL 最大连接数 maxconnrate 100 # 每个客户端每秒建立连接的最大数量3.5 proxies 配置详解3.5.1 defaults 段defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch option http-keep-alive retries 3 timeout http-request 10s timeout queue 1m timeout connect 120s timeout client 600s timeout server 600s timeout http-keep-alive 60s timeout check 10s maxconn 30003.5.2 frontend 段frontend lee-webserver-80 bind 172.25.254.100:80 mode http use_backend lee-webserver-80-RS # 调用 backend 名称3.5.3 backend 段backend lee-webserver-80-RS mode http server web1 192.168.0.101:80 check inter 3s fall 3 rise 5 server web2 192.168.0.102:80 check inter 3s fall 3 rise 53.5.4 listen 段简化配置listen webserver_80 bind 172.25.254.100:80 mode http option forwardfor server webserver1 192.168.0.101:80 check inter 3s fall 3 rise 5 server webserver2 192.168.0.102:80 check inter 3s fall 3 rise 53.6 socat 工具动态管理Socat 是 Linux 下的多功能网络工具可用于动态调整 HAProxy 后端服务器权重和状态。# 查看帮助 echo help | socat stdio /var/lib/haproxy/stats 查看集群状态 echo show servers state | socat stdio /var/lib/haproxy/stats 查看服务器权重 echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats 设置权重 echo set weight webcluster/web1 1 | socat stdio /var/lib/haproxy/stats 下线服务器 echo disable server webserver_80/webserver1 | socat stdio /var/lib/haproxy/stats 上线服务器 echo enable server webserver_80/webserver1 | socat stdio /var/lib/haproxy/stats四、HAProxy 调度算法HAProxy 通过balance参数指定调度算法可分为静态算法和动态算法两大类。4.1 静态算法静态算法在调度时不会考虑后端服务器的实时状态如连接数、响应时间等主要基于预设的规则或固定参数进行分配。static-rr基于权重的轮询调度不支持运行时动态调整权重只支持 0 和 1。适用场景后端服务器性能差异不大且不需要动态调整权重的简单轮询场景。first按服务器在配置中的顺序选择第一个可用的服务器。适用场景简单的故障转移场景当第一台服务器不可用时才使用第二台。4.2 动态算法动态算法会考虑后端服务器的实时状态如连接数、响应时间等根据当前负载情况智能分配请求。leastconn最少连接数调度将新连接分配给当前连接数最少的服务器。适用场景长连接场景如数据库连接、WebSocket确保连接数均衡。roundrobin基于权重的轮询调度支持动态调整权重支持慢启动。适用场景最常用的算法适用于大多数 HTTP 负载均衡场景支持平滑的权重调整。4.3 其他算法除了静态和动态算法外HAProxy 还提供了一些基于特定请求特征的调度算法适用于更复杂的负载均衡场景。4.3.1 sourcesource算法根据客户端源 IP 地址进行哈希计算将同一源 IP 的请求始终转发到同一台后端服务器。这能保证会话一致性适用于需要保持会话状态的应用。backend app_servers mode http balance source server srv1 192.168.1.10:80 check server srv2 192.168.1.11:80 check4.3.2 uriuri算法根据请求的 URI或 URI 的一部分进行哈希计算将相同 URI 的请求转发到同一台服务器。适用于缓存服务器或需要 URI 级会话保持的场景。backend cache_servers mode http balance uri server cache1 192.168.1.20:80 check server cache2 192.168.1.21:80 check4.3.3 url_paramurl_param算法根据 URL 查询参数的值进行哈希计算。可以指定参数名将包含相同参数值的请求转发到同一台服务器。backend api_servers mode http balance url_param user_id server api1 192.168.1.30:80 check server api2 192.168.1.31:80 check4.3.4 hdrhdr算法根据 HTTP 请求头部的指定字段值进行哈希计算。例如可以根据X-Forwarded-For或Cookie头部实现更精细的调度。backend web_servers mode http balance hdr(X-Forwarded-For) server web1 192.168.1.40:80 check server web2 192.168.1.41:80 check4.3.5 rdp-cookierdp-cookie算法专门用于 RDP远程桌面协议会话的负载均衡根据 RDP Cookie 来保持会话一致性。backend rdp_servers mode tcp balance rdp-cookie server rdp1 192.168.1.50:3389 check server rdp2 192.168.1.51:3389 check4.3.6 算法选择建议source适用于需要基于客户端 IP 保持会话的场景如状态应用。uri适用于缓存服务器或需要 URI 级会话保持的场景。url_param适用于需要根据 URL 参数进行调度的 API 服务。hdr适用于需要根据 HTTP 头部进行精细调度的场景。rdp-cookie专门用于 RDP 会话负载均衡。五、HAProxy 高级功能5.1 访问控制列表ACLACL 用于测试某些条件并根据测试结果执行操作如选择后端服务器、拒绝请求等。5.1.1 ACL 匹配模式hdrHTTP 头部匹配pathURL 路径匹配url整个 URL 匹配dst / dst_port目标 IP/端口匹配src / src_port源 IP/端口匹配5.1.2 ACL 示例域名匹配frontend testacl bind :80 mode http acl web_host hdr_dom(host) www.timinglee.org use_backend timinglee_host if web_host default_backend default_webserver基于源 IP 调度frontend testacl bind :80 mode http acl ip_test src 172.25.254.1 192.168.0.0/24 use_backend ip_test-host if ip_test default_backend default_webserver拒绝指定 User-Agentfrontend testacl bind :80 mode http acl user_agent_block hdr_sub(User-Agent) -i curl wget http-request deny if user_agent_block动静分离基于文件后缀frontend testacl bind :80 mode http acl url_static path_end -i .jpg .png .css .js .html acl url_php path_end -i .php use_backend static_host if url_static use_backend php_host if url_php default_backend default_webserver5.2 自定义错误页面使用errorfile或errorloc指令自定义错误页面。5.2.1 基于文件defaults errorfile 503 /haproxy/errorpages/503page.http5.2.2 基于 HTTP 重定向defaults errorloc 503 https://www.baidu.com5.3 四层负载均衡配置listen mysql_port bind :3306 mode tcp balance leastconn server mysql1 192.168.0.101:3306 check server mysql2 192.168.0.102:3306 check5.4 HTTPS 配置# 生成证书 openssl req -newkey rsa:2048 -nodes -sha256 \ -keyout /etc/haproxy/certs/timinglee.org.key \ -x509 -days 365 -out /etc/haproxy/certs/timinglee.org.crt 合并证书和私钥 cat demo.key demo.crt demo.pemfrontend webserver bind *:80 redirect scheme https if !{ ssl_fc } mode http use_backend webcluster frontend webserver-https bind *:443 ssl crt /etc/haproxy/timinglee.org.pem mode http use_backend webcluster backend webcluster mode http balance roundrobin server web1 172.25.254.200:80 check inter 3s fall 3 rise 5 server web2 172.25.254.201:80 check inter 3s fall 3 rise 5六、总结HAProxy 作为一款成熟的开源负载均衡软件在四层和七层负载均衡场景中都有出色的表现。通过本文的梳理我们可以总结出 HAProxy 的核心优势和应用要点6.1 HAProxy 核心优势高性能高并发支持万级甚至数十万级并发连接适合高流量场景。配置灵活支持丰富的调度算法、ACL 访问控制、健康检查等高级功能。稳定性强经过多年生产环境验证具备良好的稳定性和可靠性。社区活跃拥有活跃的开源社区和持续的功能更新。多协议支持同时支持 TCP四层和 HTTP七层负载均衡。6.2 适用场景Web 应用负载均衡HTTP/HTTPS 流量分发支持会话保持、动静分离。数据库负载均衡MySQL、Redis 等数据库服务的连接池管理。API 网关微服务架构中的 API 路由和流量控制。高可用集群配合 Keepalived 等工具实现高可用架构。安全防护通过 ACL 实现访问控制防御 DDoS 攻击。6.3 最佳实践建议配置优化根据实际业务场景调整超时时间、连接数等参数。健康检查合理设置健康检查间隔和阈值确保后端服务可用性。日志监控配置 syslog 或集中式日志收集便于故障排查。性能调优根据 CPU 核心数合理配置多进程/多线程。安全加固启用 SSL/TLS 加密配置适当的 ACL 规则。HAProxy 的学习曲线相对平缓通过掌握其核心配置和高级功能可以构建出稳定、高效、可扩展的负载均衡架构。建议从简单的四层负载开始实践逐步深入到七层负载、ACL 控制、HTTPS 等高级功能最终形成适合自身业务的最佳实践方案。