Appearance
Hello HAProxy
1. 安装与配置
1.1. 创建用户和组
在 Debian 系统上,HAProxy 的安装包通常会自动创建一个名为 haproxy 的用户和组。如果没有自动创建,可以手动创建:
Bash
sudo groupadd -r haproxyBash
sudo useradd -r -g haproxy -s /usr/sbin/nologin haproxyNote:
-r参数指定用户组为系统组,用户为系统用户。
在 HAProxy 的配置文件 /etc/haproxy/haproxy.cfg 中,确保有以下配置:
HAProxy
global
user haproxy
group haproxy1.2. 启用 Linux 内核的 IP 转发功能
如果你的 HAProxy 服务器需要充当网关或路由器(例如在 NAT 模式下运行),则需要启用 Linux 内核的 IP 转发功能,以允许服务器将流量从一个网络接口转发到另一个网络接口。
使用以下命令检查当前 IP 转发是否已启用:
Bash
sysctl net.ipv4.ip_forward可以使用以下命令临时启用 IP 转发(重启后失效):
Bash
sudo sysctl -w net.ipv4.ip_forward=1为了在系统重启后仍然生效,需要修改 /etc/sysctl.conf 文件:
打开文件:
Bashsudo nano /etc/sysctl.conf找到或添加以下行:
Bashnet.ipv4.ip_forward=1保存并退出编辑器。
应用更改:
Bashsudo sysctl -p
1.3. 其他注意事项
如果你的系统启用了 SELinux 或 AppArmor,可能需要调整安全策略以允许 HAProxy 正常运行。
Note:在 Linux 系统中,SELinux(Security-Enhanced Linux)和 AppArmor 是两种常见的安全模块,用于限制进程的权限,增强系统的安全性。如果你的系统启用了 SELinux 或 AppArmor,HAProxy 的配置和运行可能会受到限制,因此需要正确配置这些安全模块。
1.3.1. SELinux
使用以下命令检查 SELinux 的状态:
Bash
sestatus输出示例:
Bash
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing- enabled: SELinux 已启用;
- enforcing: SELinux 处于强制模式(会阻止未经授权的操作);
- permissive: SELinux 处于宽容模式(仅记录违规行为,不会阻止);
- disabled: SELinux 已禁用;
如果 SELinux 导致问题且无法解决,可以永久禁用它(不推荐):
编辑
/etc/selinux/config文件:Bashsudo nano /etc/selinux/config将
SELINUX=enforcing修改为SELINUX=disabled。重启系统。
1.3.2. AppArmor
使用以下命令检查 AppArmor 的状态:
Bash
sudo aa-status输出示例:
Bash
apparmor module is loaded.
22 profiles are loaded.
22 profiles are in enforce mode.
0 profiles are in complain mode.
0 processes have profiles defined.
0 processes are in enforce mode.
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.- enforce mode: AppArmor 处于强制模式(会阻止未经授权的操作);
- complain mode: AppArmor 处于宽容模式(仅记录违规行为,不会阻止);
如果 AppArmor 导致问题且无法解决,可以永久禁用它(不推荐):
停止 AppArmor 服务:
Bashsudo systemctl stop apparmor禁用 AppArmor 服务:
Bashsudo systemctl disable apparmor
2. 配置文件
2.1. 配置文件的位置
HAProxy 的配置文件通常位于 /etc/haproxy/haproxy.cfg。可以通过 -f 参数指定自定义配置文件路径,例如:
Bash
haproxy -f /path/to/custom.cfg2.2. 配置文件的基本结构
2.2.1. 全局配置(Global)
全局配置定义了 HAProxy 进程的全局行为,通常包括:
- 进程管理和性能调优参数;
- 日志配置;
- 用户和组权限;
示例:
HAProxy
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 5000常用参数:
log: 定义日志输出位置和级别;chroot: 将 HAProxy 进程限制在指定目录中,增强安全性;user/group: 指定运行 HAProxy 的用户和组;maxconn: 设置最大连接数;
2.2.2. 默认配置(Defaults)
默认配置定义了 Frontend、Backend 和 Listen 的默认行为,避免重复配置。
示例:
HAProxy
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
retries 3常用参数:
mode: 设置代理模式(http或tcp);timeout: 定义连接、客户端和服务器的超时时间;retries: 设置后端服务器失败后的重试次数;option httplog: 启用 HTTP 日志记录;
2.2.3. 前端配置(Frontend)
前端配置定义了客户端如何连接到 HAProxy,通常包括:
- 监听的 IP 和端口;
- ACL(访问控制列表)规则;
- 将请求转发到后端;
示例:
HAProxy
frontend my_frontend
bind *:80
default_backend my_backend
acl is_static path_beg -i /static
use_backend static_backend if is_static常用参数:
bind: 定义监听的 IP 和端口;default_backend: 指定默认的后端服务器组;acl: 定义访问控制规则;use_backend: 根据 ACL 规则选择后端;
2.2.4. 后端配置(Backend)
后端配置定义了 HAProxy 如何将请求转发到后端服务器,通常包括:
- 后端服务器列表;
- 负载均衡算法;
- 健康检查配置;
示例:
HAProxy
backend my_backend
balance roundrobin
server web1 192.168.1.101:80 check
server web2 192.168.1.102:80 check
server web3 192.168.1.103:80 check
option httpchk GET /health常用参数:
balance: 设置负载均衡算法;roundrobin: 使用轮询算法;leastconn: 使用最少连接算法;source: 使用基于源 IP 的哈希算法;
server: 定义后端服务器,格式为server <name> <ip>:<port> <options>;check: 启用健康检查,健康检查用于检测后端服务器的可用性,确保流量只被转发到健康的服务器;高级健康检查配置示例:
HAProxybackend my_backend balance roundrobin server web1 192.168.1.101:80 check inter 5s rise 2 fall 3 server web2 192.168.1.102:80 check inter 5s rise 2 fall 3说明:
inter 5s: 每 5 秒检查一次;rise 2: 连续 2 次检查成功标记为健康;fall 3: 连续 3 次检查失败标记为不健康;
2.2.5. 监听配置(Listen)
监听配置是 Frontend 和 Backend 的结合,适用于简单的配置场景。
示例:
HAProxy
listen my_listen
bind *:80
mode http
balance roundrobin
server web1 192.168.1.101:80 check
server web2 192.168.1.102:80 check2.2.6. 配置文件示例
以下是一个完整的配置文件示例:
HAProxy
global
log /dev/log local0
log /dev/log local1 notice
user haproxy
group haproxy
daemon
maxconn 5000
defaults
log global
mode http
option httplog
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend my_frontend
bind *:80
default_backend my_backend
backend my_backend
balance roundrobin
server web1 192.168.1.101:80 check
server web2 192.168.1.102:80 check
server web3 192.168.1.103:80 check2.3. 配置文件验证
Bash
haproxy -c -f /etc/haproxy/haproxy.cfg3. 日志管理
HAProxy 支持详细的日志记录,可以通过配置日志输出位置和级别来监控流量和调试问题。
示例:
HAProxy
global
log /dev/log local0 info
log /dev/log local1 notice
defaults
log global
option httplog
option dontlognull说明:
log /dev/log local0 info: 将日志输出到/dev/log,使用local0设备,日志级别为info;option httplog: 启用 HTTP 日志记录;option dontlognull: 不记录空请求;
日志级别:
emerg: 紧急情况;alert: 需要立即处理的情况;crit: 关键错误;err: 一般错误;warning: 警告;notice: 重要事件;info: 一般信息;debug: 调试信息;
在上述示例日志配置中,local0 和 local1 是系统日志设施(Syslog Facility)的一部分。它们是 Syslog 协议中定义的日志分类标识符,用于将日志消息分类并发送到不同的日志设备或文件中。
Note:Syslog Facility
Syslog 是一种标准的日志记录协议,用于在 Unix/Linux 系统中收集和存储日志消息。为了区分不同类型的日志,Syslog 定义了多个设施(Facility),每个设施对应一种特定的日志类型。常见的设施包括:
auth: 认证相关的日志;cron: 计划任务相关的日志;daemon: 系统守护进程的日志;local0到local7: 用户自定义的日志设施,通常用于应用程序的日志;
local0到local7是专门为应用程序预留的设施,HAProxy 可以使用它们来分类和存储日志。
3.1. 日志轮转
为了防止日志文件过大,可以配置日志轮转工具(如 logrotate)来管理 HAProxy 的日志。
示例配置:
创建
/etc/logrotate.d/haproxy文件:Bashsudo nano /etc/logrotate.d/haproxy添加以下内容:
Text/var/log/haproxy.log { daily rotate 7 missingok notifempty compress delaycompress sharedscripts postrotate systemctl reload haproxy endscript }保存并退出。
4. 多线程和多进程模式
4.1. 多线程模式
多线程模式允许 HAProxy 在单个进程中创建多个线程,每个线程可以独立处理客户端请求。这种方式可以充分利用多核 CPU 的性能。
在 HAProxy 的全局配置(global 部分)中,使用 nbthread 参数指定线程数:
HAProxy
global
nbthread 4nbthread 4 表示 HAProxy 将使用 4 个线程。
4.2. 多进程模式
多进程模式允许 HAProxy 启动多个独立的进程,每个进程可以绑定到不同的 CPU 核心。这种方式可以进一步提高性能和隔离性。
在 HAProxy 的全局配置(global 部分)中,使用 nbproc 参数指定进程数:
HAProxy
global
nbproc 4nbproc 4 表示 HAProxy 将启动 4 个进程。
4.3. 多线程与多进程的结合
在某些场景下,可以结合使用多线程和多进程模式,以充分利用系统资源。
4.4. CPU 绑定(CPU Affinity)
为了进一步提高性能,可以将 HAProxy 的进程或线程绑定到特定的 CPU 核心。
在 HAProxy 的全局配置中,使用 cpu-map 参数绑定进程或线程到 CPU 核心:
HAProxy
global
nbproc 4
cpu-map 1 0
cpu-map 2 1
cpu-map 3 2
cpu-map 4 3cpu-map 1 0表示将进程 1 绑定到 CPU 核心 0;cpu-map 2 1表示将进程 2 绑定到 CPU 核心 1;
绑定 CPU 核心可以减少进程或线程的上下文切换,提高性能。避免多个进程或线程竞争同一个 CPU 核心。不过绑定 CPU 核心后,进程或线程无法动态迁移到其他核心。
性能调优建议:
- 根据服务器的 CPU 核心数设置
nbproc和nbthread; - 多进程模式会消耗更多内存,确保服务器有足够的内存资源;
- 使用工具(如
htop、top)监控 HAProxy 的 CPU 和内存使用情况; - 进行压力测试,调整进程和线程数以找到最佳配置;
5. Keepalived
HAProxy 虽然实现了负载均衡,但是假如只是部署一个 HAProxy,那么其本身也存在宕机的风险。一旦 HAProxy 宕机,那么就会导致整个集群不可用,所以我们也需要对 HAProxy 也实现集群,那么假如 HAProxy 也实现了集群,客户端应该连接哪一台服务呢?问题似乎又回到了起点,陷入了无限循环中……
为了实现 HAProxy 的高可用,需要再引入一个 Keepalived 组件,Keepalived 组件主要有以下特性:
具有负载功能,可以监控集群中的节点状态,如果集群中某一个节点宕机,可以实现故障转移。
其本身也可以实现集群,但是只能有一个
master节点。master节点会对外提供一个虚拟 IP,应用端只需要连接这一个 IP 就行了。可以理解为集群中的 HAProxy 节点会同时争抢这个虚拟 IP,哪个节点争抢到,就由哪个节点来提供服务。
Note:VRRP 协议
VRRP 协议即虚拟路由冗余协议(Virtual Router Redundancy Protocol)。Keepalived 中提供的虚拟 IP 机制就属于 VRRP,它是为了避免路由器出现单点故障的一种容错协议。