Haproxy服务介绍
haproxy
- 搭建使用
- 开启HAProxy的界面UI
- 配置负载均衡
- 配置web代理
HAProxy(High Availability Proxy)是一个高性能的TCP/HTTP负载均衡器和代理服务器,广泛用于提升Web应用的可用性和性能。
官网
功能和特点:
负载均衡:
- 支持多种负载均衡算法,例如轮询(Round Robin)、最少连接(Least Connections)、源地址散列(Source IP Hashing)等。
- 支持会话保持(Session Persistence),可以根据用户的会话信息将请求分配给同一个服务器。
高可用性:
- 支持健康检查(Health Checks),定期检测后端服务器的状态,自动将故障服务器从负载均衡池中移除。
- 支持主备模式(Active-Backup),可以在主服务器故障时自动切换到备用服务器。
性能优化:
- 高效的资源管理和事件处理机制,能够处理大量并发连接。
- 支持连接池和连接复用,减少连接建立和关闭的开销。
安全性:
- 提供SSL/TLS终止和加速功能,减少后端服务器的加密负担。
- 支持访问控制列表(ACL)和自定义的安全策略,保护应用免受恶意攻击。
灵活的配置:
- 配置文件简单且强大,支持复杂的路由和流量管理规则。
- 支持热加载配置,允许在不中断服务的情况下修改配置。
监控和统计:
- 提供详细的监控和统计信息,帮助管理员了解服务器的负载情况和运行状态。
- 支持多种日志格式和集成外部监控工具。
HAProxy 的工作原理
- HAProxy 是一个事件驱动的非阻塞引擎,结合了非常快速的 I/O 层使用基于优先级的多线程调度程序。由于它设计有数据考虑到转发目标,其架构经过优化,可以尽可能快地移动数据尽可能少的操作。它专注于优化 CPU通过尽可能长时间地保持与同一个 CPU 的连接来提高缓存的效率。因此,它实现了分层模型,在每个级别都提供了旁路机制确保数据不会在需要时到达更高层。大部分处理
在内核中执行,HAProxy 尽力帮助内核执行通过给出一些提示或避免某些操作来尽可能快地工作
当它猜测它们稍后可能会被分组时。因此,典型的数字显示15% 的处理时间花在 HAProxy 上,而 85% 的处理时间花在内核的 TCP 或HTTP 关闭模式,HAProxy 约占 30%,而 HTTP 模式下内核约占 70%保持活动模式。
搭建使用
实验环境Ubuntu2404
安装下载
aptinstall-yhaproxysystemctlenable--nowhaproxy如果要指定版本下载可参考官网
- /etc/haproxy/haproxy.cfg主配文件的全局参数说明
# 全局配置部分,对整个 HAProxy 进程生效global# 将日志信息发送到 /dev/log 设备文件,使用 local0 日志设施log /dev/log local0# 将日志信息发送到 /dev/log 设备文件,使用 local1 日志设施,仅记录 notice 及更高级别的日志log /dev/log local1 notice# 使用 chroot 机制,将 HAProxy 的运行根目录限制在 /var/lib/haproxy,增强安全性chroot/var/lib/haproxy# 创建一个用于获取 HAProxy 统计信息的 UNIX 域套接字,路径为 /var/lib/haproxy/stats# 权限模式为 660(属主和属组有读写权限),需要 admin 级别权限访问stats socket /var/lib/haproxy/stats mode660level admin# 设置连接到统计套接字获取信息的超时时间为 30 秒statstimeout30s# 指定 HAProxy 进程运行时使用的用户为 haproxyuser haproxy# 指定 HAProxy 进程运行时使用的组为 haproxygroup haproxy# 让 HAProxy 以守护进程的方式在后台运行daemon# 设置 HAProxy 所能接受的最大并发连接数为 4000maxconn4000# 针对 SSL/TLS 配置,设置默认的 Diffie-Hellman 参数大小为 2048 位,增强安全性tune.ssl.default-dh-param2048# 默认配置部分,为后续的前端、后端等配置提供默认设置defaults# 继承 global 部分定义的日志配置log global# 设置 HAProxy 的工作模式为 TCP 模式,适用于基于 TCP 的流量转发mode tcp# 启用 TCP 模式下详细的日志记录功能option tcplog# 不记录空连接的日志信息,减少不必要的日志量option dontlognull# 设置 HAProxy 尝试连接后端服务器的超时时间为 5 秒timeoutconnect 5s# 设置客户端连接的超时时间为 50 秒timeoutclient 50s# 设置与后端服务器交互的超时时间为 50 秒timeoutserver 50s# 当 HAProxy 将客户端请求转发到后端服务器出现故障时,最多重试 3 次retries3开启HAProxy的界面UI
cat>>/etc/haproxy/haproxy.cfg<<eof global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /var/lib/haproxy/stats mode 660 level admin stats timeout 30s user haproxy group haproxy daemon maxconn 4000 tune.ssl.default-dh-param 2048 defaults log global mode tcp option tcplog option dontlognull timeout connect 5s timeout client 50s timeout server 50s retries 3 listen stats bind *:8080 stats enable stats uri /huhy stats refresh 10s stats auth admin:123456 stats admin if TRUE eof参数含义
- bind *:8080:监听8080端口。
- stats enable:启用统计页面。
- stats uri /haproxy?stats:访问统计页面的URI(在本例中为http://<你的服务器IP>:8080/haproxy?stats)。
- stats refresh 10s:每10秒刷新一次页面。
- stats auth admin:adminpassword:设置访问统计页面的认证信息,用户名为admin,密码为123456。
- stats admin if TRUE:启用管理功能。
systemctl restart haproxy界面访问:IP:8080/huhy
监听页面参数含义
Queue(队列)
Cur: 当前队列中的请求数
Max: 历史最大队列长度
Limit: 队列大小限制Session rate(会话率)
Cur: 当前每秒新建会话数
Max: 历史最大每秒会话数
Limit: 会话率限制Sessions(会话)
Cur: 当前活跃会话数
Max: 历史最大并发会话数
Limit: 最大会话数限制
Total: 总会话数 - 从启动至今处理的所有会话总数
LbTot: 负载均衡会话数 - 通过负载均衡算法分配的总会话数
Last: 最后会话时间 - 距离最后一个新会话建立的时间Bytes(字节流量)
In: 输入字节数(客户端→HAProxy)
Out: 输出字节数(HAProxy→客户端)Denied(拒绝)
Req: 被拒绝的请求数(因安全规则等)
Resp: 被拒绝的响应数Errors(错误)
Req: 请求错误数(客户端侧)
Conn: 连接错误数
Resp: 响应错误数(服务器侧)Warnings(警告)
Retr: 重试次数
Redis: 重新调度次数Server(服务器状态)
Status: 服务器状态(UP/DOWN/MAINT)
LastChk: 最后一次健康检查结果
Wght: 服务器权重
Act: 活跃服务器数
Bck: 备份服务器数
Chk: 健康检查状态
Dwn: 宕机次数
Dwntme: 总宕机时间
Thrtle: 节流状态
配置负载均衡
一般用于高可用集群;可参考博文配置openstack高可用集群
vim/etc/haproxy/haproxy.cfg#可根据服务自定义名称listen openstack_mariadb_galera_cluster# 绑定HAProxy监听的IP地址和端口bind192.168.200.154:3306# 负载均衡算法,基于客户端源IP地址进行负载均衡balancesource# 设置TCP模式,用于处理TCP连接mode tcp# 启用TCP日志记录option tcplog# 自定义日志格式log-format"%ci:%cp [%t] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %ts %D %ac/%fc/%bc/%sc/%rc %sq/%bq"# 设置连接超时为5000毫秒(5秒)timeoutconnect 5000ms# 设置客户端连接超时为30000毫秒(30秒)timeoutclient 30000ms# 设置服务器连接超时为30000毫秒(30秒)timeoutserver 30000ms# 设置连接重试次数为3次retries3# 定义后端服务器1,启用健康检查,检查间隔为2000毫秒(2秒),连续2次成功认为正常,连续5次失败认为不可用,限制最大连接数为100server controller01192.168.200.155:3306 check inter2000rise2fall5maxconn100# 定义后端服务器2,启用健康检查,检查间隔为2000毫秒(2秒),连续2次成功认为正常,连续5次失败认为不可用,限制最大连接数为100server controller02192.168.200.156:3306 check inter2000rise2fall5maxconn100# 定义后端服务器3,启用健康检查,检查间隔为2000毫秒(2秒),连续2次成功认为正常,连续5次失败认为不可用,限制最大连接数为100server controller03192.168.200.157:3306 check inter2000rise2fall5maxconn100# server后还可定义以下参数# weight 100 服务器权重(负载均衡时有用)# backup 标记为备份服务器(主服务器宕机时使用)# disabled 初始禁用状态负载均衡的算法有如下;可根据需求修改
balance roundrobin:轮询算法,将请求依次分配给后端服务器。
balance leastconn:最少连接数算法,将请求分配给当前连接数最少的服务器。
balance source:源地址散列算法,根据客户端的源 IP 地址进行负载均衡,确保同一客户端的请求总是分配到同一台服务器。
balance uri:URI 散列算法,根据请求的 URI 进行负载均衡,确保相同 URI 的请求总是分配到同一台服务器。
balance uri len:URI 长度散列算法,根据请求 URI 的长度进行负载均衡。
balance uri depth:URI 深度散列算法,根据请求 URI 的目录深度进行负载均衡。
balance url_param:URL 参数散列算法,根据指定的 URL 参数进行负载均衡。
balance rdp-cookie:RDP Cookie 散列算法,根据 RDP Cookie 进行负载均衡。
HAProxy 模式;得根据服务实际情况选择
- mode tcp:传输层模式,用于处理 TCP 连接。这是用于数据库、SMTP 等应用程序的最常见模式。
- mode http:应用层模式,用于处理 HTTP/HTTPS 流量。这允许使用 HTTP 特定的功能,如 URL 重写、负载均衡基于 HTTP 头或 Cookie 等。
- mode health:健康检查模式,用于为后端服务器执行健康检查。此模式通常用于专用健康检查实例,而不实际处理客户端流量。
配置web代理
官网文档
配置了 HAProxy 作为前端代理服务器后,客户端只需要访问 HAProxy 的监听地址,而不需要直接访问真实的后端 Web 服务器。具体来说,客户端的请求将如下处理:
- 客户端发起 HTTPS 请求,目标地址是 HAProxy 的监听地址
- HAProxy 接收到请求后,根据配置的负载均衡算法(例如轮询 roundrobin)将请求转发给后端服务器之一(例如 192.168.1.101 或 192.168.1.102)。
- 后端服务器处理请求并返回响应给 HAProxy。
- HAProxy 再将响应转发回客户端。
http代理
vim/etc/haproxy/haproxy.cfgfrontend http_front# 绑定 HAProxy 在所有 IP 地址的 80 端口上监听 HTTP 请求bind*:80# 设置 HTTP 模式mode http# 使用 HTTP 日志格式记录日志option httplog# 默认后端服务器组default_backend http_back backend http_back# 设置 HTTP 模式mode http# 负载均衡算法,轮询分配请求balance roundrobin# 定义后端服务器,# inter 2000:每隔 2000 毫秒进行一次健康检查。# rise 2:连续 2 次健康检查成功,认为服务器正常。# fall 3:连续 3 次健康检查失败,认为服务器不可用。server web1192.168.1.101:80 check inter2000rise2fall3server web2192.168.1.102:80 check inter2000rise2fall3示例:通过haproxy配置代理openstack节点
| 主机 | IP |
|---|---|
| haproxy代理 | 192.168.200.190 |
| openstack | 192.168.200.195 |
vim/etc/haproxy/haproxy.cfgfrontend openstack_http_frontbind192.168.200.190:80 mode http option httplog default_backend http_back backend http_back mode http balance roundrobin server controller192.168.200.195:80/horizon check inter2000rise2fall3systemctl restart haproxy访问haproxy节点IP
haproxy节点状态
