@HAProxy 介绍部署使用
文章目录
- **1. HAProxy 简介**
- **1.1 什么是 HAProxy?**
- **1.2 核心特性**
- **1.3 关键术语**
- **2. 安装 HAProxy**
- **2.1 在 Ubuntu/Debian 上安装**
- **2.2 在 CentOS/RHEL/Rocky Linux/AlmaLinux 上安装**
- **3. 配置与使用**
- **3.1 核心配置文件结构**
- **3.2 基础配置示例:HTTP负载均衡**
- **3.3 进阶配置:基于URL路径的分流(ACL)**
- **3.4 配置SSL终止**
- **4. 日常操作与监控**
- **4.1 服务管理**
- **4.2 日志**
- **4.3 使用Socket进行运行时管理**
- **5. 故障排除**
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: 为后续的
frontend
和backend
块提供默认值。 - frontend: 定义如何接收客户端请求。
- backend: 定义将请求转发到哪些服务器。
- listen: 将
frontend
和backend
功能结合在一起的简化配置块。
3.2 基础配置示例:HTTP负载均衡
让我们配置一个最简单的HTTP负载均衡器,将80端口的流量轮询分发到两个Web服务器。
-
备份原始配置
sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup
-
编辑配置文件
sudo vim /etc/haproxy/haproxy.cfg
-
清空文件并写入以下内容
globallog /dev/log local0 # 使用本地syslog的local0设备记录日志maxconn 4000 # 每个进程的最大连接数user haproxy # 运行进程的用户和组group haproxydaemon # 以守护进程方式运行defaultsmode http # 默认模式为HTTPlog global # 继承global中的日志设置option httplog # 记录详细的HTTP日志option dontlognull # 不记录空连接timeout connect 5000ms # 连接后端服务器的超时时间timeout client 50000ms # 客户端不活动超时时间timeout server 50000ms # 后端服务器响应超时时间# 定义一个前端,监听80端口 frontend http_frontbind *:80 # 监听所有IPv4地址的80端口default_backend http_back # 默认将所有流量转发到‘http_back’后端# 定义后端服务器组 backend http_backbalance roundrobin # 使用轮询算法server web1 192.168.1.10:80 check # 'check'启用健康检查server web2 192.168.1.11:80 check# 可选:状态监控页面 listen statsbind *:8404 # 监听8404端口用于状态页面stats uri /haproxy?stats # 访问状态页面的URIstats realm Haproxy\ Statistics # 认证域提示stats auth admin:password # 认证用户名和密码stats admin if TRUE # 如果通过认证,允许管理操作(如禁用服务器)
-
语法检查
HAProxy非常严格,配置错误会导致启动失败。务必在重启前检查语法。sudo haproxy -f /etc/haproxy/haproxy.cfg -c
输出
Configuration file is valid
表示成功。 -
重启HAProxy服务
sudo systemctl restart haproxy
-
验证
- 访问你的服务器IP(
http://your-haproxy-ip
),流量会被分发到web1和web2。 - 访问状态页面(
http://your-haproxy-ip:8404/haproxy?stats
),用配置的用户名(admin
)和密码(password
)登录,查看后端服务器状态和统计信息。
- 访问你的服务器IP(
3.3 进阶配置:基于URL路径的分流(ACL)
假设你想将 /api
的请求发送到一组API服务器,其他请求发送到Web服务器。
在 frontend http_front
部分中添加ACL规则:
frontend http_frontbind *: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_backbackend web_backbalance roundrobinserver web1 192.168.1.10:80 checkserver web2 192.168.1.11:80 checkbackend api_backbalance roundrobinserver api1 192.168.1.20:8080 checkserver api2 192.168.1.21:8080 check
重载配置(不中断服务)
sudo systemctl reload haproxy
# 或者
sudo haproxy -f /etc/haproxy/haproxy.cfg -sf $(pidof haproxy)
3.4 配置SSL终止
-
将你的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
-
修改前端配置
frontend https_frontbind *: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。
- 编辑
/etc/rsyslog.d/99-haproxy.conf
local0.* /var/log/haproxy.log
- 重启rsyslog和haproxy
sudo systemctl restart rsyslog sudo systemctl restart haproxy
- 查看日志
tail -f /var/log/haproxy.log
4.3 使用Socket进行运行时管理
配置文件中的 stats socket
选项启用了强大的运行时管理功能。
-
在
global
部分添加:global...stats socket /run/haproxy/admin.sock mode 660 level admin
-
使用
socat
或haproxy-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. 故障排除
- 配置文件语法检查:
sudo haproxy -f /etc/haproxy/haproxy.cfg -c
- 查看系统日志:
journalctl -u haproxy
- 查看HAProxy日志:
tail -f /var/log/haproxy.log
- 检查端口监听状态:
ss -tlnp | grep haproxy
- 检查防火墙规则:
sudo iptables -L -n
或sudo firewall-cmd --list-all
HAProxy是一个强大而灵活的工具,是构建现代、高可用性应用架构的基石。本SOP提供了从入门到进阶的指导。要掌握HAProxy,请务必阅读其官方文档(https://www.haproxy.org/),其中包含了所有配置指令的详细说明和更多高级用例。
安全提示: 在生产环境中,请务必使用强密码保护状态页面,并谨慎管理Socket接口的访问权限。