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 -y1.

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

4.2 rpm 包安装

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

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

4.3 编译安装

  1. 安装依赖包:

sudo yum install gcc openssl-devel pcre-devel systemd-devel1.
  1. 下载 HAProxy 源码包:

wget http://www.haproxy.org/download/2.4/haproxy-2.4.25.tar.gz1.
  1. 解压源码包并进入目录:

tar xf haproxy-2.4.25.tar.gz
cd haproxy-2.4.251.2.
  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.2.3.
  1. 创建配置文件目录:

mkdir /etc/haproxy1.
  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
eof1.2.3.4.5.6.7.8.9.10.11.12.
  1. 启动 HAProxy 服务:

systemctl start haproxy1.
  1. 设置用户和目录权限:

useradd -r -s /sbin/nologin haproxy
systemctl enable --now haproxy1.2.

五、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 check1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.

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 roundrobin1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.

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 leastconn1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.

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 roundrobin1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.

八、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