@HAProxy 介绍&部署&使用

发布于:2025-08-29 ⋅ 阅读:(13) ⋅ 点赞:(0)

1. HAProxy 简介

1.1 什么是 HAProxy?

HAProxy(High Availability Proxy)是一个开源、高性能的TCP/HTTP 负载均衡器代理服务器。它被广泛用于将网络流量分发到多个后端服务器(如Web服务器、数据库服务器),以此提高应用程序的可用性、可靠性和可扩展性。

1.2 核心特性
  • 高性能: 采用事件驱动、单线程模型(非阻塞I/O),即使在极高并发连接下也能保持极低的资源消耗。
  • TCP & HTTP 支持: 既可以在第4层(传输层,TCP)进行负载均衡,也可以在第7层(应用层,HTTP)进行更智能的流量分发。
  • 健康检查: 持续监控后端服务器的健康状况,自动从集群中移除故障服务器,并在其恢复后重新加入。
  • 会话保持: 支持多种方式(如Cookie插入)将特定客户端的请求始终转发到同一台后端服务器。
  • SSL/TLS 终止: 可以在HAProxy处解密HTTPS流量,然后将明文的HTTP请求转发给后端服务器,减轻后端服务器的计算压力。
  • 精细的日志记录: 提供详细的日志,便于监控和故障排除。
  • 动态配置: 支持运行时通过Socket API动态更新部分配置,而无需重启服务,避免连接中断。
  • 高可用性: 常与Keepalived等工具结合,实现HAProxy自身的主动-被动高可用集群。
1.3 关键术语
  • 前端(Frontend): 定义HAProxy监听的IP地址、端口以及如何处理传入的客户端请求。
  • 后端(Backend): 定义一组接收流量的后端服务器(称为“Server”或“Backend Server”)以及使用的负载均衡算法。
  • 监听器(Listener): 前端中具体的IP:端口绑定。
  • 服务器(Server): 后端集群中一个具体的、提供服务的实例(如 192.168.1.10:8080)。
  • 负载均衡算法: 决定如何选择后端服务器的规则,常见的有 roundrobin(轮询)、leastconn(最小连接数)、source(源IP哈希)等。
  • ACL(访问控制列表): 用于对请求进行条件测试(如匹配URL路径、主机头),从而做出更智能的转发决策。
  • Stick Table: 用于跟踪和存储客户端会话信息,实现会话保持。

2. 安装 HAProxy

以下是在主流Linux发行版上的安装步骤。

2.1 在 Ubuntu/Debian 上安装
# 1. 更新软件包列表
sudo apt update

# 2. 安装 HAProxy
sudo apt install -y haproxy

# 3. 验证安装版本
haproxy -v

# 4. 启动服务并设置为开机自启 (安装后默认未启动)
sudo systemctl enable --now haproxy

# 5. 检查服务状态
sudo systemctl status haproxy
2.2 在 CentOS/RHEL/Rocky Linux/AlmaLinux 上安装

对于较老的CentOS/RHEL 7/8,默认仓库的版本可能较旧。建议启用EPEL仓库。

# CentOS/RHEL 7/8/9 (启用EPEL)
sudo yum install -y epel-release

# 或者 Rocky Linux/AlmaLinux 9
sudo dnf install -y epel-release

# 安装 HAProxy
sudo yum install -y haproxy  # CentOS 7/8
# 或者
sudo dnf install -y haproxy  # CentOS/Rocky/AlmaLinux 9

# 启动并启用服务
sudo systemctl enable --now haproxy
sudo systemctl status haproxy

注意: 如果需要最新版本,通常需要从官方源码编译或使用第三方仓库(如Software Collections)。


3. 配置与使用

3.1 核心配置文件结构

HAProxy的主配置文件通常是 /etc/haproxy/haproxy.cfg。它主要分为以下几个部分:

  • global: 全局设置,如进程、安全、性能调优参数。
  • defaults: 为后续的 frontendbackend 块提供默认值。
  • frontend: 定义如何接收客户端请求。
  • backend: 定义将请求转发到哪些服务器。
  • listen:frontendbackend 功能结合在一起的简化配置块。
3.2 基础配置示例:HTTP负载均衡

