一、haproxy的原理和安装
1、haproxy
haproxy是一个提供高可用性,负载均衡的应用代理,支持的协议有TCP,HTTP,并且支持虚拟主机,特别适用于那些负载量大的web应用,这些应用通常需要会话保持或者七层处理,haproxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。它可以将客户端的请求分发到多台后端服务器,从而提高应用的可用性和性能。HAProxy支持多种负载均衡算法和健康检查机制,是构建高可用性系统的理想选择。
2、负载均衡
负载均衡是一种分配网络或应用程序流量的技术,旨在优化资源使用、提高响应速度和确保系统的高可用性。它通过将请求有效地分配到多个服务器或资源上,避免某一单一资源过载,确保服务的稳定运行。
负载均衡的主要功能包括:
-
流量分配:将用户请求均匀地分配到多台服务器上,以防止某一台服务器过载。
-
故障转移:如果某台服务器出现故障,负载均衡器可以自动将流量转移到其他正常工作的服务器上,确保服务不中断。
-
性能优化:通过有效利用服务器资源,提高网站或应用的响应速度和处理能力。
-
可扩展性:支持根据需求添加或移除服务器,使系统能够根据流量变化灵活调整。
3、haproxy的安装
1、在两个server端安装nginx
yum install nginx -y
2、分别写入html
echo webserver2 -172.25.254.20 > /usr/share/nginx/html/index.html
echo webserver1 -172.25.254.10 > /usr/share/nginx/html/index.html
3、启动服务
systemctl enable --now nginx.service
3、在客户端安装haproxy
yum install haproxy -y
vim /etc/haproxy/haproxy.cfg
4、开启haproxy服务
systemctl start haproxy.service
二、haproxy服务配置指南
1、haproxy基础配置
HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是:
1.1、global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
1.2、proxies:代理配置段
defaults:为frontend,backend, listen提供默认配置
frontend:前端,相当于nginx中的server }
backend:后端,相当于nginx中的upstream
listen:同时拥有前端和后端配置,配置简单,生产推荐使用
2、多进程
haproxy的多进程模式允许多个进程同时运行,以处理并发连接。这种模式可以提高可靠性和扩展性,因为即使一个进程崩溃,其他进程仍然可以继续处理请求。每个进程可以独立地监听端口,处理负载均衡任务。
nbproc N 开启的haproxy worker 进程数,默认进程数是一个
查看:
3、多线程
相比多进程,HAProxy的多线程模式(在某些版本中)采用了线程化的架构,从而能够更有效地利用多核处理器的性能。多线程可以减少进程之间的上下文切换,提高整体性能。HAProxy通过对I/O操作的高效管理,能够支持高并发的处理
nbthread1(和nbproc互斥) 指定每个haproxy进程开启的线程数,默认为每个进程一个线程
查看:
4、Proxies
在HAProxy中,proxies
是指处理流量的逻辑组件。可以将“proxies”理解为特定的负载均衡规则和后端服务器组的集合。用户可以根据需求定义多个代理设置,灵活地管理流量和策略。例如,可以根据不同的路径或请求来源,将请求路由到不同的服务器组。
- defaults:默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
- frontend:前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集群
- backend:后端服务器组,等于nginx的upstream和LVS中的RS服务器
- listen:将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用
vim /etc/rsyslog.conf
addr<IP> 可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
port<num> 指定的健康状态监测端口
inter <num> 健康状态检查间隔时间,默认2000ms
fa11 <num> 后端服务器从线上转为线下的检查的连续失效次数,默认为3
rise <num> 后端服务器从下线恢复上线的检查的连续有效次数,默认为2
weight <weight> 默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连接
测试:
关闭server的nginx服务
systemctl stop nginx.service
测试:
在haproxy中下载httpd
yum install httpd
80端口被占用,修改端口号
vim /etc/httpd/conf/httpd.conf
systemctl enable --now httpd
echo sorry,已下班 > /var/www/html/index.html
测试:(开启两台server的nginx服务后)
5. socat
socat是一个多功能的网络工具,可以用于建立双向数据流转。它可以用作端口转发、数据包捕获和流量代理等任务。在HAProxy的上下文中,socat可以与HAProxy搭配使用,实现一些高级功能,比如将流量导入HAProxy或将HAProxy的输出重定向到其他服务
yum install socat -y
多进程热处理
vim /etc/haproxy/haproxy.cfg
systemctl restart haproxy
ll /var/lib/haproxy/
三、haproxy的算法
1、静态算法
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。
1、static-rr 基于权重的轮询调度
vim /etc/haproxy/haproxy.cfg
static-rr不支持用socat进行动态修改权重
2、first
根据服务器在列表中的位置,自上而下进行调度。当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
2、动态算法
3、其他算法
1、source
测试:
2、hash
测试:
3、uri
在server中分别添加
[root@localhost ~]# echo 172.25.254.10 - index1.html > /usr/share/nginx/html/index1.html
[root@localhost ~]# echo 172.25.254.10 - index2.html > /usr/share/nginx/html/index2.html
[root@localhost ~]# echo 172.25.254.10 - index3.html > /usr/share/nginx/html/index3.html
[root@localhost ~]# echo 172.25.254.20 - index1.html > /usr/share/nginx/html/index1.html
[root@localhost ~]# echo 172.25.254.20 - index2.html > /usr/share/nginx/html/index2.html
[root@localhost ~]# echo 172.25.254.20 - index3.html > /usr/share/nginx/html/index3.html
测试:
4、url_param
测试:
5、hdr
测试:
四、高级功能及配置
1、基于cookie的会话保持
vim /etc/haproxy/haproxy.cfg
测试:
2、stats 状态页
测试:
3、ip透传
1、未开启
访问haproxy后查看nginx日志
tail -n 3 /var/og/nginx/access.log
在此日志中是无法看到真实访问源地址的
注:此为nginx , Apache中默认不显示访问源地址
开启时
在server1中将nginx停掉,下载并启动httpd
systemctl disable nginx.service
systemctl stop nginx.service
yum install httpd -y
echo webserver1 - 172.25.254.10 > /var/www/html/index.html
访问后查看日志
cat /etc/httpd/logs/access_log
server中修改
vim /etc/httpd/conf/httpd.conf
访问后查看日志
2、 Apache开启透传四层
配置:
haproxy中
vim /etc/nginx/nginx.conf
测试:
4、ACL-动静分离
1、基于域名访问
域名结尾
包含某字段
mkdir /usr/share/nginx/html/hao -p
echo 172.25.254.10 hao > /usr/share/nginx/html/hao/index.html
curl 172.25.254.10/hao/
2、基于ip访问
2.1白名单
测试:
在172.25.254.20访问,符合
在172.25.254.100访问,不符合
2.2.黑名单
测试:
3、基于浏览器![](https://i-blog.csdnimg.cn/direct/9c7f3a8e31cc4bf48737354c21d07ad1.png)
测试:
4、基于文件后缀名实现动静分离
yum install php -y
vim /usr/share/nginx/html/index.php
5、四层负载
server配置
yum install mariadb-server -y
vim /etc/my.cnf.d/mariadb-server.cnf
systemctl start mariadb.service
在两个server里添加用户并给全部权限
配置haproxy文件
vim /etc/haproxy/haproxy.cfg
6、加密
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/hao.org.key -x509 -days 365 -out /etc/haproxy/certs/hao.org.crt
ls查看并将公私钥放入hao.pem
ls /etc/haproxy/certs/ hao.org.crt hao.org.key
cat /etc/haproxy/certs/hao.org.key/etc/haproxy/certs/hao.org.crt >/etc/haproxy/certs/hao.pem
cat /etc/haproxy/certs/hao.pem
修改配置参数
重启后查看端口号
netstat -antlupe | grep haproxy
测试: