一、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 编译安装
- 安装依赖包:
sudo yum install gcc openssl-devel pcre-devel systemd-devel
- 下载 HAProxy 源码包:
wget http://www.haproxy.org/download/2.4/haproxy-2.4.25.tar.gz
- 解压源码包并进入目录:
tar xf haproxy-2.4.25.tar.gz
cd haproxy-2.4.25
- 编译安装:
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/
- 创建配置文件目录:
mkdir /etc/haproxy
- 创建 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
- 启动 HAProxy 服务:
systemctl start haproxy
- 设置用户和目录权限:
useradd -r -s /sbin/nologin haproxy
systemctl enable --now haproxy
五、HAProxy 配置文件
5.1 配置文件结构
HAProxy 配置文件通常位于 /etc/haproxy/haproxy.cfg
,由两部分组成:
-
global 全局配置: 配置影响 HAProxy 全局的指令,如最大连接数、进程数、日志等。
-
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