目录
使用 systemctl stop nginx.service命令检测服务器
(一)简介
HAProxy 是一款提供高可用性、负载均衡以及基于 TCP(第四层)和 HTTP(第七层)应用的代理软件,它是免费、快速并且可靠的一种解决方案。
一、主要特点
1. 高可用性
- 能够检测后端服务器的健康状况。如果某台后端服务器出现故障,HAProxy 会自动将其从负载均衡池中移除,直到它恢复正常后再重新加入,从而确保整个系统的持续稳定运行。 - 支持多种故障切换模式,例如主动/被动模式,当主服务器出现故障时,备用服务器能够迅速接管服务,保证业务不中断。
2. 负载均衡
- 支持多种负载均衡算法,如轮询(Round Robin)、最少连接(Least Connections)等。 - 轮询算法会依次将请求分发到后端的每台服务器,适用于后端服务器性能相近的情况。最少连接算法则会将新的请求发送到当前连接数最少的服务器,这样可以更合理地利用服务器资源,适用于服务器性能有差异或者服务器处理请求的时长不同的情况。
3. 性能卓越
- 它在网络层进行高效的数据转发,与应用层相比,减少了很多不必要的处理开销。 - 能够处理大量的并发连接,并且具有较低的延迟,特别适用于高流量的网站或应用。
4. 支持多种协议
- 对于基于 TCP 的应用,如数据库服务、邮件服务等,HAProxy 可以在不了解应用层协议的情况下进行高效的负载均衡。
- 对于 HTTP 应用,它可以基于 URL、HTTP 头部等信息进行更精细的负载均衡和请求路由,例如将不同类型的请求分发到不同的后端服务器组。
5. 安全防护
- 可以作为应用的前端防护层,提供一些基本的安全功能。例如,它可以限制客户端的连接速率,防止恶意的洪水攻击;还可以通过设置访问控制列表(ACL)来限制对后端服务器的访问,只允许特定的 IP 地址或 IP 段访问。
二、应用场景
1. 大型网站
- 对于像电商网站、新闻门户等流量巨大的网站,HAProxy 可以将用户的请求均衡地分发到多台 Web 服务器上,提高网站的响应速度和吞吐量,同时保证网站的高可用性。 - 例如,在促销活动期间,网站流量会急剧增加,HAProxy 能够自动调整负载均衡策略,确保网站不会因为流量过大而崩溃。
2. Web 应用集群
- 在构建 Web 应用集群时,HAProxy 可以将前端的 HTTP 请求分发到后端的多个应用服务器上,实现应用的横向扩展。不同的应用服务器可以部署在不同的物理服务器上,也可以通过容器技术部署在同一台物理服务器上,HAProxy 都能有效地管理和均衡它们之间的负载。
3. 微服务架构
- 在微服务架构中,有众多的微服务实例。HAProxy 可以作为 API 网关的一部分,负责将外部请求路由到不同的微服务实例上,同时实现负载均衡和服务发现等功能。它可以根据请求的路径、方法等信息将请求准确地转发到相应的微服务,提高微服务系统的整体性能和可靠性。
三、配置和管理
1. 配置文件
- HAProxy 的配置主要通过一个文本配置文件进行。在配置文件中,可以定义前端(frontend)和后端(backend)的相关参数。前端部分主要定义了监听的端口、协议等信息,后端部分则定义了后端服务器的列表以及负载均衡算法等。
2. 管理方式
- 可以通过命令行工具对 HAProxy 进行管理和监控。常用的命令如`haproxy -f config_file`来启动 HAProxy 并加载指定的配置文件。 - 还有一些第三方的监控工具可以与 HAProxy 集成,实时显示服务器的负载情况、连接数、吞吐量等指标,以便管理员及时了解系统的运行状态并进行调整优化。 总之,HAProxy 是一款功能强大的负载均衡和代理软件,在现代互联网应用和企业级系统中有着广泛的应用,能够有效地提高系统的性能、可用性和可靠性。
(二)实验
主机:haproxy,服务器1、2
1、分别添加地址
在服务器1、2上安装nginx
[root@webserver1 ~]# dnf install nginx -y
[root@webserver2 ~]# dnf install nginx -y
[root@webserver1 ~]# echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@webserver2 ~]# echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html
[root@webserver2 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
2、在主机haproxy上安装haproxy
[root@haproxy ~]# dnf install haproxy -y
使用frontend和backend参数配置proxies
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
用curl检测主机
使用 systemctl stop nginx.service命令检测服务器
全局配置
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service[root@haproxy ~]# pstree -p | grep haproxy
设定多线程
期间可以使用[root@haproxy ~]# pstree -p | grep haproxy查看其进程信息
定义修改日志文件,开启udp
其核心命令为vim /etc/rsyslog.conf
haproxy代理配置
server配置[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
使用backup实现sorry server
systemctl stop nginx.service
[root@haproxy ~]# dnf install httpd -y
[root@haproxy ~]# vim /etc/httpd/conf/httpd.conf
[root@haproxy ~]# systemctl enable --now httpd
[root@haproxy ~]# echo sorry 内容 > /var/www/html/index.html
可以向特定的网页文件写入文本内容
热更新
HAProxy 支持热更新配置,这意味着可以在不中断服务的情况下更新配置。以下是 HAProxy 热更新的方法:
一、使用 HAProxy 的命令行工具
1. 首先,找到 HAProxy 的运行进程 ID(PID)。通常可以在配置文件中指定的 pidfile 路径下找到该文件,文件内容即为 PID。或者通过操作系统的进程查看命令(如`ps aux | grep haproxy`)来查找。
2. 然后,使用`haproxy`命令行工具结合`-f`参数指定新的配置文件,以及`-sf`参数指定要平滑重启的旧进程 ID。例如: - `haproxy -f new_config.cfg -sf old_process_id` - 这里的`new_config.cfg`是新的配置文件,`old_process_id`是旧的 HAProxy 进程 ID。执行这个命令后,HAProxy 会读取新的配置文件,启动新的进程,并将旧进程的连接平滑地迁移到新进程上。
二、发送信号
1. 另一种方法是通过向正在运行的 HAProxy 进程发送信号来实现热更新。可以使用`kill`命令发送`USR2`信号来触发配置文件的重新加载: - `kill -USR2 <haproxy_process_id>` - 这将使 HAProxy 重新加载配置文件。HAProxy 会首先将新的配置文件重命名为`haproxy.cfg.old.<timestamp>`(其中`<timestamp>`是当前时间戳),然后尝试加载新的配置。如果加载成功,它会将新配置文件重命名为`haproxy.cfg`,并将旧配置文件保留为备份。如果加载失败,它会继续使用旧的配置文件,并将新配置文件重命名为`haproxy.cfg.failed`。
三、注意事项
1. 在进行热更新之前,务必确保新的配置文件是正确的。可以先在测试环境中进行验证,以避免在生产环境中出现意外情况。
2. 虽然热更新可以在不中断服务的情况下更新配置,但在更新过程中可能会出现短暂的连接延迟或性能波动。特别是在处理大量并发连接时,要密切关注系统的性能指标。
3. 对于一些复杂的配置更改,例如更改监听端口、添加或删除前端/后端等,可能需要更加谨慎地测试和验证,以确保不会对现有服务产生不良影响。
4. 如果在热更新过程中遇到问题,可以查看 HAProxy 的日志文件以获取更多信息。日志文件的位置通常在配置文件中的`log`指令指定的路径下。 通过以上方法,你可以在不影响服务可用性的情况下更新 HAProxy 的配置,实现更加灵活的配置管理。
mode调整scoket的参数设置,使其拥有管理员权限
[root@haproxy ~]# dnf install socat -y
[root@haproxy ~]# echo "help" | socat stdio /var/lib/haproxy/stats (此条命令用于查看帮助)
[root@haproxy ~]# echo "show info" | socat stdio /var/lib/haproxy/stats
(此条命令用于查看haproxy的状态)[root@haproxy ~]# echo "show servers state" | socat stdio /var/lib/haproxy/stats
(此条命令用于查看server状态)
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
2 (initial 2)(查看server1的权重)
[root@haproxy ~]# echo "set weight webcluster/web1 1 " | socat stdio /var/lib/haproxy/stats
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
1 (initial 2)(修改server1的权重)
HAProxy 支持多种负载均衡算法
一、轮询(Round Robin)算法
1. 原理:
- 轮询算法是最简单且常用的负载均衡算法之一。它按照顺序依次将客户端的请求分发到后端的每一台服务器。例如,假设有服务器 A、B、C,第一个请求会被发送到服务器 A,第二个请求发送到服务器 B,第三个请求发送到服务器 C,然后第四个请求又重新从服务器 A 开始,如此循环。
2. 特点及应用场景:
- 特点: - 实现简单,能平均分配请求到各个后端服务器,确保每个服务器都有机会处理请求。 - 不考虑服务器的实际负载情况和性能差异,只要服务器处于健康状态,就会按照顺序分配请求。 - 应用场景: - 适用于后端服务器性能相近,且对请求的处理能力没有明显差异的情况。比如,在一个小型的 Web 应用集群中,服务器的配置基本相同,使用轮询算法可以简单有效地分配请求,提高整个集群的吞吐量。
二、最少连接(Least Connections)算法
1. 原理:
- 该算法会将新的请求发送到当前连接数最少的服务器。HAProxy 会实时监控后端服务器的连接状态,当有新的请求到来时,它会选择连接数最少的那台服务器进行分发。例如,服务器 A 当前有 10 个连接,服务器 B 有 5 个连接,服务器 C 有 8 个连接,那么下一个请求会被发送到服务器 B。
2. 特点及应用场景:
- 特点:
- 能够根据服务器的实际负载情况进行请求分配,更合理地利用服务器资源。 - 相比轮询算法,它考虑了服务器的当前连接数,有助于避免某些服务器因连接过多而负载过高,同时充分利用连接数较少的服务器的处理能力。
- 应用场景:
- 适用于服务器性能有差异或者服务器处理请求的时长不同的情况。例如,在一个包含不同配置服务器的集群中,性能较强的服务器可能能够处理更多的连接,而最少连接算法可以根据实际情况将更多请求分配到合适的服务器上,提高整体的处理效率。
三、源地址哈希(Source Hashing)算法
1. 原理: - 根据客户端的 IP 地址进行哈希计算,将得到的哈希值与后端服务器的数量进行取模运算,从而确定将请求分发到哪台服务器。相同的源 IP 地址总是会被分发到同一台后端服务器。例如,假设有 3 台后端服务器,通过对源 IP 地址进行哈希计算并取模,IP 地址为 192.168.1.10 的客户端计算结果为 1,那么它的请求会始终被分发到服务器 B(假设服务器编号从 0 开始)。
2. 特点及应用场景: - 特点: - 可以保证来自相同源 IP 地址的请求都被定向到同一台服务器,实现会话的一致性。这对于一些需要保持会话状态的应用非常重要,例如购物网站的用户会话,如果用户在购物过程中的请求被分发到不同的服务器,可能会导致会话状态丢失,影响用户体验。 - 但是,如果该服务器出现故障,那么来自这些源 IP 地址的请求将无法正常处理,直到服务器恢复。 - 应用场景: - 常用于需要保持用户会话一致性的应用场景,如电子商务网站、在线银行等,确保用户在整个会话期间与同一台服务器进行交互。
四、基于权重的算法(Weighted)
1. 原理:
- 在这种算法中,管理员可以为每台后端服务器分配一个权重值。负载均衡器在分发请求时,会根据权重比例来分配请求。例如,服务器 A 的权重为 3,服务器 B 的权重为 2,服务器 C 的权重为 1,那么在总共 6 份的请求中(3+2+1),服务器 A 会分配到 3 份请求,服务器 B 会分配到 2 份请求,服务器 C 会分配到 1 份请求。
2. 特点及应用场景:
- 特点:
- 灵活性高,可以根据服务器的性能、配置等因素来调整权重。性能较好的服务器可以分配较高的权重,从而承担更多的请求,而性能较弱或新加入的服务器可以分配较低的权重。
- 可以手动调整负载分配比例,以适应不同的业务需求和服务器实际情况。
- 应用场景:
- 当集群中服务器的性能、容量等存在差异时,通过权重的设置可以更合理地分配负载。例如,在一个混合服务器集群中,有一些新加入的服务器性能相对较弱,而一些老的服务器性能较强,通过设置合适的权重,可以让性能强的服务器承担更多请求,同时也能让新服务器逐步适应负载,提高整个集群的稳定性和效率。 这些算法各有特点和适用场景,在使用 HAProxy 进行负载均衡时,可以根据实际的应用需求和服务器情况选择合适的算法来达到最佳的负载均衡效果。
七层透传
还原该实验环境
[root@webserver1 ~]# systemctl disable nginx
Removed "/etc/systemd/system/multi-user.target.wants/nginx.service".
[root@webserver1 ~]# systemctl stop nginx.service
[root@webserver1 ~]# dnf install httpd -y
测试结果:
自定义错误页面
在 HAProxy 中,您可以自定义错误页面以提供更友好和个性化的用户体验。以下是一般的步骤和示例:
一、准备自定义错误页面
1. 创建错误页面文件 - 使用 HTML 或其他合适的格式创建错误页面,
例如
`503.html`(用于服务不可用错误)、`404.html`(用于未找到页面错误)等。
2. 设计错误页面内容 - 包含清晰的错误消息、可能的解决建议、联系信息等。
二、配置 HAProxy 指向自定义错误页面
在 HAProxy 的配置文件中,使用 `errorfile` 指令来指定错误页面的路径。
例如: errorfile 503 /path/to/503.html errorfile 404 /path/to/404.html
其中 `/path/to/` 是您保存错误页面文件的实际路径。
三、示例配置
假设错误页面文件保存在 `/var/www/errors/` 目录下:
` errorfile 503 /var/www/errors/503.html
errorfile 404 /var/www/errors/404.html
这样,当出现相应的错误状态时,HAProxy 将向客户端展示自定义的错误页面。 请注意,具体的配置可能因 HAProxy 的版本和实际环境而有所不同。在进行配置更改后,重新加载 HAProxy 以使更改生效。
四层IP透传
其核心命令:
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
[root@haproxy ~]# systemctl restart haproxy.service
再使用send-porxy
编辑server2
[root@webserver2 ~]# vim /etc/nginx/nginx.conf
[root@webserver2 ~]# systemctl restart nginx.service
ACL部分
在 HAProxy 中,访问控制列表(ACL)是一组规则,用于检查 HTTP 请求的特定属性,如 URL、HTTP 头部、客户端 IP 地址等。
作用:
- 实现基于请求特征的路由,比如根据 URL 路径把不同请求分发到不同后端服务器组,像静态资源请求发往静态资源服务器组,动态请求发往动态内容服务器组。
- 可以根据多种条件过滤和分类请求,以进行更精细的负载均衡和请求路由等操作,还能用于限制特定 IP 地址或用户的访问等。它是实现 HAProxy 对请求灵活处理的重要工具。
一、基本概念
ACL 由一系列规则组成,这些规则基于请求的特定属性来定义。常见的用于定义规则的属性包括请求的 URL 路径、HTTP 方法、客户端 IP 地址、HTTP 头部字段的值等。
二、工作原理 当有请求到达 HAProxy 时,它会依次对配置的 ACL 规则进行检查。如果请求符合某个 ACL 规则的条件,该规则就被视为匹配。根据 ACL 规则的匹配结果,可以执行不同的操作,例如选择特定的后端服务器组来处理请求、阻止请求、修改请求的某些属性等。
三、使用场景
1. 基于 URL 的路由 - 例如,将以`/static/`开头的 URL 请求路由到处理静态资源的后端服务器。
2. 基于客户端 IP 的访问控制 - 可以限制来自特定 IP 范围的请求访问某些服务。
3. 基于 HTTP 方法的处理 - 比如,对于 `POST` 方法的请求进行特殊处理。 **四、配置示例** 以下是一个简单的 HAProxy ACL
配置示例:
acl is_static path_beg -i /static
acl from_internal src 192.168.1.0/24
frontend http_front
bind *:80
use_backend static_back if is_static
use_backend internal_back if from_internal
backend static_back
# 静态资源服务器配置
backend internal_back
# 内部服务服务器配置
在上述示例中:
- `acl is_static path_beg -i /static` 定义了一个名为 `is_static` 的 ACL 规则,用于匹配以 `/static` 开头(不区分大小写)的 URL 路径。
- `acl from_internal src 192.168.1.0/24` 定义了一个名为 `from_internal` 的 ACL 规则,用于匹配来自 `192.168.1.0/24` 网段的客户端 IP 地址。
通过使用 ACL 与 `use_backend` 指令的结合,可以根据请求的特征将其路由到不同的后端服务器组。