让我们配置一个最简单的HTTP负载均衡器,将80端口的流量轮询分发到两个Web服务器。

  1. 备份原始配置

    sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup
    
  2. 编辑配置文件

    sudo vim /etc/haproxy/haproxy.cfg
    
  3. 清空文件并写入以下内容

    global
        log /dev/log local0   # 使用本地syslog的local0设备记录日志
        maxconn 4000          # 每个进程的最大连接数
        user haproxy          # 运行进程的用户和组
        group haproxy
        daemon                # 以守护进程方式运行
    
    defaults
        mode http             # 默认模式为HTTP
        log global            # 继承global中的日志设置
        option httplog        # 记录详细的HTTP日志
        option dontlognull    # 不记录空连接
        timeout connect 5000ms # 连接后端服务器的超时时间
        timeout client 50000ms # 客户端不活动超时时间
        timeout server 50000ms # 后端服务器响应超时时间
    
    # 定义一个前端,监听80端口
    frontend http_front
        bind *:80             # 监听所有IPv4地址的80端口
        default_backend http_back # 默认将所有流量转发到‘http_back’后端
    
    # 定义后端服务器组
    backend http_back
        balance roundrobin    # 使用轮询算法
        server web1 192.168.1.10:80 check  # 'check'启用健康检查
        server web2 192.168.1.11:80 check
    
    # 可选:状态监控页面
    listen stats
        bind *:8404           # 监听8404端口用于状态页面
        stats uri /haproxy?stats  # 访问状态页面的URI
        stats realm Haproxy\ Statistics  # 认证域提示
        stats auth admin:password  # 认证用户名和密码
        stats admin if TRUE    # 如果通过认证,允许管理操作(如禁用服务器)
    
  4. 语法检查
    HAProxy非常严格,配置错误会导致启动失败。务必在重启前检查语法。

    sudo haproxy -f /etc/haproxy/haproxy.cfg -c
    

    输出 Configuration file is valid 表示成功。

  5. 重启HAProxy服务

    sudo systemctl restart haproxy
    
  6. 验证

    • 访问你的服务器IP(http://your-haproxy-ip),流量会被分发到web1和web2。
    • 访问状态页面(http://your-haproxy-ip:8404/haproxy?stats),用配置的用户名(admin)和密码(password)登录,查看后端服务器状态和统计信息。
3.3 进阶配置:基于URL路径的分流(ACL)

假设你想将 /api 的请求发送到一组API服务器,其他请求发送到Web服务器。

frontend http_front 部分中添加ACL规则:

frontend http_front
    bind *:80
    # 定义一个ACL规则,匹配路径以/api开头
    acl is_api path_beg /api
    # 如果匹配is_api规则,使用api_back后端
    use_backend api_back if is_api
    # 默认使用web_back后端
    default_backend web_back

backend web_back
    balance roundrobin
    server web1 192.168.1.10:80 check
    server web2 192.168.1.11:80 check

backend api_back
    balance roundrobin
    server api1 192.168.1.20:8080 check
    server api2 192.168.1.21:8080 check

重载配置(不中断服务)

sudo systemctl reload haproxy
# 或者
sudo haproxy -f /etc/haproxy/haproxy.cfg -sf $(pidof haproxy)
3.4 配置SSL终止
  1. 将你的SSL证书(PEM格式)合并。 通常需要将证书文件、中间证书和私钥合并到一个.pem文件中。

    cat yourdomain.crt yourdomain.key > /etc/haproxy/yourdomain.pem
    chmod 600 /etc/haproxy/yourdomain.pem
    chown haproxy:haproxy /etc/haproxy/yourdomain.pem
    
  2. 修改前端配置

    frontend https_front
        bind *:443 ssl crt /etc/haproxy/yourdomain.pem
        # 可选:强制重定向HTTP到HTTPS
        # redirect scheme https code 301 if !{ ssl_fc }
        default_backend http_back
    

4. 日常操作与监控

4.1 服务管理
# 启动
sudo systemctl start haproxy
# 停止
sudo systemctl stop haproxy
# 重启 (会中断连接)
sudo systemctl restart haproxy
# 重载配置 (平滑重启,不中断连接)
sudo systemctl reload haproxy
# 查看状态
sudo systemctl status haproxy
4.2 日志

HAProxy日志默认不输出到文件。需要配置rsyslog。

  1. 编辑 /etc/rsyslog.d/99-haproxy.conf
    local0.* /var/log/haproxy.log
    
  2. 重启rsyslog和haproxy
    sudo systemctl restart rsyslog
    sudo systemctl restart haproxy
    
  3. 查看日志
    tail -f /var/log/haproxy.log
    
4.3 使用Socket进行运行时管理

配置文件中的 stats socket 选项启用了强大的运行时管理功能。

  1. global 部分添加:

    global
        ...
        stats socket /run/haproxy/admin.sock mode 660 level admin
    
  2. 使用 socathaproxy-apt 工具管理

    # 查看帮助
    echo "help" | sudo socat stdio /run/haproxy/admin.sock
    # 禁用后端服务器
    echo "disable server http_back/web1" | sudo socat stdio /run/haproxy/admin.sock
    # 启用后端服务器
    echo "enable server http_back/web1" | sudo socat stdio /run/haproxy/admin.sock
    # 显示状态信息
    echo "show info" | sudo socat stdio /run/haproxy/admin.sock
    echo "show stat" | sudo socat stdio /run/haproxy/admin.sock
    

5. 故障排除

  1. 配置文件语法检查: sudo haproxy -f /etc/haproxy/haproxy.cfg -c
  2. 查看系统日志: journalctl -u haproxy
  3. 查看HAProxy日志: tail -f /var/log/haproxy.log
  4. 检查端口监听状态: ss -tlnp | grep haproxy
  5. 检查防火墙规则: sudo iptables -L -nsudo firewall-cmd --list-all

HAProxy是一个强大而灵活的工具,是构建现代、高可用性应用架构的基石。本SOP提供了从入门到进阶的指导。要掌握HAProxy,请务必阅读其官方文档(https://www.haproxy.org/),其中包含了所有配置指令的详细说明和更多高级用例。

安全提示: 在生产环境中,请务必使用强密码保护状态页面,并谨慎管理Socket接口的访问权限。


网站公告

今日签到

点亮在社区的每一天
去签到