HAProxy基本配置及参数实操

目录

​编辑什么是负载均衡

为什么用负载均衡

四层和七层的区别

实验环境

实验步骤

webserver上安装nginx

启动nginx

安装haproxy

编辑配置文件

多进程

多线程

SORRY SERVER

访问重定向

maxconne最大可承受连接

socat 工具

常用示例

ha p r ox y 的 算 法

静 态 算 法

static-rr:基于权重的轮询调度

示例

first算法

示例

动态算法

roundrobin

示例

leastconn

示例

其他算法

source

示例

map-base取模法

示例

一致性hash

示例

uri

uri取模法配置示例

 uri一致性hash 配置示例

访问测试

url_param

url_param取模法配置示例

url_param一致性hash 配置示例

测试访问

hdr

hdr取模法配置示例

一致性hash 配置示例

测试访问

算法总结

高 级 功 能 及 配 置

基于cookie的会话保持

配置选项

配置示例

访问测试

 状态页

访问测试

​编辑

IP透传

layer 4与layer 7

四层负载

七层代理

四 层IP 透 传

七层IP透 传

示例

ACL

ACL-criterion 匹配规范

改本地解析

hdr——dom

hdr_beg

hdr_end

base: string

base_sub

base_reg

path

domin基于域名

匹配浏览器类型

基于文件后缀名实现动静分离

​编辑

匹配访问路径实现动静分离

自定义HAProxy  错误界面

重定向错误界面

HAProxy  https实现


什么是负载均衡

