【包是全网最详细的负载均衡haproxy】

一、haproxy简介

HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。

企业版网站:https://www.haproxy.com
社区版网站:http://www.haproxy.org

二、haproxy基础实验

1、实验拓扑图

在这里插入图片描述
安装上面的拓扑图整好环境,防火墙,selinux关闭
172.25.254.0/24 :nat模式
192.168.0.0/24:仅主机模式

2、实验操作

proxy主机配置

[root@haproxy ~]# yum install haproxy
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg


#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
listen webcluster
    bind *:80
    mode http
    balance roundrobin
    server web1 192.168.0.10:80 check inter 2 fall 3 rise 2 weight 1          
    server web2 192.168.0.20:80 check inter 2 fall 3 rise 2 weight 1 

--------------------------------
[root@haproxy ~]# systemctl restart haproxy.service

webserver1配置

[root@webserver1 ~]# yum install httpd
[root@webserver1 ~]# echo "i am httpd server" > /var/www/html/index.html

webserver2配置

[root@webserver2 ~]# yum install nginx
[root@webserver2 ~]# echo "i am nginx server" > /usr/share/nginx/html/index.html 

3、测试

[root@haproxy ~]# curl 172.25.254.100
i am httpd server
[root@haproxy ~]# curl 172.25.254.100
i am nginx server

4、haproxy的基本配置信息

HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是:

global:全局配置段

进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置,配置简单,生产推荐使用

5、Proxies配置-defaults-详细解释

defaults
    mode                    http    
    log                     global
    option                  httplog
    option                  dontlognull 			#dontlognull表示不记录空会话连接日志
    option http-server-close  				#等待客户端完整HTTP请求的时间,此处为等待10s。
    option forwardfor       except 127.0.0.0/8     #透传客户端真实IP至后端web服务器,除了127这个网段的
    option                  redispatch 		#当server Id对应的服务器挂掉后,强制定
#向到其他健康的服务器,重新派发
    retries                 3  
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s  #session 会话保持超时时间
    timeout check           10s
    maxconn                 3000

6、server配置-详细解释

例如: server web1 192.168.0.10:80 check inter 2 fall 3 rise 2 weight 1

check #对指定real进行健康状态检查,利用TCP连接进行周期性健康性检查
addr <IP> #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量
port <num> #指定的健康状态监测端口
inter <num> #健康状态检查间隔时间,默认2000 ms
fall <num> #后端服务器从线上转为线下的检查的连续失效次数,默认为3
rise <num> #后端服务器从下线恢复上线的检查的连续有效次数,默认为2
weight <weight> #默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连接
backup #将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似Sorry
disabled #将后端服务器标记为不可用状态,即维护状态,除了持久模式
maxconn <maxconn> #当前后端server的最大并发连接数

7、利用socat 工具对服务器的权重进行动态调整

对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、Socket文件等。

修改配置文件:

#开启这个文件的授权,不然没权限修改
stats socket /var/lib/haproxy/stats mode 600 level admin
#安装socat工具
[root@haproxy ~]# yum install socat
#查看帮助
[root@haproxy ~]# echo "help" | socat stdio /var/lib/haproxy/stats

常用的socat工具的命令参数

#查看集群状态
[root@haproxy ~]# echo "show servers state" | socat stdio /var/lib/haproxy/stats
#查看集群权重
[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
1 (initial 1)
#设置服务器权重为2
[root@haproxy ~]#  echo "set weight webcluster/web1 2 " | socat stdio /var/lib/haproxy/stats
#下线后端服务器web1
[root@haproxy ~]#  echo "disable server webcluster/web1 " | socat stdio /var/lib/haproxy/stats
#上线后端服务器web1
[root@haproxy ~]#  echo "enable server webcluster/web1 " | socat stdio /var/lib/haproxy/stats

三.haproxy的算法

HAProxy通过固定参数 balance 指明对后端服务器的调度算法

1 、静态算法

static-rr:基于权重的轮询调度
first:其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务,忽略服务器的权重设置。

2、动态算法

 roundrobin: 基于权重的轮询动态调度算法, 支持权重的运行时调整, HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数)。支持对real server权重动态调整,roundrobin为默认调度算法,此算法使用广泛。
 leastconn:leastconn加权的最少连接的动态,支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接),比较适合长连接的场景使用,比如:MySQL等场景.

3、其他算法

 source:即源地址hash,可以解决会话问题,但也会导致同一个小区,公司的流量打到同一个后端服务器,不合理。
 一致性hash:一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动hash(o)mod n
 配置: balance source
		hash-type consistent

更多算法详细请见:https://blog.csdn.net/aa896517050/article/details/125707204?

四、配置HAProxy状态页

