Bootstrap

HAProxy 负载均衡指南

一、HAProxy 简介


HAProxy (High Availability Proxy) 是一款高性能、开源的负载均衡器和代理服务器。它以其高并发处理能力、灵活的配置选项和强大的功能而闻名,广泛应用于各种 Web 服务场景,如:

  • 负载均衡: 将流量分配到多个后端服务器,提高系统可用性和性能。

  • 反向代理: 隐藏真实服务器,提供安全防护、缓存内容等功能。

  • SSL/TLS 终止:  处理 HTTPS 请求,提高网站安全性。

  • Web 性能优化:  提供缓存、压缩等功能,提升网站访问速度。

二、HAProxy 的优势

  • 高性能:  HAProxy 采用异步事件驱动架构,能够高效处理大量并发连接。

  • 可靠性:  HAProxy 提供多种机制保证服务的持续可用性,如健康检查、故障转移等。

  • 灵活配置:  支持丰富的配置选项,可以根据需求定制各种功能。

  • 模块化:  HAProxy 支持多种模块扩展,如 HTTP、TCP、SSL/TLS 等。

  • 简单易用:  HAProxy 的配置语法简洁,易于上手。

三、HAProxy 与其他负载均衡软件的比较

软件特点优势劣势
LVS (Linux Virtual Server)基于 Linux 内核实现性能高,功能简单只能提供四层负载均衡,无法实现七层功能
Nginx基于第三方应用实现功能丰富,可作为 Web 服务器性能低于 LVS,健康检查功能不强
HAProxy基于第三方应用实现性能优越,功能强大,专注于代理和负载均衡功能相对单一

四、HAProxy 安装

4.1 yum 安装
sudo yum install haproxy -y

注意: yum 安装的 HAProxy 版本可能比较旧,建议使用编译安装方式获取最新版本。

4.2 rpm 包安装

从第三方网站下载 rpm 包进行安装,例如:pkgs.org/download/haproxy

注意:  下载 rpm 包时,请务必选择可靠的来源,并注意版本兼容性。

4.3 编译安装
  1. 安装依赖包:
sudo yum install gcc openssl-devel pcre-devel systemd-devel

  1. 下载 HAProxy 源码包:
wget http://www.haproxy.org/download/2.4/haproxy-2.4.25.tar.gz

  1. 解压源码包并进入目录:
tar xf haproxy-2.4.25.tar.gz
cd haproxy-2.4.25

  1. 编译安装:
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1
make install PREFIX=/apps/haproxy
ln -s /apps/haproxy/sbin/haproxy /usr/sbin/

  1. 创建配置文件目录:
mkdir /etc/haproxy

  1. 创建 HAProxy 服务文件:
tee /usr/lib/systemd/system/haproxy.service <<eof
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
eof

  1. 启动 HAProxy 服务:
systemctl start haproxy

  1. 设置用户和目录权限:
useradd -r -s /sbin/nologin haproxy
systemctl enable --now haproxy

五、HAProxy 配置文件

5.1 配置文件结构

HAProxy 配置文件通常位于 /etc/haproxy/haproxy.cfg,由两部分组成:

  1. global 全局配置:  配置影响 HAProxy 全局的指令,如最大连接数、进程数、日志等。

  2. proxy 代理段配置:  定义代理服务器、后端服务器组、调度算法等。

5.2 常用配置指令
5.2.1 global 全局配置
  • maxconn <数量>:  设置 HAProxy 最大连接数。

  • chroot <路径>:  设置 HAProxy 的 chroot 环境,限制其访问权限。

  • stats socket <路径>:  设置 HAProxy 状态页的 socket 文件路径。

  • uid <用户 ID>:  设置 HAProxy 运行的 UID。

  • gid <用户组 ID>:  设置 HAProxy 运行的 GID。

  • daemon:  设置 HAProxy 作为守护进程运行。

  • nbproc <数量>:  设置 HAProxy 进程数量,建议与 CPU 核心数一致。

  • cpu-map <进程号> <CPU 核心号>:  绑定 HAProxy 进程到特定 CPU 核心。

  • pidfile <路径>:  设置 HAProxy 进程 ID 文件路径。

  • log <地址> <设施> <级别>:  设置 HAProxy 日志记录。

5.2.2 defaults 默认配置
  • option http-keep-alive:  开启 HTTP Keep-Alive 功能。

  • option forwardfor:  设置 X-Forwarded-For 请求头。

  • maxconn <数量>:  设置每个代理段的最大连接数。

  • mode <模式>:  设置代理模式,如 http、tcp 等。

  • timeout connect <时间>:  设置连接超时时间。

  • timeout client <时间>:  设置客户端超时时间。

  • timeout server <时间>:  设置服务器超时时间。

5.2.3 frontend 前端配置
  • bind <地址>:<端口>:  设置监听的地址和端口。

  • mode <模式>:  设置代理模式,如 http、tcp 等。

  • default_backend <后端名称>:  设置默认的后端服务器组。

  • option httplog:  开启 HTTP 日志记录。

  • option httpclose:  关闭 HTTP Keep-Alive 功能。

  • http-request set-header <请求头名> <值>:  设置请求头信息。