负载均衡:Load      Balance, LB, 是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均 衡将特定的业务(web 服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了 公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展

为什么用负载均衡

●  Web服务器的动态水平扩展-->对用户无感知

●增加业务并发访问及处理能力-->解决单服务器瓶颈问题

●节约公网IP地址-->降低IT支出成本

●隐藏内部服务器IP-->提高内部服务器安全性

●配置简单-->固定格式的配置文件

●功能丰富-->支持四层和七层,支持动态下线主机

●性能较强-->并发数万甚至数十万

四层负载均衡

1.通过ip+port决定负载均衡的去向。

2.对流量请求进行NAT 处理,转发至后台服务器。

3.记录tcpudp流量分别是由哪台服务器处理,后续该请求连接的流量都通过该服务器处理。 4.支持四层的软件

4.支持四层的软件

● Ivs:重量级四层负载均衡器。

·Nginx: 轻量级四层负载均衡器,可缓存。(nginx 四层是通过upstream模块) 

·Haproxy:  模拟四层转发。

1.通过虚拟ur| 或主机ip 进行流量识别,根据应用层信息进行解析,决定是否需要进行负载均衡。

2.代理后台服务器与客户端建立连接,如nginx可代理前后端,与前端客户端tcp连接,与后端服务器建 tcp连接,

3.支持7层代理的软件:

·Nginx:   基于http 协议(nginx 七层是通过proxy_pass)   

 ·Haproxy:   七层代理,会话保持、标记、路径转移等。

四层和七层的区别

所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时,依据四层的信息或七层的信息来决 定怎么样转发流量

四层的负载均衡,就是通过发布三层的IP地址(VIP), 然后加四层的端口号,来决定哪些流量需要做负 载均衡,对需要处理的流量进行NAT 处理,转发至后台服务器,并记录下这个TCP 或者UDP 的流量是由  哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理

七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比 如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的

URL、浏览器类别、语言来决定是否要进行负载均衡。

1.分层位置:四层负载均衡在传输层及以下,七层负载均衡在应用层及以下

2.性能:四层负载均衡架构无需解析报文消息内容,在网络吞吐量与处理能力上较高:七层可支持解析应 用层报文消息内容,识别URLCookieHTTP header等信息。、

3.原理:四层负载均衡是基于ip+port;七层是基于虚拟的URL 或主机IP等。 4.功能类比:四层负载均衡类似于路由器;七层类似于代理服务器。

5.安全性:四层负载均衡无法识别DDoS攻击;七层可防御SYN Cookie/Flood攻击

实验环境

功能

IP

客户端

172.25.250.100/24

haproxy

172.25.250.100/24,

eth1:192.168.0.10

RS1

eth0:172.25.250.10/24

RS2

eth0:172.25.250.20/24

实验步骤

webserver上安装nginx

dnf install nginx -y

写入网页文件

启动nginx

安装haproxy

注意区分在haproxy主机上安装

dnf install haproxy -y

编辑配置文件

global  置参数说明

参数

 

作用

chroot 锁定运行目录
deamon 以守护进程运行

user,group,uid,gid

 

运行haproxy的用户身份

stats socket

 

套接字文件

nbproc N

全局

开启的haproxy worker进程数,默认进程数是一个

nbthread 1(和nbproc 互斥)

 

指定每个haproxy进程开启的线程数,默认为每个进程一个 线程

cpu-map 10

 

绑定haproxy worker进程至指定CPU,将第1个work进程绑 定至0号CPU

cpu-map 21

 

绑定haproxy worker进程至指定CPU,将第2个work进程绑 定至1号CPU

maxconn N

 

每个haproxy进程的最大并发连接数

maxsslconn N

 

每个haproxy进程ssl最大连接数,用于haproxy配置了证书的 场景下

maxConnrate N

全局

每个进程每秒创建的最大连接数量

spread-checks N

全局

后端server状态check随机提前或延迟百分比时间,建议2- 5(20%-50%)之间,默认值0

pidfile

 

指定pid文件路径

log 127.0.0.1 local2 info

全局

定义全局的syslog服务器;日志服务器需要开启UDP协议, 最多可以定义两个

重启服务

测试

如果重启服务后访问不了后端服务器,检测haproxy监听的端口是否是80

如果是5000.记得把一下删除

多进程

查看多进程信息

多线程

用的很少,仅做了解

SORRY SERVER

修改配置文件并重启服务

记得要关闭一台webserve的nginx服务

测试

访问重定向

maxconne最大可承受连接

超过负载后就会把请求导向另外一个realserver

多开几个端口进行访问

socat 工具

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

范例:利用工具socat  对服务器动态权重调整

下载工具

常用示例

要根据配置文件中的来写socat

针对多进程的处理方法

ha p r ox y   

HAProxy通过固定参数 balance 指明对后端服务器的调度算法 balance参数可以配置在listen backend选项中。

HAProxy 的调度算法分为静态和动态调度算法

有些算法可以根据参数在静态和动态算法中相互转换。

   

静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度 等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy 生效。

static-rr:基于权重的轮询调度
  •  不支持运行时利用socat 进行权重的动态调整(只支持0和1,不支持其它值)
  • 不支持端服务器慢启动

  • 其后端主机数量没有限制,相当于LVS 中的 wrr

慢启动是指在服务器刚刚启动上不会把他所应该承担的访问压力全部给它,而是先给一部分,当没 问题后在给一部分

示例

重启服务

client上测试

不支持运行时利用socat 进行权重的动态调整(只支持0和1,不支持其它值)

first算法

●根据服务器在列表中的位置,自上而下进行调度

●其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务 · 其会忽略服务器的权重设置

 不支持用socat 进行动态修改权重,可以设置0和1,可以设置其它值但无效

示例

调整maxconnect为1是为了方便演示效果

在多台主机中执行循环

达不到效果就多开几个端口

while true; do curl 172.25.250.100; sleep 0.1; done

一堆10中会出现一个20,这是超过最大连接数后会调度到20上

测试完后改回maxconnect

动态算法

基于后端服务器状态进行调度适当调整,

●新请求将优先调度至当前负载较低的服务器

●权重可以在haproxy 运行时动态调整无需重启

roundrobin

1.基于权重的轮询动态调度算法,

2.支持权重的运行时调整,不同于Ivs rr训模式,

3.HAProxy 中的roundrobin  支持慢启动(新加的服务器会逐渐增加转发数),

4.其每个后端backend 中最多支持4095个real  server,

5.支持对real server权重动态调整,

6.roundrobin 为默认调度算法,此算法使用广泛 

支持慢启动

示例

leastconn
  • leastconn加权的最少连接的动态,将新的连接请求分配给当前连接数最少的服务器,以此来达到负载均衡的目的。

  •  支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客 户端连接)

  •  比较适合长连接的场景使用,比如:MySQL 等场景。

示例

其他算法

其它算法即可作为静态算法,又可以通过选项成为动态算法

source

源地址hash,  基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一 个后端web 服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服  务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入CookieTCP 模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持

cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法 和一致性hash

示例

测试

如果访问客户端时一个家庭,那么所有的家庭的访问流量都会被定向到一台服务器,这时source算 法的缺陷

map-base取模法

取模法用的较少,所以后续仅作示例,常用hash一致性算法

map-based: 取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此 请求转发至对应的后端服务器。

此方法是静态的,即不支持在线调整权重不支持慢启动,可实现对后端服务器均衡调度

缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果 整体改变,hash-type   指定的默认值为此算法

所谓取模运算,就是计算两个数相除之后的余数,10%7=3,7%4=3

map-based 算法:基于权重取模,hash(source_ip)%所有后端服务器相加的总权重

比如当源hash值时1111,1112,1113,三台服务器a b c的权重均为1,

abc的调度标签分别会被设定为012(1111%3=1,1112%3=2,1113%3=0) 假设a 为0,1113主机会被调度到a上,