通过web界面,显示当前HAProxy的运行状态:
状态页的配置项

stats enable #基于默认的参数启用stats page
stats hide-version #将状态页中haproxy版本隐藏
stats refresh <delay> #设定自动刷新时间间隔,默认不自动刷新
stats uri <prefix> #自定义stats page uri,默认值:/haproxy?stats
stats auth <user>:<passwd> #认证时的账号和密码,可定义多个用户,每行指定一个用户
#默认:no authentication
stats admin { if | unless } <cond> #启用stats page中的管理功能

启动状态页

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
listen stats
    mode http
    bind *:81
    stats enable
    stats refresh 1
    stats uri /status    #uri的name,自己取
    stats auth gang:gang
[root@haproxy ~]# systemctl restart haproxy.service

访问
在这里插入图片描述

五、IP透传

使用场景:web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景。

1、nginx/apchce七层IP透传

在这里插入图片描述
打开nginx的访问日志:
[root@webserver2 ~]# tail -f /var/log/nginx/access.log

会记录服务器真实访问的服务器地址:
在这里插入图片描述

apchce的日志格式默认不会记录真实服务器的地址,在他的主配置文件加上下面的就可以了
在这里插入图片描述
效果
在这里插入图片描述

2、nginx四层IP透传

#nginx 配置:在访问日志中通过变量$proxy_protocol_addr 记录透传过来的客户端IP。
在这里插入图片描述

在这里插入图片描述

[root@webserver2 ~]# systemctl restart nginx.service

修改haproxy
在这里插入图片描述

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
[root@haproxy ~]# systemctl restart haproxy.service

在这里插入图片描述

因为nginx做了四层IP透传,但apchce没有做,删掉achce的send-proxy。
在这里插入图片描述
重启服务,测试:
在这里插入图片描述

六、访问控制列表ACL

是一种基于包过滤的访问控制技术;
它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃。

1、 ACL配置选项

#用acl来定义或声明一个acl
acl <aclname> <criterion> [flags] [operator] [<value>]
acl 	名称 	匹配规范     匹配模式 具体操作符 操作对象类型

ACL匹配模式

-i 不区分大小写
-m 使用指定的正则表达式匹配方法
-n 不做DNS解析
-u 禁止acl重名,否则多个同名ACL匹配或关系

ACL 操作符

