Skip to content

HAProxy 完全指南

HAProxy 负载均衡架构示意图

一份面向产品团队和开发者的 HAProxy 知识文档,涵盖核心概念、配置实践与运维要点。

💡 适用版本:HAProxy 2.0+(涵盖 2.4 / 2.6 / 2.8 LTS)

1. 概述

1.1 什么是 HAProxy?

HAProxy(High Availability Proxy)是一款开源的、高性能的 TCP/HTTP 反向代理和负载均衡器。它采用单进程、事件驱动、非阻塞架构,能够在极低资源消耗下稳定处理海量并发连接(单机轻松支撑数万至数十万并发),是互联网基础设施中极其成熟可靠的组件。

1.2 核心功能速览

功能模块具体能力
负载均衡支持轮询(roundrobin)、最少连接(leastconn)、源 IP 哈希(source)、URI 哈希等多种算法
健康检查主动探测后端服务状态,自动隔离故障节点,恢复后无缝加入
7 层路由基于 URL 路径、HTTP 头部、Cookie、请求方法等条件进行精细化流量分发
会话保持通过 Cookie 注入或源 IP 哈希,确保同一用户的请求始终落到同一后端
SSL/TLS 卸载在代理层集中处理 HTTPS 加密解密,减轻后端压力
高可用支持配合 Keepalived 实现主备热切换,消除单点故障
广泛协议支持既支持 HTTP/HTTPS,也支持 TCP 原生代理(MySQL、Redis、SMTP 等)

1.3 典型应用场景

  • Web 应用负载均衡:将海量用户请求分发到多台 Web 服务器,提升吞吐量与可用性
  • 微服务网关 / K8s Ingress:作为 Kubernetes 集群的入口控制器,实现基于域名和路径的路由
  • 数据库 / 缓存代理:为 MySQL、Redis、PostgreSQL 等提供连接负载均衡和故障转移
  • API 网关:对外部 API 请求进行限流、认证前置、版本路由
  • 服务网格数据面:充当 Sidecar 代理,处理服务间通信的负载均衡与熔断

2. 核心概念

理解 HAProxy 必须先掌握三个核心配置块:

2.1 frontend(前端)

定义客户端如何接入。它指定监听的 IP 地址和端口,并决定接收到的流量如何处理、匹配哪些规则后转发到哪个后端。

haproxy
frontend web_frontend
    bind *:80
    mode http
    default_backend app_backend

2.2 backend(后端)

定义一组真实服务器(称为 server),并配置负载均衡算法、健康检查策略和会话保持方式。

haproxy
backend app_backend
    mode http
    balance roundrobin
    option httpchk GET /health
    server web1 192.168.1.10:8080 check
    server web2 192.168.1.11:8080 check

2.3 listen(监听)

listenfrontend + backend 的简化组合写法,适用于简单场景(如单一端口代理到一组后端)。

haproxy
listen mysql_cluster
    bind *:3306
    mode tcp
    balance leastconn
    server db1 10.0.0.1:3306 check
    server db2 10.0.0.2:3306 check

3. 负载均衡算法详解

HAProxy 支持多种算法,选择哪种取决于业务特点:

算法关键字适用场景
轮询roundrobin服务器性能相近,请求均匀分发(默认,支持动态调整权重)
最少连接leastconn长连接场景(如数据库连接、WebSocket),分配给当前活跃连接数最少的后端
源 IP 哈希source会话保持需求,同一来源 IP 始终去往同一后端(适用于无 Cookie 场景)
URI 哈希uri缓存友好,相同 URI 请求命中同一后端,提高缓存命中率
URL 参数哈希url_param根据 URL 中指定参数(如 user_id)做哈希分发
随机random配合 hash-balance-factor 可实现近似均匀分布,适合大规模后端池

示例:

haproxy
backend myapp
    balance leastconn      # 长连接场景优先
    # balance source        # 如需会话保持可切换
    server app1 10.0.0.1:8080 check
    server app2 10.0.0.2:8080 check

4. 配置详解(实战级示例)

