HAProxy (High Availability Proxy) 是一款强大的开源负载均衡器和代理服务器。它主要用于提高 Web 应用程序和服务的可用性和性能。HAProxy 可以在 TCP 和 HTTP 层面上工作,并且支持多种负载均衡算法,广泛应用于高流量网站和大型分布式系统中。
社区版与企业版网站:[HAProxy Technologies ]
网站界面
企业版与社区版区别
HAProxy (High Availability Proxy)的主要功能:
1. 负载均衡:
- 支持多种负载均衡算法,如轮询(Round Robin)、最少连接(Least Connections)、源地址哈希(Source Address Hashing)等。
2. 健康检查:
- 自动检测后端服务器的健康状态,并在服务器出现故障时将其从负载均衡池中移除,以避免向故障服务器发送请求。
3. 会话保持:
- 支持基于 cookie 的会话保持,确保来自同一个客户端的请求被定向到相同的后端服务器,以维持会话的一致性。
4. 高级路由:
- 支持基于 URL、HTTP 头等的高级路由功能,允许根据请求的不同属性将流量分发到不同的后端服务器组。
5. SSL/TLS 加密:
- 支持 SSL/TLS 加密,可以在 HAProxy 和客户端之间加密通信,减轻后端服务器的加密负担。
6. TCP 和 HTTP 层代理:
- 可以在 TCP 层和 HTTP 层工作,支持 TCP 和 HTTP/HTTPS 协议。
7. 压缩和解压:
- 支持对 HTTP 响应进行压缩,减少传输的数据量,提高带宽利用率。
8. 缓存:
- 支持简单的缓存机制,可以缓存 HTTP 响应,减少后端服务器的负载。
9. 日志记录:
- 提供详细的日志记录功能,可以记录请求和响应信息,用于调试和监控。
10. 监控和统计:
- 提供详细的监控和统计信息,包括连接数、请求处理时间等,有助于管理员了解系统的运行状态。
11. 高可用性:
- 可以通过集群配置实现高可用性,确保即使某个节点出现故障,服务仍可继续运行。
12. 灵活的配置:
- 支持复杂的配置选项,可以根据需要进行高度定制。
13. 虚拟主机:
- 支持虚拟主机,允许在一个 HAProxy 实例上托管多个不同的站点。
14. 访问控制:
- 支持基于 IP 地址或 HTTP 头的访问控制,可以限制某些客户端访问特定的资源。
15. 错误页面:
- 支持自定义错误页面,当请求无法成功处理时,可以显示友好的错误信息。
16. 重定向:
- 支持 URL 重定向,可以在 HTTP 层面对 URL 进行重定向。
17. 请求和响应头部操作:
- 支持修改请求和响应头部,例如添加、删除或修改 HTTP 头部字段。
使用场景
1. Web 应用程序负载均衡:
- 为高流量的 Web 应用程序提供负载均衡服务。
2. API 网关:
- 作为 API 网关,为多个微服务提供统一的入口点。
3. 数据库负载均衡:
- 可以用于数据库读写分离或负载均衡。
4. 邮件服务器负载均衡:
- 为邮件服务器提供负载均衡和高可用性。
5. 云环境中的负载均衡:
- 在云环境中部署 HAProxy 以实现横向扩展和负载均衡。
6. 混合环境负载均衡:
- 在混合环境中(如私有云和公有云)部署 HAProxy 以统一管理负载均衡。
配置和管理和一些重要的global参数说明
- HAProxy 通过文本配置文件进行配置,该文件通常位于 `/etc/haproxy/haproxy.cfg`。
- 可以使用 `haproxy` 命令行工具启动、停止和重启服务。
实例练习
haproxy的基本部署
准备3台虚拟机 两台主机 一太haproxy服务器 三台虚拟机配置同一个网段的IP
haproxy IP :172.25.254.100
web1,web2 ip
在haproxy主机上安装haproxy 软件
服务器上配置对应环境
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.254.10:80
server web2 172.25.254.20:80
环境配置完成
常用全局参数练习
nbproc--(开启进程个数)
查看默认情况开启几个进程,有几行代表几个进程看到默认只有一个进程
pstree -p | grep haproxy
打开配置文件添加 nbproc 2
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
重启服务查看改变
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# pstree -p | grep haproxy
不过这样设置会造成CPU在短时间内频繁地在不同任务间切换,导致性能下降。
为了防止对应事件我们引入新的参数;
nbthread 开启多线程
注意:多进程与多线程不能同时开多个,同时打开多个会报错。
禁用之前的设置 ,和设置多线程;
重启服务
[root@haproxy ~]# systemctl restart haproxy.service
这里现实什么查看什么要不然看不到
Proxies
frontend参数介绍
bind: #指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
bind [<address>]:<port_range> [, ...] [param*]
#注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1
示例
frontend webcluster #可以采用后面形式命名:业务-服务-端口号
bind :80,:8080
bind 10.0.0.7:10080,:8801-8810,10.0.0.17:9001-9010
mode http|tcp #指定负载协议类型
use_backend <backend_name> #调用的后端服务器组名称
网页重定向
编辑文件
vim /etc/haproxy/haproxy.cfg
重启服务
测试
Socat 工具的使用
haproxy多进程热处理 示例1
haproxy的算法1
保存后重启服务
在主机中配置
测试
haproxy的算法2
保存后重启服务
测试
haproxy的算法3
保存后重启服务
测试
示例练习4: 状态页面监控
登陆后的监控界面
高级功能练习
基于cookie的会话保持
okie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session共享服务器代替。当用户发起一系列的请求时,如果没有会话保持机制,每次请求可能会被分发到不同的后端服务器。这可能导致用户会话数据的不一致或丢失,例如购物车信息、登录状态等。基于 Cookie
的会话保持可以确保属于同一会话的请求始终被路由到同一台后端服务器。
示例练习
打开对应文件
vim /etc/haproxy/haproxy.cfg
修改和添加文件中的对应的属性
修改算法
重启服务
测试 curl
IP透传
下载httpd软件并启动找到文件并修改并重启
7层透传
测试
四层透传
将http改为tcp
修改
在对应的web服务器上修改对应文件
测试
测试结果
ACL访问控制列表
它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃。
实验
打开修改配置文件
打开电脑文件做解析
C:\Windows\System32\drivers\etc
ACL基于源IP或子网调度访问
ACL基于源IP或子网调度访问
ACL基于源地址的访问控制
测试结果
ACL基于文件后缀名实现动静分离
配置文件
在web1 上打开服务
下载服务
编写对应文件
重启http服务
测试
ACL匹配访问路径实现动静分离
web1配置
自定义HAProxy错误页面
打开配置文件 vim /etc/haproxy/haproxy.cfg 添加配置
编辑文件
测试
也可以重定向到http重定向错误页面配置
测试
HAProxy四层负载
基础配置
分别在两台主机上下载对应的软件
修改文件内容
启动两台主机上mariadb服务
通过命令行创建mysql用户,并对其进行授权
在测试机上安装软件并启动软件
测试
HAProxy的https实现
创建制作证书
将证书导入对应文件
haproxy配置
确保文件存在
保存后测试