整数比较:eq、ge、gt、le、lt
字符比较:
- exact match (-m str) :字符串必须完全匹配模式
- substring match (-m sub) :在提取的字符串中查找模式,如果其中任何一个被发现,ACL将匹配
- prefix match (-m beg) :在提取的字符串首部中查找模式,如果其中任何一个被发现,ACL将匹配
- suffix match (-m end) :将模式与提取字符串的尾部进行比较,如果其中任何一个匹配,则ACL进行
匹配
- subdir match (-m dir) :查看提取出来的用斜线分隔(“/")的字符串,如其中任一个匹配,则ACL
进行匹配
- domain match (-m dom) :查找提取的用点(“.")分隔字符串,如果其中任何一个匹配,则ACL进行
匹配

value的类型

The ACL engine can match these types against patterns of the following types :
- Boolean #布尔值
- integer or integer range #整数或整数范围,比如用于匹配端口范围
- IP address / network #IP地址或IP范围, 192.168.0.1 ,192.168.0.1/24
- string--> www.timinglee.org
exact #精确比较
substring #子串
suffix #后缀比较
prefix #前缀比较
subdir #路径, /wp-includes/js/jquery/jquery.js
domain #域名,www.timinglee.org
- regular expression #正则表达式
- hex block #16进制

多个ACL的逻辑处理

与:隐式(默认)使用
或:使用“or" 或 “||"表示
否定:使用 "!" 表示

多个ACL调用方式:

#示例:
if valid_src valid_port #与关系,ACL中A和B都要满足为true,默认为与
if invalid_src || invalid_port #或,ACL中A或者B满足一个为true
if ! invalid_src #非,取反,不满足ACL才为true

2、ACL示例-基于源IP或子网调度访问

编写haproxy的配置文件:
在这里插入图片描述

=上面的意思就是创建了一个基于源ip的acl规则,源ip来自172.25.254.1的请求交给web1,其他的交给web2

测试:
在这里插入图片描述
在这里插入图片描述

3、ACL示例-基于源地址的访问控制

有时候我们不想让其他人访问我们的网站,怎么办?
在这里插入图片描述
[root@haproxy certs]# systemctl restart haproxy.service

测试
在这里插入图片描述

4、 ACL示例-基于文件后缀名实现动静分离

在这里插入图片描述

上面的意思是:acl匹配静态的文件,比如图片,html格式文件,haproxy就把请求打到web2,动态的文件,php打到web1

webserver1的配置:

[root@webserver1 ~]# yum install php-fpm
[root@webserver1 ~]# cat /var/www/html/index.php 
<?php
	phpinfo();
?>
[root@webserver1 ~]# systemctl restart httpd

测试:
请求被调度到web1
在这里插入图片描述

静态文件的请求被调度到web2
在这里插入图片描述

5、ACL-匹配访问路径实现动静分离

在这里插入图片描述

上面配置的意思就是访问路径地址包括/api就被调度到web1/api路径下的资源,/image这个路径就被调度到web2上去

web1的设置

[root@webserver1 ~]# mkdir /var/www/html/api
[root@webserver1 ~]# echo i am api > /var/www/html/api/index.html

web2的设置

[root@webserver2 ~]# mkdir /usr/share/nginx/html/{static,images}
[root@webserver2 ~]# echo i am static resourses > /usr/share/nginx/html/static/index.html
[root@webserver2 ~]# echo i am images resourses > /usr/share/nginx/html/images/index.html

测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、自定义HAProxy 错误界面

使用errorfile和errorloc指令的两种方法,可以实现自定义各种错误页面

[root@haproxy ~]# rpm -ql haproxy | egrep *.http$
/usr/share/haproxy/400.http
/usr/share/haproxy/403.http
/usr/share/haproxy/408.http
/usr/share/haproxy/500.http
/usr/share/haproxy/502.http
/usr/share/haproxy/503.http
/usr/share/haproxy/504.http
#创建一个存放错误页面的目录
[root@haproxy ~]# mkdir /etc/haproxy/error/ -p
[root@haproxy ~]# cp /usr/share/haproxy/503.http /etc/haproxy/error/

在这里插入图片描述
加入utf8后就可以识别中文了。

编辑proxy的配置文件
在这里插入图片描述

[root@haproxy ~]# systemctl restart haproxy.service

关闭webserver1和webserver2进行测试:

[root@webserver1 ~]# systemctl stop httpd.service
[root@webserver2 ~]# systemctl stop nginx.service 

在这里插入图片描述

基于http重定向错误页面

在这里插入图片描述

出现错误页面定向到百度

[root@haproxy ~]# systemctl restart haproxy.service

测试:实验成功!

八、HAProxy 对MYSQL的四层负载

针对除HTTP以外的TCP协议应用服务访问的应用场景

MySQL
Redis
Memcache
RabbitMQ

使用listen实现

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg 
listen mysql_port
    bind :3306
    mode tcp
    balance leastconn
    server db1 192.168.0.10:3306 check
    server db2 192.168.0.20:3306 check
[root@haproxy ~]# systemctl restart haproxy.service 

2、为了测试在两台后端服务器安装mysql-server

yum install mysql-server
#为了加以区分两台服务器,设置他们为不同的server-id,一个为1,一个为2
[root@webserver1 ~]# grep server-id /etc/my.cnf.d/mysql-server.cnf 
server-id=1
systemctl restart mysqld.service
#设置好root密码,并把root的host让所有主机都可以连接

3、haproxy主机设置

安装MySQL的工具
yum install mysql

4、测试:
在这里插入图片描述

九、 HAProxy https 实现

haproxy可以实现https的证书安全,从用户到haproxy为https,从haproxy到后端服务器用http通信
但基于性能考虑,生产中证书都是在后端服务器比如nginx上实现。

1、证书制作

[root@haproxy ~]# mkdir /etc/haproxy/certs
[root@haproxy ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/gang.org.key -x509 -days 365 -out /etc/haproxy/certs/gang.org.crt
#指令 crt 后证书文件为PEM格式,需要同时包含证书和所有私钥
[root@haproxy certs]# cat /etc/haproxy/certs/gang.org.crt /etc/haproxy/certs/gang.org.key > /etc/haproxy/certs/gang.pem

在这里插入图片描述
[root@haproxy certs]# systemctl restart haproxy.service

2、测试:
在这里插入图片描述

使用80端口访问就会出错,不太好
在这里插入图片描述

用前后端的方式实现,别人访问80端口给他重定向到443端口,不会出错,比较合理

frontend webserver
	bind *:80
	redirect scheme https if !{ ssl_fc }   #全站加密
	mode http
	use_backend webcluster
frontend webserver-https
	bind *:443 ssl crt /etc/haproxy/certs/gang.pem
	mode http
	use_backend webcluster
backend webcluster
	mode http
	balance roundrobin
	server web1 192.168.0.10:80 check inter 3s fall 3 rise 5
	server web2 192.168.0.20:80 check inter 3s fall 3 rise 5

访问:172.25.254.100 被重定向到443端口了,good!
在这里插入图片描述

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值