4.1 全局配置(global

设置进程运行参数、日志、最大连接数、用户/组等。

haproxy
global
    log /dev/log local0    # 日志输出到 syslog
    maxconn 40000          # 单进程最大连接数
    user haproxy
    group haproxy
    daemon                 # 后台运行
    stats socket /var/run/haproxy.sock mode 600 level admin  # 管理接口
    tune.ssl.default-dh-param 2048

4.2 默认配置(defaults

frontendbackendlisten 提供默认值,减少重复配置。

haproxy
defaults
    mode http
    log global
    option httplog          # 记录 HTTP 请求详细日志
    option dontlognull      # 不记录空连接
    retries 3
    timeout connect 5000ms  # 连接后端超时
    timeout client 50000ms  # 客户端空闲超时
    timeout server 50000ms  # 服务端空闲超时
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 503 /etc/haproxy/errors/503.http

4.3 完整 Web 负载均衡实例

场景:对外提供 HTTPS 服务,将请求按 URL 路径分流到两套后端(API 和静态资源),并启用健康检查。

haproxy
global
    log /dev/log local0
    maxconn 30000
    user haproxy
    group haproxy
    daemon

defaults
    mode http
    log global
    option httplog
    option dontlognull
    retries 3
    timeout connect 5s
    timeout client 30s
    timeout server 30s

# ---------- HTTPS 前端 ----------
frontend https_in
    bind *:443 ssl crt /etc/ssl/certs/myapp.pem
    reqadd X-Forwarded-Proto:\ https
    default_backend api_servers

    # 根据路径转发:静态资源去 static 后端
    use_backend static_servers if { path_beg /static/ /images/ /css/ /js/ }

# ---------- API 后端 ----------
backend api_servers
    balance roundrobin
    option httpchk GET /api/health
    server api1 192.168.1.10:8080 check rise 2 fall 3
    server api2 192.168.1.11:8080 check rise 2 fall 3
    server api3 192.168.1.12:8080 check rise 2 fall 3 backup   # 备用节点

# ---------- 静态资源后端 ----------
backend static_servers
    balance source         # 源 IP 哈希,提高缓存命中率
    option httpchk HEAD /index.html
    server static1 192.168.1.20:80 check
    server static2 192.168.1.21:80 check

5. 健康检查配置

健康检查是保证高可用的关键,HAProxy 支持多种检查方式:

检查类型配置方式适用场景
TCP 端口检查check(默认)仅检测端口是否监听
HTTP 层检查option httpchk + http-check验证应用返回状态码(2xx/3xx 视为健康)
自定义脚本检查external-check执行外部脚本,用于复杂业务校验
被动检查observe + error-limit通过观察请求失败次数被动判定健康状态

进阶示例:对 API 服务做精细检查——要求返回体包含特定字符串。

haproxy
backend api_backend
    option httpchk GET /health
    http-check expect string "OK"
    server api1 10.0.0.1:8080 check inter 2000 rise 2 fall 3

参数说明:

  • inter 2000:每 2 秒检查一次
  • rise 2:连续成功 2 次标记为健康
  • fall 3:连续失败 3 次标记为故障

6. ACL(访问控制列表)

ACL 是 HAProxy 7 层路由的核心,可以基于各种条件匹配请求,再决定转发策略。

常用 ACL 条件:

条件示例
路径前缀{ path_beg /api /v1 }
路径后缀{ path_end .jpg .png .css }
域名{ hdr(host) -i example.com }
HTTP 方法{ method POST }
请求头{ hdr(user-agent) -i mobile }
源 IP{ src 192.168.1.0/24 }
URL 参数{ url_param(user_id) 12345 }

实战场景:根据来源 IP 做灰度发布。

haproxy
frontend web
    bind *:80
    use_backend canary_backend if { src 10.0.10.0/24 }   # 内网测试 IP 走灰度
    default_backend prod_backend

7. 会话保持(Sticky Sessions)

对于需要保持会话状态的应用(如购物车),可用以下方式实现:

HAProxy 在首次响应时插入 SERVERID Cookie,后续请求据此路由。

haproxy
backend app
    balance roundrobin
    cookie SERVERID insert indirect nocache
    server app1 10.0.0.1:80 cookie app1 check
    server app2 10.0.0.2:80 cookie app2 check

方式二:源 IP 哈希

haproxy
backend app
    balance source
    hash-type consistent    # 一致性哈希,减少节点变动时重新映射
    server app1 10.0.0.1:80 check
    server app2 10.0.0.2:80 check

8. 高可用架构(Keepalived 集成)

HAProxy 自身无主备机制,需配合 Keepalived 实现 VIP(虚拟 IP)漂移。

简单部署架构:

Keepalived 配置要点(主节点):

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        10.0.0.100/24
    }
}

