1.1. 负载均衡简介
负载均衡(Load Balance),简称LB,是一种基于软件或硬件设备的高效反向代理技术。它的主要功能是将业务请求(如Web服务、网络流量等)智能地分配到一组后端服务器上,以实现高效、可靠的服务响应。通过负载均衡,不仅提升了业务的并发处理能力,还确保了服务的高可用性,并为业务未来的扩展提供了便利。
1.2. 为什么需要负载均衡
- 动态水平扩展:在不影响用户的情况下,根据需求增加或减少服务器。
- 提升并发处理能力:有效解决单台服务器处理能力不足的问题。
- 节约公网IP资源:减少对外服务的IP地址需求,降低成本。
- 提高服务器安全性:隐藏后端服务器的真实IP,减少安全风险。
- 简化配置管理:通过标准化配置,简化运维工作。
- 功能丰富、性能强大:支持多层网络协议,能够处理大量并发请求。
1.3. 负载均衡的类型
1.3.1 硬件负载均衡
- F5:美国F5网络公司提供的高性能负载均衡解决方案。
- Netscaler:美国思杰公司的ADC产品,提供应用交付控制功能。
- Array Networks:华耀提供的多功能负载均衡产品。
- AD-1000:深信服推出的企业级负载均衡设备。
1.3.2 四层负载均衡
四层负载均衡基于IP地址和端口号进行流量分发,主要特点如下:
- 流量分发依据:IP地址和端口号。
- 处理方式:进行网络地址转换(NAT),将请求转发至后端服务器。
- 连接跟踪:记录TCP/UDP连接由哪台服务器处理,确保同一连接的后续流量由同一服务器处理。
支持四层负载均衡的软件包括: - LVS:Linux Virtual Server,一个重量级的四层负载均衡器。
- Nginx:轻量级的四层负载均衡器,支持缓存功能。
- Haproxy:能够模拟四层转发。
1.3.3 七层负载均衡
七层负载均衡基于应用层信息进行流量分发,主要特点如下:
- 流量分发依据:虚拟URL或主机IP,以及应用层信息。
- 处理方式:代理服务器与客户端及后端服务器建立连接。
支持七层代理的软件包括: - Nginx:基于HTTP协议的七层代理。
- Haproxy:提供七层代理,支持会话保持、标记、路径转移等功能。
1.3.4 四层与七层的区别
- 分层位置:四层负载均衡工作在传输层,七层负载均衡工作在应用层。
- 性能:四层负载均衡不解析报文内容,性能较高;七层负载均衡解析应用层信息,性能相对较低。
- 原理:四层基于IP+端口,七层基于虚拟URL或主机IP。
- 功能类比:四层类似路由器,七层类似代理服务器。
- 安全性:四层无法识别应用层攻击,七层可防御如SYN Flood等攻击。
HAProxy简介
HAProxy是由法国开发者Willy Tarreau于2000年使用C语言开发的一个开源软件,主要特性如下:
- 高并发、高性能:能够处理万级以上的并发连接。
- 持久性支持:基于cookie实现持久性连接。
- 故障切换:在服务器故障时自动将流量切换至健康服务器。
- 正则表达式:支持正则表达式匹配,灵活的路由策略。
- 状态统计:提供Web界面,用于展示负载均衡器的状态和统计信息。
实验1 haproxy-实验环境的部署
实验环境
拓扑图
3台机器都是NAT模式
haproxy网络配置
web1 网络配置
web2 网络配置
软件安装
1. 安装HAProxy
首先,在服务器上安装HAProxy。使用以下命令安装:
[root@haproxy ~]# dnf install haproxy -y
这个命令会从默认的仓库中安装HAProxy及其依赖。
2. 查看配置文件
安装完成后,我查看HAProxy的配置文件列表:
[root@haproxy ~]# rpm -qc haproxy
这将列出所有随HAProxy安装的配置文件。
3. 配置后端Web服务器
在配置HAProxy之前,配置后端的Web服务器。
web1服务器配置
[root@webserver1 ~]# dnf install nginx -y
[root@webserver1 ~]# echo "webserver1 - 172.25.254.10" > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl enable --now nginx.service
web2服务器配置
[root@webserver2 ~]# dnf install nginx -y
[root@webserver2 ~]# echo "webserver2 - 172.25.254.20" > /usr/share/nginx/html/index.html
[root@webserver2 ~]# systemctl enable --now nginx.service
在每台服务器上,安装了Nginx,创建了一个简单的HTML页面,并启动并启用了Nginx服务。
4. 编辑HAProxy配置
后端Web服务器已经配置完毕,编辑HAProxy的配置文件:
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
在配置文件中,添加以下内容:
# 前端配置
frontend webcluster
bind *:80
mode http
use_backend webcluster-host
# 后端配置
backend webcluster-host
balance roundrobin
server web1 172.25.254.10:80
server web2 172.25.254.20:80
5. 启动和启用HAProxy服务
编辑完配置文件后,启动并启用HAProxy服务:
[root@haproxy ~]# systemctl enable haproxy.service
[root@haproxy ~]# systemctl restart haproxy.service
这将确保HAProxy服务在系统启动时自动启动。
6. 测试负载均衡
测试负载均衡是否正常工作:
[root@haproxy ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
连续执行curl
命令应该会看到交替返回webserver1
和webserver2
的信息,这表明负载均衡正在工作。
实验2 haproxy-haproxy的全局配置参数及日志分离
以下是根据您提供的步骤进行HAProxy配置和日志管理的教程,包含重点代码的注释:
1. 配置HAProxy的全局设置
编辑HAProxy的配置文件以设置全局参数:
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
在配置文件中添加以下全局配置:
# 全局配置部分
global
# 指定日志服务器地址和日志级别
log 127.0.0.1 local2
# 设置HAProxy的工作目录
chroot /var/lib/haproxy
# 定义HAProxy的PID文件位置
pidfile /var/run/haproxy.pid
# 定义最大连接数
maxconn 4000
# 定义运行HAProxy服务的用户和组
user haproxy
group haproxy
# 以守护进程模式运行HAProxy
daemon
# 开启统计信息的Unix套接字
stats socket /var/lib/haproxy/stats
# 使用系统全局加密策略
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
# 定义HAProxy的进程数,这里设置为2个进程
nbproc 2
# 将每个进程绑定到特定的CPU,这里进程1绑定到CPU 0,进程2绑定到CPU 1
cpu-map 1 0
cpu-map 2 1
2. 启动HAProxy服务
使用以下命令重启HAProxy服务以应用更改:
[root@haproxy ~]# systemctl restart haproxy.service
检查HAProxy进程:
[root@haproxy ~]# pstree -p | grep haproxy
|-haproxy(31033)-+-haproxy(31035)
| `-haproxy(31036)
3. 配置多线程
如果您想要HAProxy使用多线程而不是多进程,请注释掉nbproc
和cpu-map
配置,并添加nbthread
:
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
修改配置文件如下:
# 全局配置部分
global
# 注释掉多进程配置
# nbproc 2
# 注释掉CPU映射配置
# cpu-map 1 0
# cpu-map 2 1
# 启用多线程模式,每个进程使用2个线程
nbthread 2
重启HAProxy服务并检查线程数:
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# cat /proc/31087/status | grep -i thread
Threads: 2
4. 配置日志记录
编辑rsyslog配置文件以设置HAProxy日志记录:
[root@haproxy ~]# vim /etc/rsyslog.conf
添加以下配置:
# 将local7设施的所有日志消息记录到boot.log文件
local7.* /var/log/boot.log
# 将local12设施的所有日志消息记录到haproxy.log文件
local12.* /var/log/haproxy.log
并确保rsyslog能够接收UDP日志:
# 加载UDP输入模块,仅需要加载一次
module(load="imudp")
# 开启UDP端口514以接收日志消息
input(type="imudp" port="514")
重启rsyslog服务以应用更改:
[root@haproxy ~]# systemctl restart rsyslog.service
现在,HAProxy的日志应该被记录到/var/log/haproxy.log
文件中。
确保在HAProxy配置文件中正确设置了日志记录级别和设施,以便日志能够正确发送到rsyslog。例如:
# 全局配置部分
global
# 指定日志服务器地址和日志级别为local2
log 127.0.0.1 local2
local2
对应rsyslog配置中的local12
。请根据您的实际配置调整日志级别和设施。
proxies配置
HAProxy proxies
配置教程
HAProxy 是一种高性能的负载均衡器和代理服务器,广泛用于高可用性和高性能的 web 服务。它的配置包括 defaults
、frontend
、backend
和 listen
四个主要部分。
下面是 HAProxy 配置参数的详细表格,包括 defaults
、frontend
、backend
和 listen
部分的解释:
参数 | 类型 | 作用 |
---|---|---|
defaults | proxies | 默认配置项,针对 frontend 、backend 和 listen 部分生效,可以多个 name 也可以没有 name 。 |
frontend | proxies | 前端服务器组,类似于 Nginx 的虚拟主机 server 和 LVS 的服务集群。 |
backend | proxies | 后端服务器组,相当于 Nginx 的 upstream 和 LVS 的 RS 服务器。 |
listen | proxies | 将 frontend 和 backend 合并在一起配置,相对于 frontend 和 backend 配置更简洁,生产常用。 |
backend
配置项
参数 | 功能 |
---|---|
`mode http | tcp` |
option | 配置选项,如 httpchk 用于 HTTP 层的健康检查。 |
server | 定义后端服务器,包括 IP 和端口。 |
1. defaults
配置
参数 | 功能 |
---|---|
mode http | HAProxy 实例使用的连接协议。 |
log global | 指定日志地址和记录日志条目的 syslog/rsyslog 日志设备。 |
option httplog | 日志记录选项,记录与 HTTP 会话相关的各种属性值。 |
option dontlognull | 不记录空会话连接日志。 |
option http-server-close | 等待客户端完整 HTTP 请求的时间,此处为等待 10 秒。 |
option forwardfor except 127.0.0.0/8 | 透传客户端真实 IP 至后端 web 服务器;排除本地 IP。 |
option redispatch | 当服务器挂掉后,强制定向到其他健康的服务器,重新派发。 |
option http-keep-alive | 开启与客户端的会话保持。 |
retries 3 | 连接后端服务器失败次数。 |
timeout http-request 1000s | 等待客户端请求完全被接收和处理的最长时间。 |
timeout queue 60s | 设置删除连接和客户端收到 503 或服务不可用提示信息前的等待时间。 |
timeout connect 120s | 设置等待服务器连接成功的时间。 |
timeout client 600s | 设置允许客户端处于非活动状态的时间。 |
timeout server 600s | 设置服务器超时时间,即允许服务器处于非活动状态的时间。 |
timeout http-keep-alive 60s | HTTP 会话保持超时时间,此时间段内会转发到相同的后端服务器。 |
timeout check 10s | 指定后端服务器健康检查的超时时间。 |
maxconn 3000 | 最大连接数量限制。 |
default-server inter 1000 weight 3 | 每隔 1000 毫秒对服务器的状态进行检查,权重为 3。 |
配置示例:
# defaults配置块定义了HAProxy的默认设置,这些设置会被所有frontend、backend和listen配置块继承。
defaults
# 指定HAProxy使用HTTP协议
mode http
# 指定日志记录的地址和syslog/rsyslog日志设备,通常设置为global
log global
# 启用日志记录选项,记录与HTTP会话相关的各种属性值
option httplog
# 不记录空会话连接日志
option dontlognull
# 设置等待客户端完整HTTP请求的时间,此处为等待10秒
option http-server-close
# 透传客户端真实IP至后端web服务器
option forwardfor except 127.0.0.0/8
# 当server ID对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option redispatch
# 开启与客户端的会话保持
option http-keep-alive
# 连接后端服务器失败次数为3次
retries 3
# 等待客户端请求完全被接收和处理的最长时间为1000秒
timeout http-request 1000s
# 设置删除连接和客户端收到503或服务不可用等提示信息前的等待时间为60秒
timeout queue 60s
# 设置等待服务器连接成功的时间为120秒
timeout connect 120s
# 设置允许客户端处于非活动状态的时间为600秒
timeout client 600s
# 设置服务器超时时间为600秒
timeout server 600s
# 设置session会话保持超时时间为60秒
timeout http-keep-alive 60s
# 指定后端服务器健康检查的超时时间为10秒
timeout check 10s
# 设置最大连接数量限制为3000个
maxconn 3000
# 每隔1000毫秒对服务器的状态进行检查,权重为3
default-server inter 1000 weight 3
2. frontend
配置
功能: 定义如何处理进入 HAProxy 的请求,类似于 Nginx 的虚拟主机配置。
frontend
配置项
参数 | 功能 |
---|---|
bind | 指定 HAProxy 的监听地址,可以是 IPV4 或 IPV6,可以同时监听多个 IP 或端口。 |
backlog | 当前端服务器的连接数达到上限后的后备队列长度。注意:不支持 backend 。 |
3. backend
配置
功能: 定义后端服务器的集合,前端请求会被分发到这些服务器上。
参数解释:
mode http|tcp
: 指定负载均衡协议类型,与frontend
部分必须一致。option
: 配置选项,如httpchk
用于 HTTP 层的健康检查。server
: 定义具体的后端服务器,包括 IP 地址和端口。
配置示例:
backend http_back
mode http
option httpchk GET /health
server server1 192.168.1.1:80 check
server server2 192.168.1.2:80 check
4. server
配置
功能: 定义具体的后端服务器及其健康检查配置。
server
配置项
参数 | 功能 |
---|---|
check | 启用健康检查功能。 |
addr | 指定健康检查 IP 地址。 |
port | 指定健康检查端口。 |
inter | 健康状态检查的间隔时间,默认为 2000 毫秒。 |
fall | 后端服务器从线上转为线下的连续失效次数,默认为 3。 |
rise | 后端服务器从下线恢复上线的连续有效次数,默认为 2。 |
weight | 负载均衡时的权重,默认为 1,最大值为 256。 |
backup | 将后端服务器标记为备份状态,只在所有非备份主机 down 机时提供服务。 |
disabled | 将后端服务器标记为不可用状态,即维护状态。 |
redirect prefix | 临时将请求重定向到其他 URL,只适用于 HTTP 模式。 |
maxconn | 当前后端服务器的最大并发连接数。 |
配置示例:
server server1 192.168.1.1:80 check
weight 2
maxconn 1000
backup
5. listen
配置
功能: 将 frontend
和 backend
配置合并在一起,提供简化的配置方式。
listen
配置项
参数 | 功能 |
---|
| bind
| 指定 HAProxy 的监听地址。 |
| mode
| 负载协议类型,与 frontend
部分必须一致。 |
| option
| 配置选项,如 httplog
和 http-server-close
。 |
| default_backend
| 默认的后端服务器组。 |
| server
| 定义后端服务器及其配置。 |
实验三 配置HAProxy负载均衡器
。
根据您提供的教程内容,以下是逐步的配置和操作指南:
配置Apache Web服务器
- 安装Apache Web服务器:
[root@haproxy ~]# dnf install httpd -y
- 修改Apache配置文件:
添加或修改任何必要的配置,例如端口号、目录权限等。[root@haproxy ~]# vim /etc/httpd/conf/httpd.conf
- 启用和启动Apache服务:
[root@haproxy ~]# systemctl enable --now httpd
- 创建一个简单的网页:
[root@haproxy ~]# echo "sorry 下班了" > /var/www/html/index.html
- 确保Apache服务正在运行:
测试[root@haproxy ~]# systemctl status httpd
配置HAProxy负载均衡器
- 创建一个名为
webcluster
的监听配置:
在配置文件中添加以下内容:[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster bind *:80 mode http balance roundrobin redirect prefix http://www.baidu.com/
- 启用和启动HAProxy服务:
[root@haproxy ~]# systemctl enable --now haproxy
- 确保HAProxy服务正在运行:
[root@haproxy ~]# systemctl status haproxy
- 测试负载均衡器是否正确工作:
您应该看到重定向到百度的主页。[root@haproxy ~]# curl 172.25.254.100
停止和启动Nginx服务器
- 停止Nginx服务器:
[root@haproxy ~]# systemctl stop nginx.service
- 启动Nginx服务器:
[root@haproxy ~]# systemctl start nginx.service
网页重定向
- 修改HAProxy配置文件以添加网页重定向:
在配置文件中添加以下内容:[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster bind *:80 mode http balance roundrobin redirect prefix http://www.baidu.com/
- 重启HAProxy服务以应用更改:
[root@haproxy ~]# systemctl restart haproxy
- 再次测试负载均衡器是否正确工作:
应[root@haproxy ~]# curl 172.25.254.100
socat
是一个非常强大的网络工具,它可以用来在两个不同的数据源之间建立连接并进行数据传输。与 netcat
类似,但功能更为丰富,因此常被称为 netcat 的增强版本。下面是对 socat
的一些关键特性和用法的详细介绍:
haproxy-haproyx热更新方法
基本概念
socat
的基本思想是在两个端点之间建立一个数据通道,并在两端点之间双向传输数据。这两个端点可以是任何形式的输入输出源,如文件、套接字、进程等。
使用格式
socat
的基本使用格式如下:
socat [参数] <地址1> <地址2>
其中 <地址1>
和 <地址2>
是 socat
要连接的两个端点。[参数]
可以用来控制 socat
的行为,比如设置缓冲区大小、打开调试信息等。
地址类型
socat
支持多种类型的地址,包括但不限于:
- TCP: TCP 客户端连接。
- TCP-LISTEN: TCP 服务器监听。
- UDP: UDP 数据包发送。
- UDP-LISTEN: UDP 数据包接收。
- OPEN: 打开一个文件。
- EXEC: 执行一个程序。
- STDIO: 标准输入/输出。
- SOCKS: SOCKS 代理。
- PROXY: HTTP 代理。
- UNIX-CONNECT: Unix 域套接字客户端。
- UNIX-LISTEN: Unix 域套接字服务器。
- SSL: 加密的 TCP 连接。
- TUN: Linux TUN 设备。
- PTY: Linux PTY (伪终端)。
示例
-
标准输入输出对接:
socat - -
此命令会将标准输入与标准输出连接起来,输入的内容会被直接显示出来。
-
TCP 客户端与服务器对接:
socat TCP-LISTEN:8080,fork TCP:example.com:80
这个例子创建了一个监听 8080 端口的 TCP 服务器,并将所有传入的连接转发到
example.com
的 80 端口上。
利用 socat
对服务器动态权重调整
您提到的使用 socat
来查看 haproxy
的状态是一个很好的示例。这里通过 socat
向 haproxy
的 stats socket 发送查询命令,以获取 haproxy
的运行信息。
首先,在 haproxy
的配置文件中添加了 stats socket 的配置:
stats socket /var/lib/haproxy/stats mode 600 level admin
然后,使用 socat
查询 haproxy
的信息:
echo "show info" | socat stdio /var/lib/haproxy/stats
这个命令会显示 haproxy
的版本信息和其他状态详情。
总的来说,socat
提供了一个简单而强大的方法来处理各种网络和文件传输任务,是系统管理员和开发者的得力助手。
实验四
以下是一个教程,介绍了如何在HAProxy中使用socat工具与其统计UNIX套接字进行交互,以获取服务器状态、修改权重以及启用或禁用服务器。
获取HAProxy信息
- 首先,修改
/etc/rsyslog.conf
文件,启用统计UNIX套接字。
vim /etc/rsyslog.conf
在文件中添加以下行:
stats socket /var/lib/haproxy/stats mode 600 level admin
- 重启rsyslog服务以应用更改。
systemctl restart rsyslog.service
- 安装socat工具。
dnf install socat -y
- 使用socat通过统计套接字获取HAProxy信息。
echo "show info" | socat stdio /var/lib/haproxy/stats
获取和设置服务器权重
- 获取特定服务器的权重。
echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
- 设置服务器的权重。
echo "set weight webcluster/web1 2" | socat stdio /var/lib/haproxy/stats
启用和禁用服务器
- 禁用服务器。
echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
- 启用服务器。
echo "enable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
配置HAProxy多进程
- 修改
/etc/haproxy/haproxy.cfg
文件,设置多进程和统计套接字。
vim /etc/haproxy/haproxy.cfg
添加以下配置:
# turn on stats unix socket for each process
stats socket /var/lib/haproxy/stats1 mode 600 level admin process 1
stats socket /var/lib/haproxy/stats2 mode 600 level admin process 2
# configure number of processes
nbproc 2
# map processes to CPUs
cpu-map 1 0
cpu-map 2 1
- 重启rsyslog服务以创建新的统计套接字。
systemctl restart rsyslog.service
- 检查统计套接字文件。
ll /var/lib/haproxy/
确保两个统计套接字文件都存在并且权限正确。
注意事项
- 确保在
/etc/rsyslog.conf
中配置的统计套接字路径与haproxy.cfg
中配置的路径一致。 - 当使用多进程时,每个进程都需要自己的统计套接字。
- 使用
cpu-map
指令将HAProxy进程绑定到特定的CPU核,可以提高性能。 - 重启rsyslog服务是必要的,因为这是激活统计套接字配置的方式。
HAProxy 负载均衡算法教程
HAProxy 是一款强大的负载均衡器,它使用不同的调度算法来分配请求到后端服务器。通过配置 balance
参数来选择这些算法,balance
参数可以在 listen
或 backend
配置块中设置。HAProxy 的负载均衡算法主要分为静态算法和动态算法。
1. 静态算法
静态算法按照预定义的规则分配请求,不会根据服务器的实时负载或性能调整调度策略。这些算法不能在运行时动态修改权重,修改后需要重启 HAProxy 才会生效。
1.1 Static-RR(基于权重的轮询调度)
- 功能:按照预设的权重轮询分配请求。每台服务器将依次处理请求,权重决定了每台服务器处理请求的比例。
- 特点:
- 权重值只能为0或1,不支持其他值。
- 不支持动态权重调整。
- 不支持慢启动,即新服务器无法逐步接收流量。
- 后端服务器的数量没有限制。
- 示例配置:
listen webserver_80 bind 172.25.254.100:80 mode http balance static-rr server webserver1 192.168.0.101:80 weight 2 check inter 3s fall 3 rise 5 server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5
实验
# 编辑HAProxy配置文件
vim /etc/haproxy/haproxy.cfg
# 定义名为webcluster的监听块
listen webcluster
bind *:80 # 绑定到所有接口的80端口
mode http # 设置为HTTP模式
# balance roundrobin # 注释掉的轮询负载均衡策略
balance static-rr # 使用静态轮询负载均衡策略
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2 # 定义web1服务器
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1 # 定义web2服务器
server web_sorry 172.25.254.100:8080 backup # 定义备份服务器
# 进行测试
for i in {1..10}; do curl 172.25.254.100; done
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
1.2 First(优先调度)
-
功能:请求首先分配给列表中的第一台服务器,直到该服务器的连接数达到上限,然后才会分配给下一台服务器。
-
特点:
- 忽略服务器的权重设置。
- 不支持动态权重调整。
-
示例配置:
listen webserver_80 bind 172.25.254.100:80 mode http balance first server webserver1 192.168.0.101:80 maxconn 3 check inter 3s fall 3 rise 5 server webserver2 192.168.0.102:80 check inter 3s fall 3 rise 5
实验
# 再次编辑HAProxy配置文件,更改负载均衡策略为first
vim /etc/haproxy/haproxy.cfg
# server web2 172.25.254.20:80
listen webcluster
bind *:80
mode http
balance first # 更改负载均衡策略为first
#balance static-rr # 注释掉静态轮询负载均衡策略
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
# 进行测试
11/08/2024 22:32.23 /home/mobaxterm for i in {1..10}; do curl 172.25.254.100; done
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
2. 动态算法
动态算法能够根据服务器的实时状态调整请求分配策略。它们支持在运行时动态修改权重,不需要重启 HAProxy。
2.1 Round Robin(轮询调度)
-
功能:轮询地将请求分配到每台服务器,权重决定了分配的比例。支持在运行时动态调整权重,并且支持慢启动。
-
特点:
- 支持动态调整权重。
- 支持最多 4095 个后端服务器。
- 支持慢启动,即新服务器逐步增加接收的流量。
-
示例配置:
listen webserver_80 bind 172.25.254.100:80 mode http balance roundrobin server webserver1 192.168.0.101:80 weight 2 check inter 3s fall 3 rise 5 server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5
-
动态调整权重:
echo "set weight webserver_80/webserver1 3" | socat stdio /var/lib/haproxy/haproxy.sock
实验
roundrobin 策略
roundrobin 是一种基于权重的轮询调度算法,请求将根据服务器的权重分配。在您的配置中,web1的权重为2,web2的权重为1,因此web1会接收更多的请求。
配置文件部分如下:
listen webcluster
bind *:80
mode http
balance roundrobin
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
测试结果:
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
测试结果显示web1比web2接收了更多的请求,符合权重配置
2.2 Leastconn(最少连接数)
- 功能:将新请求分配给当前连接数最少的服务器。适合长连接的场景(如数据库连接)。
- 特点:
- 支持动态调整权重和慢启动。
- 根据当前连接数而非权重进行调度。
- 示例配置:
listen webserver_80 bind 172.25.254.100:80 mode http balance leastconn server webserver1 192.168.0.101:80 weight 1 check inter 3s fall 3 rise 5 server webserver2 192.168.0.102:80 weight 1 check inter 3s fall 3 rise 5
实验
leastconn 是一种根据后端服务器当前连接数来分配请求的策略,请求会被发送到连接数最少的服务器。
配置文件部分如下:
listen webcluster
bind *:80
mode http
balance leastconn
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
测试结果:
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
webserver1 - 172.25.254.10
webserver2 - 172.25.254.20
测试结果显示请求在两个服务器之间均匀分配,因为每个服务器的连接数很可能在测试期间保持相似。
。
4.3 其他算法
其它算法即可作为静态算法,又可以通过选项成为动态算
source 算法
source
算法根据请求的源IP地址将请求分配给服务器。每个客户端IP的请求都会被定向到同一个后端服务器,直到会话超时或服务器不可用。
配置文件部分如下:
listen webcluster
bind *:80
mode http
balance source
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
测试结果:
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
webserver2 - 172.25.254.20
由于source
算法是基于源IP的,所以所有请求都定向到了同一个服务器(webserver2
),直到测试结束。
uri 算法
uri
算法基于请求的URI将请求分配给服务器。这个算法通常与hash-type consistent
一起使用,以实现一致哈希。
配置文件部分如下:
[root@webserver1 ~]# echo 172.25.254.10 - index1.html > /usr/share/nginx/html/index1.html
[root@webserver1 ~]# echo 172.25.254.10 - index2.html > /usr/share/nginx/html/index2.html
[root@webserver1 ~]# echo 172.25.254.10 - index3.html > /usr/share/nginx/html/index3.html
[root@webserver1 ~]#
[root@webserver2 ~]# echo 172.25.254.20 - index1.html > /usr/share/nginx/html/index1.html
[root@webserver2 ~]# echo 172.25.254.20 - index2.html > /usr/share/nginx/html/index2.html
[root@webserver2 ~]# echo 172.25.254.20 - index3.html > /usr/share/nginx/html/index3.html
[root@webserver2 ~]#
listen webcluster
bind *:80
mode http
balance uri
hash-type consistent
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
测试结果:
curl 172.25.254.100/index1.html
172.25.254.10 - index1.html
curl 172.25.254.100/index2.html
172.25.254.20 - index2.html
curl 172.25.254.100/index3.html
172.25.254.10 - index3.html
url_param 算法
url_param
算法基于请求URL中的参数值来分配请求。在此例中,您使用了name
和userid
作为参数名。
配置文件部分如下:
balance url_param name,userid
hash-type consistent
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
测试结果:
curl 172.25.254.100/index1.html?name=haha
172.25.254.20 - index1.html
curl 172.25.254.100/index1.html?name=wuyu
172.25.254.10 - index1.html
curl 172.25.254.100/index1.html?name=xiaoxiao
172.25.254.10 - index1.html
curl 172.25.254.100/index1.html?name=wuyu
172.25.254.10 - index1.html
curl 172.25.254.100/index1.html?name=xiaoxioa
172.25.254.10 - index1.html
curl 172.25.254.100/index1.html?name=test
172.25.254.20 - index1.html
根据url_param
算法,具有相同name
参数值的请求被定向到同一个服务器。
hdr 算法
hdr
算法基于请求的HTTP头部字段值来分配请求。在此例中,您使用了User-Agent
字段。
配置文件部分如下:
balance hdr(User-Agent)
hash-type consistent
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
server web_sorry 172.25.254.100:8080 backup
测试结果:
curl -vA "firefox" 172.25.254.100/index.html
webserver1 - 172.25.254.10
使用hdr
算法,具有相同User-Agent
值的请求被定向到同一个服务器。在这,所有使用"firefox"作为User-Agent
的请求都被定向到了web1
服务器。
haproxy的高级功能
1、haproxy的状态页
mode http: 指定工作模式为HTTP,这意味着HAProxy将作为HTTP代理服务器运行。
bind *:8888: 绑定所有网络接口的8888端口,用于访问HAProxy的管理界面。
stats enable: 启用统计功能,允许访问HAProxy的统计信息。
stats refresh 1: 设置统计页面的自动刷新时间为1秒。
stats uri /status: 设置访问统计页面的URI为/status,即通过http://your_haproxy_server:8888/status可以访问统计信息。
stats auth lee:lee: 设置访问统计页面的认证信息,用户名为lee,密码也为lee。
浏览器访问测试
2、基于cookie的会话保持
定义: Cookie Value 是一个配置指令,用于在 HAProxy 中设置后端服务器的会话保持。通过为每个后端服务器指定一个唯一的 Cookie 值,HAProxy 能够确保来自同一客户端的请求在会话期间始终被路由到同一台后端服务器。
功能:
会话保持: 确保用户在会话期间的所有请求都由同一台后端服务器处理,避免因服务器切换导致会话数据丢失或不一致。
提高用户体验: 对于需要保持状态的应用(如购物车、用户登录等),基于 Cookie 的会话保持可以提升用户体验。
负载均衡: 在保持会话的同时,还可以根据服务器的权重进行负载均衡
# 配置HAProxy设置
cookie WEBCOOKIE insert nocache indirect
hash-type consistent
# 定义后端服务器
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
# web1服务器的详细信息,每2秒检查一次,3次失败则标记为down,5次成功则标记为up,权重为2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
# web2服务器的详细信息,每2秒检查一次,3次失败则标记为down,5次成功则标记为up,权重为1
server web_sorry 172.25.254.100:8080 backup
# web_sorry服务器作为备份服务器,当所有主服务器都不可用时使用
# 测试服务器使用cookie进行会话保持
[root@haproxy ~]# curl -b WEBCOOKIE=lee1 172.25.254.100
webserver2 - 172.25.254.20
# 使用cookie lee1访问,被定向到webserver2
[root@haproxy ~]# curl -b WEBCOOKIE=lee2 172.25.254.100
webserver1 - 172.25.254.10
# 使用cookie lee2访问,被定向到webserver1
IP 透传
IP 透传(IP Transparency)指的是在代理服务器处理请求和响应的过程中,能够将客户端的真实 IP 地址传递到后端服务器,使得后端服务器能够获取到客户端的原始 IP 而不是代理服务器的 IP 地址。
web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景。
开启四层透传
HAProxy 配置示例
global
log /dev/log local0
log /dev/log local1 notice
defaults
log global
mode tcp
option tcplog
frontend http-in
bind *:80
mode http
option forwardfor # 允许客户端IP通过X-Forwarded-For头传递
acl use_backend_1 hdr(host) -i example1.com
acl use_backend_2 hdr(host) -i example2.com
use_backend webcluster if use_backend_1
use_backend webcluster if use_backend_2
backend webcluster
mode http
balance roundrobin
server web1 172.25.254.10:80 check
server web2 172.25.254.20:80 check
Nginx 配置示例
http {
log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
access_log /var/log/nginx/access.log main;
server {
listen 80;
server_name _;
# 启用代理协议,仅当通过四层代理接收连接时使用
listen 80 proxy_protocol;
location / {
# 转发请求到 HAProxy
proxy_pass http://webcluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
2. 配置 HAProxy
- 模式:
mode tcp
表示 HAProxy 将处理 TCP 流量。 - 监听:
listen webcluster
定义了一个监听器,用于接收流量。 - 绑定:
bind *:80
表示监听所有 IP 地址上的 80 端口。 - 负载均衡算法:
balance roundrobin
使用轮询算法分配请求。
- 服务器配置:
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
定义了 web1 服务器及其健康检查参数。server web2 172.25.254.20:80 send-proxy check ...
定义了 web2 服务器,并启用了代理发送功能。
3. 日志配置与分析
- 日志格式:在 Nginx 配置中定义了日志格式,包括客户端 IP、时间、请求状态等。
- 代理协议:通过
$proxy_protocol_addr
变量记录了原始客户端 IP 地址。 - 访问日志:通过修改 HAProxy 和 Nginx 配置,确保日志中包含原始客户端 IP。
4. 配置
以下是 HAProxy 和 Nginx 的配置示例,用于确保日志中包含原始客户端 IP。
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
' "$proxy_protocol_addr"'
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
...
}
listen webcluster
bind *:80
mode tcp
balance roundrobin
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 send-proxy check inter 2 fall 3 rise 5 weight 1
5. 日志分析
通过查看 Nginx 的访问日志,我们可以看到原始客户端 IP 地址,以及代理服务器的 IP 地址和端口。
172.25.254.100 - - [12/Aug/2024:00:48:51 +0800] "PROXY TCP4 172.25.254.100 172.25.254.20 49822 80" 400 0 "-" "-" "-"
6. 注意事项
- 确保 HAProxy 和 Nginx 配置正确,以记录原始客户端 IP。
- 使用
send-proxy
指令在 HAProxy 中启用代理协议。 - 检查 Nginx 配置中的
proxy_protocol
指令,确保启用了代理协议。
七层IP透传
当haproxy工作在七层的时候,也可以透传客户端真实IP至后端服务器 #
HAProxy配置
在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For"首部,其值为前端客户端的地址;用于向后端主发送真实的客户端IP
# 启用HTTP模式
mode http
# 绑定所有接口的80端口
bind *:80
# 以下是被注释掉的统计功能,如果启用,可以提供HAProxy的状态页面
# stats enable
# stats refresh 1
# stats uri /status
# stats auth lee:lee
# 以下是被注释掉的不同的负载均衡算法,注释表示它们当前未被使用
# balance first
# balance static-rr
# balance leastconn
# balance source
# balance uri
# balance url_param name,userid
# balance hdr(User-Agent)
# 使用轮询(Round Robin)负载均衡算法
balance roundrobin
# 启用基于cookie的会话保持
cookie WEBCOOKIE insert nocache indirect
# 使用一致性哈希算法
hash-type consistent
# 配置后端服务器web1,指定其IP地址和端口,以及健康检查间隔、失败次数、成功次数和权重
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
# 配置后端服务器web2,指定其IP地址和端口,发送代理头,以及健康检查间隔、失败次数、成功次数
# 注意,这里没有指定权重,可能是一个错误
server web2 172.25.254.20:80 send-proxy check inter 2 fall 3 rise 5 weight
# 配置备用服务器web_sorry,当所有主服务器都不可用时使用
# 此行被注释掉,表示当前不启用备用服务器
# server web_sorry 172.25.254.100:8080 backup
# 以下是在Linux服务器上执行的系统命令
# 禁用Nginx服务,使其在系统启动时不自动启动
[root@webserver1 ~]# systemctl disable nginx.service
Removed /etc/systemd/system/multi-user.target.wants/nginx.service.
# 停止Nginx服务
[root@webserver1 ~]# systemctl stop nginx.service
# 安装Apache HTTP服务器
[root@webserver1 ~]# dnf install httpd -y
Complete!
# 将内容写入Apache服务器的默认索引页面
[root@webserver1 ~]# echo web1 - 172.25.254.10 > /var/www/html/index.html
# 启动Apache HTTP服务
[root@webserver1 ~]# systemctl start httpd
# 以下是编辑Apache配置文件的命令
# 如果启用了mod_logio模块,定义日志格式,包括输入和输出字节数
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
# 以下是使用curl命令从客户端访问服务器的输出
# 成功访问Apache服务器,返回状态码200和内容长度21
[D:\~]$ curl 172.25.254.100
100 21 100 21 0 0 793 0 --:--:-- --:--:-- --:--:-- 807
web1 - 172.25.254.10
# 再次成功访问Apache服务器#
[D:\~]$ curl 172.25.254.100
100 21 100 21 0 0 9222 0 --:--:-- --:--:-- --:--:-- 10500
web1 - 172.25.254.10
# 查看Apache访问日志的最后三行,显示正常的200状态码
[root@webserver1 ~]# tail -n 3 /etc/httpd/logs/access_log
172.25.254.1 172.25.254.100 - - [12/Aug/2024:00:34:06 +0800] "GET / HTTP/1.1" 200 21 "-"
ACL访问控制列表
使用HAProxy的ACL常用参数匹配域名
HAProxy是一款广泛使用的开源负载均衡器,它提供了强大的ACL(Access Control List)功能,允许管理员根据不同的条件将流量路由到不同的后端服务器。以下是如何在HAProxy中配置ACL来匹配域名的详细教程。
4.1 匹配完整域名
步骤 1:编辑HAProxy配置文件
首先,使用vim编辑器打开HAProxy的配置文件:
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
步骤 2:定义前端和ACL规则
在frontend
部分,定义一个名为webcluster
的前端,并设置以下参数:
frontend webcluster
bind *:80
mode http
acl test hdr_dom(host) -i www.timinglee.org # 判断规则
use_backend webcluster-host if test # 如果匹配,则访问webcluster-host
default_backend default-host # 如果不匹配,则访问default-host
步骤 3:定义后端服务器
接着,定义两个后端webcluster-host
和default-host
:
backend webcluster-host
mode http
server web1 172.25.254.10:80 check inter 2 fall 2 rise 5
backend default-host
mode http
server web2 172.25.254.20:80 check inter 2 fall 2 rise 5
步骤 4:重启HAProxy服务
保存并退出编辑器,然后重启HAProxy服务以应用更改:
[root@haproxy ~]# systemctl restart haproxy.service
注意: 如果配置文件中包含四层代理proxy_protocol
参数,需要将其删除。
步骤 5:测试配置
使用curl
命令测试配置是否正确:
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@haproxy ~]# curl www.timinglee.org
webserver1 - 172.25.254.10
4.2 匹配域名结尾
在frontend
部分,修改ACL规则以匹配以.org
结尾的域名:
acl test hdr_end(host) -i .org
use_backend webcluster-host if test
4.3 匹配域名开头
修改ACL规则以匹配以bbs
开头的域名:
acl test hdr_beg(host) -i bbs
use_backend webcluster-host if test
4.4 基于子字符串匹配
使用base_sub
参数来匹配包含特定子字符串的域名:
acl test base_sub -m sub lee
use_backend webcluster-host if test
在服务器上创建相应的目录和文件,然后进行测试:
[root@webserver1 ~]# mkdir /var/www/html/lee -p
[root@webserver1 ~]# echo 172.25.254.10 lee > /var/www/html/lee/index.html
最后,使用curl
命令测试不同的URL:
[root@haproxy ~]# curl www.timinglee.com
webserver1 - 172.25.254.10
[root@haproxy ~]# curl bbs.timinglee.org
webserver1 - 172.25.254.10
[root@haproxy ~]# curl www.test.com
webserver2 - 172.25.254.20
[root@haproxy ~]# curl www.test.com/lee/
172.25.254.10 lee
HAProxy ACL应用实例
介绍如何使用HAProxy的ACL(Access Control List)功能来实现基于源IP或子网的访问调度、基于源地址的访问控制、匹配浏览器类型以及基于文件后缀名实现动静分离。
5.1 基于源IP或子网调度访问
步骤 1:编辑HAProxy配置文件
打开HAProxy的配置文件进行编辑:
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
步骤 2:配置前端和ACL规则
在frontend
部分添加以下配置:
frontend webcluster
bind *:80
mode http
acl domain hdr_dom(host) -i www.timinglee.org
use_backend webcluster-host if domain
default_backend default-host
步骤 3:测试配置
使用curl
命令测试配置是否正确:
[root@haproxy ~]# curl www.test.com
webserver2 - 172.25.254.20
[root@haproxy ~]# curl www.timinglee.org
webserver1 - 172.25.254.10
5.2 基于源地址的访问控制
步骤 1:添加ACL规则
在frontend
部分添加以下配置来拒绝指定的IP或IP范围:
acl ctrl_ip src 172.25.254.1 172.25.254.20
use_backend webcluster-host if ctrl_ip
步骤 2:测试配置
测试访问,如果客户端IP在指定的范围内,则会被路由到webcluster-host
:
[root@haproxy ~]# curl 172.25.254.100
webserver2 - 172.25.254.20
[root@webserver2 ~]# curl 172.25.254.100
webserver1 - 172.25.254.10
5.3 匹配浏览器类型
步骤 1:添加ACL规则
在frontend
部分添加以下配置来拒绝curl
和wget
的访问:
acl badwebrowers hdr_sub(User-Agent) -i curl wget
http-request deny if badwebrowers
步骤 2:测试配置
使用浏览器访问,确保curl
和wget
无法访问。
5.4 基于文件后缀名实现动静分离
步骤 1:安装PHP并重启HTTP服务
在web服务器上安装PHP并重启HTTP服务:
[root@webserver1 ~]# dnf install php -y
[root@webserver1 ~]# systemctl restart httpd
创建一个PHP文件:
[root@webserver1 ~]# vim /var/www/html/index.php
[root@webserver1 ~]# cat /var/www/html/index.php
<?php
phpinfo();
?>
步骤 2:配置HAProxy
在HAProxy的配置文件中添加以下ACL规则:
acl static path_end -i .html .jpg .png .css .js
acl php path_end -i .php
use_backend webcluster-host if php
步骤 3:测试配置
使用浏览器访问不同的URL,验证动静分离是否成功:
- 访问静态文件(如
.html
)应路由到default-host
。 - 访问PHP文件(如
.php
)应路由到webcluster-host
。
配置HAProxy四层负载均衡
通过HAProxy实现四层负载均衡,即传输层负载均衡,针对MySQL数据库服务。以下是详细的步骤。
6.1 安装MariaDB服务器
在webserver1、webserver2和webserver3上安装MariaDB服务器:
dnf install mariadb-server -y
6.2 配置MySQL实例
在webserver1上:
- 编辑MySQL配置文件:
vim /etc/my.cnf.d/mariadb-server.cnf
添加以下内容:
[mysqld]
server-id=1
- 启动MySQL服务:
systemctl start mariadb
- 登录MySQL并检查服务器ID:
mysql
> SELECT @@server_id;
- 创建远程登录用户:
> CREATE USER lee@'%' IDENTIFIED BY 'lee';
> GRANT ALL ON *.* TO lee@'%';
- 检查MySQL服务是否在监听端口:
netstat -antup | grep 3306
在webserver2上重复以上步骤,但设置不同的server-id
:
[mysqld]
server-id=2
6.3 安装HAProxy
在HAProxy服务器上安装MariaDB客户端(用于测试连接):
dnf whatprovides */mysql
dnf install mariadb-server -y
尝试连接到webserver1的MySQL服务:
mysql -uroot -h 172.25.254.10
6.4 配置HAProxy
编辑HAProxy配置文件:
vim /etc/haproxy/haproxy.conf
添加以下四层负载均衡配置:
listen dbserver
bind *:3306
mode tcp
balance static-rr
server db1 172.25.254.10:3306 check inter 2 fall 2 rise 5
server db2 172.25.254.20:3306 check inter 2 fall 2 rise 5
6.5 重启HAProxy服务
应用配置更改:
systemctl restart haproxy
检查HAProxy是否在监听端口:
netstat -antup | grep 3306
6.6 测试负载均衡
使用以下命令测试四层负载均衡:
[root@haproxy ~]# mysql -ulee -plee -h 172.25.254.100
登录后,执行以下命令查看连接的服务器ID:
> SELECT @@server_id;
多次运行测试命令,检查是否在两个MySQL服务器之间轮询。
使用HAProxy实现HTTPS
配置HAProxy以支持HTTPS,这涉及生成SSL证书、配置HAProxy以及测试HTTPS连接。
7.1 生成SSL证书
步骤 1:创建证书目录
在HAProxy服务器上创建用于存放证书的目录:
[root@haproxy ~]# mkdir -p /etc/haproxy/certs
步骤 2:生成自签名证书
使用openssl
命令生成自签名证书:
[root@haproxy ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/timinglee.org.key -x509 -days 365 -out /etc/haproxy/certs/timinglee.org.crt
在生成证书的过程中,系统会提示您输入一些信息,如国家、省份、城市、组织名称等。以下是示例输入:
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shaanxi
Locality Name (eg, city) [Default City]:Xi'an
Organization Name (eg, company) [Default Company Ltd]:timinglee
Organizational Unit Name (eg, section) []:webserver
Common Name (eg, your name or your server's hostname) []:www.timinglee.org
Email Address []:admin@timinglee.org
步骤 3:合并证书文件
将密钥文件和证书文件合并成一个PEM文件:
[root@haproxy ~]# cat /etc/haproxy/certs/timinglee.org.key /etc/haproxy/certs/timinglee.org.crt > /etc/haproxy/certs/timinglee.pem
7.2 配置HAProxy
步骤 1:编辑HAProxy配置文件
编辑HAProxy的配置文件,添加HTTPS监听和重定向规则:
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
在配置文件中添加以下内容:
frontend webcluster
bind *:80
mode http
redirect scheme https if !{ ssl_fc } # 将所有HTTP请求重定向到HTTPS
listen web-https
bind *:443 ssl crt /etc/haproxy/certs/timinglee.pem # 指定HTTPS监听和证书文件
mode http
balance roundrobin
server web1 172.25.254.10:80 check inter 2 fall 2 rise 5
server web2 172.25.254.20:80 check inter 2 fall 2 rise 5
7.3 重启HAProxy服务
应用配置更改:
[root@haproxy ~]# systemctl restart haproxy
检查HAProxy是否在监听443端口:
[root@haproxy ~]# netstat -antup | grep 443
7.4 测试HTTPS连接
步骤 1:启动web服务器
确保webserver1和webserver2上的HTTP服务正在运行。
步骤 2:访问HTTPS站点
使用浏览器访问以下URL来测试HTTPS连接:
https://172.25.254.100
配置正确,会看到一个安全连接的提示,并且能够看到由webserver1或webserver2提供的页面内容。
。