如果a下线后,权重数量发生变化

1111%2=1,1112%2=0,1113%2=1

1112和1113被调度到的主机都发生变化,这样会导致会话丢失

示例


一致性hash

一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动hash(o)

mod   n

hash 算法是动态的,支持使用socat 等工具进行在线权重调整,支持慢启动 

1、后端服务器哈希环点keyA=hash (后端服务器虚拟ip)%(2^32)

2、客户机哈希环点keyl=hash(client_ip)%(2^32)              得到的值在[0---4294967295]之间,

3、将keyA 和keyl 都放在hash 环上,将用户请求调度到离key1 最近的keyA 对应的后端服务器

hash 环偏斜问题

增加虚拟服务器IP 数量,比如:一个后端服务器根据权重为1生成1000个虚拟IP,   hash 。而后端服务器权 重为2则生成2000的虚拟IP,   bash,   最终在hash  环上生成3000个节点,从而解决hash  环偏斜问题

hash对象

Hash 对象到后端服务器的映射关系:

 致性hash 示意图

示例

source 变成hash一致性

uri

基于对用户请求的URI的左半部分或整个urihash, 再 将hash 结果对总权重进行取模后

根据最终结果将请求转发到后端指定服务器 

适用于后端是缓存服务器场景

默认是静态算法,也可以通过hash-type 指定map-based consistent, 来定义使用取模法还是一致性 hash

注意:此算法基于应用层,所以只支持mode    http,  mode  tcp,也就是只支持七层不支持四层

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag> 左半部分:/<path>;<params>
整个uri:/<path>;<params>?<query>#<frag>

uri取模法配置示例

 uri一致性hash 配置示例

访问测试

访问不同的uri, 确认可以将用户同样的请求转发至相同的服务器

如图所示访问不同的uri, 确认可以将用户同样的请求转发至相同的服务器

url_param

url_param 对用户请求的url中的 params  部分中的一个参数key对应的value值作hash 计算,并由服务器 总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器,多用与电商

通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server

如果无没key, 将按roundrobin 算法 

#假设:
url=http://www.timinglee.com/foo/bar/index.php?key=value

#则:
host="www.timinglee.com"   url_param="key=value"

url_param取模法配置示例

url_param一致性hash 配置示例

测试访问

如图

hdr

针对用户每个http 头部(header) 请求中的指定信息做hash, 此处由name 指定的http 首部将会被取出并做hash计算,

然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。
 

hdr取模法配置示例

一致性hash 配置示例

测试访问

算法总结
#静态
static-rr--------->tcp/http

#动态
roundrobin-------->tcp/http leastconn--------->tcp/http
random------------>tcp/http

#以下静态和动态取决于hash_type   是否consistent
source------------>tcp/http
Uri--------------->http
url_param--------->http
hdr--------------->http



first	#使用较少
static-rr	#做了session  共享的web集群
roundrobin random	
leastconn	#数据库
source	

#基于客户端公网IP 的会话保持	
Uri--------------->http   	#缓存服务器,CDN服务商,蓝汛、百度、阿里云、腾讯 
url_param--------->http     #可以实现session 保持
hdr                         #基于客户端请求报文头部做下一步处理

      

基于cookie的会话保持

cookie  value:为当前server 指定cookie 值,实现基于cookie 的会话黏性,相对于基于source   地址,hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy 负载,目前此模式使用较少,已经被 session共享服务器代替

注意:不支持 tcp    mode,使 http   mode

配置选项

cookie   name   [rewrite   | insert  |   prefix   ][ indirect   ][ nocache   ][postonly   ][ preserve   ][httponly     ][secure     ][domain    ]*[maxidle   <idle>][maxlife         ]


name:  #cookie     的 key 名称,用于实现持久连接 
insert:    #插入新的cookie, 默认不插入cookie
indirect: #如果客户端已经有cookie,    则不会再发送cookie   信息
nocache:  #当client    和hapoxy  之间有缓存服务器(如:CDN) 时,不允许中间缓存器缓存cookie, #因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器

cookie   name   [rewrite   | insert  |   prefix   ][ indirect   ][ nocache   ][postonly   ][ preserve   ][httponly     ][secure     ][domain    ]*[maxidle   <idle>][maxlife         ]

配置示例

访问测试

可以看到cookie是我们设置的值

 状态页

访问测试

IP透传

web 服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场 景。不做透传是无法看到谁发送的请求,RS只能看到haproxy的ip

layer 4layer 7

四 层 IP+PORT 转发

七层:协议+内容交换

四层负载