5.2.4 backend 后端配置
  • server <服务器名称> <地址>:<端口> [选项]:定义后端服务器。

  • balance <算法>:  设置调度算法。

  • option httpchk:  开启 HTTP 健康检查。

  • option ssl-hello-chk:  开启 SSL 健康检查。

  • check inter <时间>:  设置健康检查间隔时间。

  • check fall <次数>:  设置连续失败次数。

  • check rise <次数>:  设置连续成功次数。

  • weight <权重>:  设置服务器权重。

  • backup:  标记服务器为备份服务器。

  • disabled:  标记服务器为不可用状态。

  • maxconn <数量>:  设置每个服务器的最大连接数。

六、HAProxy 调度算法

HAProxy 支持多种调度算法,主要分为静态算法和动态算法:

6.1 静态调度算法
  • roundrobin (rr): 轮询调度,将请求依次分配给每个服务器。

  • static-rr:  基于权重的轮询调度,可以为每个服务器设置权重,权重越大,分配的请求越多。

  • first:  优先调度第一个服务器,只有当第一个服务器达到最大连接数时,才会分配给其他服务器。

6.2 动态调度算法
  • leastconn (lc):  最小连接调度,将请求分配给当前连接数最少的服务器。

  • roundrobin (rr):  动态轮询调度,根据服务器的负载情况动态调整权重,优先调度负载较低的服务器。

  • source:  源地址哈希调度,将来自相同源 IP 地址的请求分配到同一台服务器。

  • uri:  URI 哈希调度,将访问相同 URI 的请求分配到同一台服务器。

  • url_param:  URL 参数哈希调度,将访问相同 URL 参数的请求分配到同一台服务器。

  • hdr(name):  HTTP 请求头哈希调度,将访问相同 HTTP 请求头的请求分配到同一台服务器。

  • random:  随机调度,随机选择一台服务器处理请求。

七、HAProxy 配置示例

7.1 基本的 HTTP 配置
global
    log 127.0.0.1 local0 info
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    option http-server-close
    option forwardfor
    option httpchk
    timeout connect 5000
    timeout client 50000
    timeout server 50000

frontend http-in
    bind *:80
    default_backend servers

backend servers
    server server1 192.168.1.100:80 check
    server server2 192.168.1.101:80 check

7.2 反向代理配置
global
    log 127.0.0.1 local0 info
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    option http-server-close
    option forwardfor
    option httpchk
    timeout connect 5000
    timeout client 50000
    timeout server 50000

frontend http-in
    bind *:80
    default_backend servers

backend servers
    server server1 192.168.1.100:8080 check
    server server2 192.168.1.101:8080 check

    balance roundrobin

7.3 负载均衡配置
global
    log 127.0.0.1 local0 info
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    option http-server-close
    option forwardfor
    option httpchk
    timeout connect 5000
    timeout client 50000
    timeout server 50000

frontend http-in
    bind *:80
    default_backend servers

backend servers
    server server1 192.168.1.100:8080 check weight=2
    server server2 192.168.1.101:8080 check

    balance leastconn

7.4 HTTPS 配置
global
    log 127.0.0.1 local0 info
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    option http-server-close
    option forwardfor
    option httpchk
    timeout connect 5000
    timeout client 50000
    timeout server 50000

frontend https-in
    bind *:443 ssl crt /etc/haproxy/ssl/certificate.pem key /etc/haproxy/ssl/private.key
    default_backend servers

backend servers
    server server1 192.168.1.100:8080 check
    server server2 192.168.1.101:8080 check

    balance roundrobin

八、HAProxy 性能优化

  • 调整进程数:nbproc 设置为 CPU 核心数,提高 CPU 利用率。

  • 优化缓冲区大小:  根据实际情况调整缓冲区大小,减少磁盘 I/O 操作。

  • 启用压缩:  启用 gzip 压缩,减少网络传输量。

  • 使用缓存:  启用缓存功能,减少服务器负载。

  • 优化日志级别:  降低日志级别,减少磁盘 I/O 操作。

九、HAProxy 安全配置

  • 限制请求速率:  防止恶意流量攻击,可以通过设置限制请求速率来保护服务器。

  • 使用 HTTPS:  HTTPS 协议可以加密数据传输,提高网站安全性。

  • 设置访问控制:  可以通过设置 IP 白名单或黑名单来限制特定 IP 地址的访问。

十、HAProxy 常见问题与解决方案

  • HAProxy 无法启动:  检查配置文件语法错误、端口冲突、权限问题等。

  • 后端服务器健康检查失败:  检查后端服务器是否正常运行、健康检查配置是否正确等。

  • HAProxy 负载过高:  优化 HAProxy 配置、升级服务器硬件配置、使用负载均衡技术等。

十一、HAProxy 模块

HAProxy 支持多种模块扩展,如:

  • HTTP 模块:  提供 HTTP 协议相关的功能。

  • TCP 模块:  提供 TCP 协议相关的功能。

  • SSL/TLS 模块:  提供 SSL/TLS 协议相关的功能。

  • ACL 模块:  提供访问控制列表功能。

  • 日志模块:  提供日志记录功能。

十二、总结

本文档提供了一个全面的 HAProxy 配置指南,涵盖了从基础概念到高级应用的各个方面。希望这份指南能够帮助您更好地理解和使用 HAProxy,构建高性能、安全可靠的 Web 服务。

附录:

  • HAProxy 官方网站:http://www.haproxy.org/

  • HAProxy 文档:http://www.haproxy.org/download/2.4/doc/configuration.txt

  • HAProxy 模块:http://www.haproxy.org/download/2.4/doc/modules.txt

;