备节点将 state 改为 BACKUPpriority 降低(如 90)。

9. 监控与统计页面

HAProxy 内置统计页面,极大方便运维观察:

haproxy
frontend stats
    bind *:8080
    stats enable
    stats uri /stats
    stats refresh 10s
    stats auth admin:password
    stats show-legends
    stats show-node

访问 http://your-haproxy:8080/stats 即可看到每个 frontend/backend/server 的实时流量、连接数、健康状态等。

集成 Prometheus 监控

  • 通过 stats socket 暴露指标,使用 haproxy_exporter 采集
  • 或启用 Prometheus 内置端点(HAProxy 2.0+):
    haproxy
    frontend prometheus
        bind *:8404
        http-request use-service prometheus-exporter if { path /metrics }

10. 性能调优建议

调优维度建议
内核参数调整 net.core.somaxconnnet.ipv4.ip_local_port_rangenet.ipv4.tcp_tw_reuse
连接超时根据业务设置合理的 timeout client/server,过短影响长连接,过长浪费资源
最大连接数maxconn 根据内存(约 1~2MB/连接)和业务量设定
线程模式HAProxy 2.0+ 支持多线程,通过 nbproccpu-map 绑定 CPU 核心
零拷贝启用 tune.bufsizetune.pipesize 提升大文件传输效率
日志采样高并发时使用 log-sampler 降低日志量,避免 syslog 成为瓶颈

11. 常见问题排查

问题现象可能原因检查方法
后端健康检查失败后端服务未启动/防火墙阻断curl 手工检查健康端点,查看 HAProxy 日志 "Health check failed"
请求 503 错误所有后端均不可用检查 stats 页面服务器状态,检查 default_backend 是否正确
会话频繁丢失Cookie 未正确设置/哈希算法变动确认 cookie 配置或 hash-type consistent
高 CPU 占用日志过多/SSL 握手密集减少日志级别,启用 SSL 会话缓存 ssl.cachesize
连接数耗尽maxconn 设置过低或后端响应慢调大 maxconn,优化后端响应时间

12. 版本升级与维护

  • 版本选择:生产环境建议使用最新 LTS(长期支持)版本,如 2.4 LTS 或 2.6 LTS
  • 平滑重载:使用 haproxy -f /etc/haproxy/haproxy.cfg -sf $(cat /var/run/haproxy.pid) 实现无缝加载新配置
  • 配置检查:每次修改后执行 haproxy -c -f /etc/haproxy/haproxy.cfg 验证语法

13. 企业实践案例

  • DigitalOcean:将 HAProxy 作为其负载均衡即服务(LBaaS)的核心引擎,承载海量云租户流量
  • Microsoft Yammer:运行超过 60,000 个 HAProxy 实例,峰值处理 45 万请求/秒
  • Clover:利用 HAProxy 的权重路由实现"彩虹部署",精准将不同客户流量导向不同版本
  • DoubleVerify:从 F5 硬件迁移至 HAProxy,每日处理数十亿请求,显著降低 TCO

14. 快速参考卡片

操作命令
启动 HAProxyhaproxy -f /etc/haproxy/haproxy.cfg
平滑重载haproxy -f haproxy.cfg -sf $(pidof haproxy)
检查配置语法haproxy -c -f haproxy.cfg
查看统计页面浏览器访问 http://haproxy_ip:8080/stats(需配置 stats)
查看实时连接数echo "show info" | socat /var/run/haproxy.sock -
查看服务器状态echo "show servers state" | socat /var/run/haproxy.sock -
最后更新2026/06/17 16:25
如果你觉得这篇文章有帮助,或者想聊聊技术、工作,欢迎通过下面方式联系我:
contact fishfinal