在四层负载设备中,把client发送的报文目标地址(原来是负载均衡设备的IP地址),根据均衡设备设置的 选择web 服务器的规则选择对应的web 服务器IP 地址,这样client 就可以直接跟此服务器建立TCP 连接并 发送数据,而四层负载自身不参与建立连接,而和LVS不 同 ,haproxy  是伪四层负载均衡,因为haproxy   需要分别和前端客户端及后端服务器建立连接

七层代理

七层负载均衡服务器起了一个反向代理服务器的作用,服务器建立一次TCP 连接要三次握手,而client 访 Web   Server要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负 载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的 Web     Server,然后通过三次握手与此台

Web  Server TCP 连接,然后Web  Server把需要的数据发送给七层负载均衡设备,负载均衡设备再把 数据发送给client;所以,七层负载均衡设备起到了代理服务器的作用,七层代理需要和Client和后端服 务器分别建立连接

 IP  

haproxy上

server1

重启服务

访问一下172.25.250.100然后查看日志

七层IP 

 haproxy 发往后端主机的请求报文中添加“"X-Forwarded-For" 首部,其值为前端客户端的地址;用于 向后端主发送真实的客户端IP

示例

ACL

访问控制列表ACL,Access Control Lists) 是一种基于包过滤的访问控制技术

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

ACL-criterion 匹配规范

hdr    string,提取在一个HTTP 请求报文的首部

hdr([<name>[,<0cc>]]):                    完全匹配字符串,header    的指定信息,<0CC> 表示在多值中使用的值的出

现次数

hdr_beg([<name>[,<0Cc>]]):        前    ,header 中指定匹配内容的begin

hdr_end([<name>[,<0Cc>]]):                 后缀匹配,header  中指定匹配内容end

hdr_dom([<name>[,<0Cc>]]):         域   ,header 中的domain     name(host)

hdr_dir([<name>[,<0Cc>]]):        路径匹配,header 的uri 路径

hdr_len([<name>[,<0cc>]]):                  长度匹配,header  的长度匹配

hdr_reg([<name>[,<0Cc>]]):                     正则表达式匹配,自定义表达式(regex)    模糊匹配

hdr_sub([<name>[,<0cc>]]):                   子串匹配,header   中的uri   模糊匹配 模糊匹配c 洪湖报文中a/b/c

也会匹配

#示例:

hdr(<string>)          用于测试请求头部首部指定内容

hdr_dom(host)   请求的host 名称,如 www.timinglee.org

hdr_beg(host)   请求的host 开头,如www.img.video.             download.         ftp.

hdr_end(host)   请求的host 结尾,如 .com    .net    .cn

#示例:

acl       bad_agent       hdr_sub(User-Agent)-i       curl      wget

block     if     bad_agent

#有些功能是类似的,比如以下几个都是匹配用户请求报文中host 的开头是不是www

acl       short_form       hdr_beg(host)                 WwW.

acl alternate1 hdr_beg(host)-m beg www. acl     alternate2      hdr_dom(host)-m     beg     www.

acl        alternate3        hdr(host)           -m  beg  www.

base:string

#返回第一个主机头和请求的路径部分的连接,该请求从主机名开始,并在问号之前结束,对虚拟主机有用 <scheme>://<user>:<password>@#<host>:<port>/<path>;<params>#?<query>#<frag>

base            :exact string match

base_beg :prefix match

base_dir:subdir  match

base_dom:domain          match

base_end :suffix match

base_len:length  match

base_reg      :regex      match

base_sub       :substring       match

path:string

#提取请求的URL 路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分)

改本地解析

C:\Windows\System32\drivers\etc、

hdr——dom

hdr_beg

hdr_beg请求的host开头,如www. img. bbs.

重启服务

改解析

测试

匹配上了就是web1

没有匹配上就是20

hdr_end

重启服务

测试结果

base: string

#返回第一个主机头和请求的路径部分的连接,该请求从第一个斜杠开始,并在问号之前结束,对虚拟主机有用

base_sub

sub就是网址整个一段中包含lee就算

不管是域名还是路径

base_reg

正则表达式匹配

这里是匹配以lee结尾的正则

测试

path

#提取请求的URL路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分)

<scheme>:``//<user>:<password>@<host>:<port>#/<path>;<params>#?<query>#<frag>

domin基于域名

指定的域名导向webcluster

否则导向default-host

基于源ip或子网段

指定来源都拒绝

匹配浏览器类型

拒绝curl和 wget的访问 

基于文件后缀名实现动静分离

匹配访问路径实现动静分离

自定义HAProxy  错误界面

停止10web和20nginx的服务

编写文件

指定创建的文件

重启hapraxy

然后去网页访问

重定向错误界面

重启

在网页测试访问

HAProxy  https实现

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

重启服务

测试

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值