haproxy实验安装部署

什么是haproxy

Haproxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
Haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。Haproxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

haproxy优点

1. Haproxy支持两种代理模式 TCP(四层)和HTTP(七层),也是支持虚拟主机的。
2. Haproxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。
3. Haproxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲Haproxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
4. Haproxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,大家可以用LVS+Keepalived对MySQL主从做负载均衡。
5. HAProxy负载均衡策略非常多:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)。


haproxy安装部署

  • 需要三台主机命名haproxy webserver1 webserver2
  • IP haproxy为172.25.254.100 webserver1为172.25.254.10 webserver2为172.25.254.20 
  • 在webserver1和webserver2中下载nginx   

  • 将用户名和ip导入nginx的默认文件中 webserver1和webserver2同做
 echo webserver1 - 172.25.252.10 > /usr/share/nginx/html/index.html 
  • 启动nginx
  • 测试一下

haproxy基本配置信息

vim /etc/haproxy/haproxy.cfg

  • 写配置

  • 然后启动
  • 测试

  • 将webserver2关闭测试一下

只显示webserver1

  • 合到一起写
  • 测试一样的  结果一样

全局配置参数 日志分离

查看进程默认情况下一个进程 

 pstree -p |grep haproxy  查看进程

 设置多进程配置 配置完后重启  多进程和多线程不能同时设定

设置多线程

查看线程个数

自定义日志

自定义日志

定义日志文件的位置

将  UDP 的端口打开

启动

systemctl restart rsyslog.service 

查看

haproxy配置参数 

 defaults

 weight表示权重

frontend 

frontend http_80_in
     bind 0.0.0.0:80    #设置监听端口,即haproxy提供的web服务端口,和lvs的vip 类似
     mode http          #http 的7层模式
     log global         #应用全局的日志设置
     option httplog     #启用http的log
     option httpclose   #每次请求完毕后主动关闭http通道,HAproxy不支持keep-alive模式     
     option forwardfor  #如果后端服务器需要获得客户端的真实IP需要配置此参数,将可以从HttpHeader中获得客户端IP
     default_backend wwwpool   #设置请求默认转发的后端服务池

backend 

backend wwwpool      #定义wwwpool服务器组。
  mode http           #http的7层模式
  option  redispatch
  option  abortonclose
  balance source      #负载均衡的方式,源哈希算法
  cookie  SERVERID    #允许插入serverid到cookie中,serverid后面可以定义
  option  httpchk GET /test.html   #心跳检测
  server web1 10.1.1.2:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3 maxconn 8

 server

用backup制作一个sorry server表明服务器挂了的标志

  • 现在haproxy的虚拟机里设置httpd的端口

[root@haproxy ~]# echo sorry xiaban > /var/www/html/index.html

测试  在虚拟机的火狐浏览器中输入haproxy的ip 172.25.254.100:8080

  •  在 /etc/haproxy/haproxy.cfg 中编辑 将webserver1 和webserver2关闭测试 

记得启动haproxy 

定向某个指定网站 比如百度

 

haproxy的算法

静态算法
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度
等,且无法实时修改权重 ( 只能为 0 1, 不支持其它值 ) ,只能靠重启 HAProxy 生效。
static-rr :基于权重的轮询调度
不支持运行时利用 socat 进行权重的动态调整 ( 只支持 0 1, 不支持其它值 )
不支持端服务器慢启动
其后端主机数量没有限制,相当于 LVS 中的 wrr
first
根据服务器在列表中的位置,自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
其会忽略服务器的权重设置
不支持用 socat 进行动态修改权重 , 可以设置 0 1, 可以设置其它值但无效
listen webserver_80 
bind 172.25.254.100:80 
mode http balance first 
server webserver1 172.25.254.10:80 maxconn 3 check inter 3s fall 3 rise 5 
server webserver2 172.15.254.20:80 check inter 3s fall 3 rise 5

动态算法

基于后端服务器状态进行调度适当调整,
新请求将优先调度至当前负载较低的服务器
权重可以在 haproxy 运行时动态调整无需重启
roundrobin
1. 基于权重的轮询动态调度算法,
2. 支持权重的运行时调整,不同于 lvs 中的 rr 轮训模式,
3. HAProxy 中的 roundrobin 支持慢启动 ( 新加的服务器会逐渐增加转发数 )
4. 其每个后端 backend 中最多支持 4095 real server
5. 支持对 real server 权重动态调整,
6. roundrobin 为默认调度算法 , 此算法使用广泛
listen webserver
bind 172.25.254.100:80 
mode http 
balance roundrobin 
server webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5 
server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
2 leastconn
leastconn 加权的最少连接的动态
支持权重的运行时调整和慢启动,即 : 根据当前连接最少的后端服务器而非权重进行优先调度 ( 新客户
端连接 )
比较适合长连接的场景使用,比如: MySQL 等场景
listen webserver 
bind 172.25.254.100:80 
mode http 
balance leastconn 
server webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5 
server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5

其他算法

其它算法即可作为静态算法,又可以通过选项成为动态算法
source
listen webserver 
bind 172.25.254.100:80 
mode http balance source 
server webserver1 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5 
server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
map-base 取模法
2 一致性 hash
一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动 hash o
mod n
hash 算法是动态的,支持使用 socat 等工具进行在线权重调整,支持慢启动

 

uri
基于对用户请求的 URI 的左半部分或整个 uri hash ,再将 hash 结果对总权重进行取模后
根据最终结果将请求转发到后端指定服务器
适用于后端是缓存服务器场景
默认是静态算法,也可以通过 hash-type 指定 map-based consistent ,来定义使用取模法还是一致性
hash
listen webserver
bind 172.25.254.100:80 
mode http balance uri 
server webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5 
server webserver2 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5
url_param
url_param 对用户请求的 url 中的 params 部分中的一个参数 key 对应的 value 值作 hash 计算,并由服务器
总权重相除以后派发至某挑出的服务器 , 后端搜索同一个数据会被调度到同一个服务器,多用与电商
通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个 real server
如果无没 key ,将按 roundrobin 算法
hdr
针对用户每个 http 头部 (header) 请求中的指定信息做 hash
此处由 name 指定的 http 首部将会被取出并做 hash 计算,
然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。

算法总结

# 静态
static-rr--------->tcp/http
first------------->tcp/http
# 动态
roundrobin-------->tcp/http
leastconn--------->tcp/http
# 以下静态和动态取决于 hash_type 是否 consistent
source------------>tcp/http
Uri--------------->http
url_param--------->http
hdr--------------->http
first # 使用较少
static-rr # 做了 session 共享的 web 集群
roundrobin
leastconn # 数据库
source
# 基于客户端公网 IP 的会话保持
Uri--------------->http # 缓存服务器, CDN 服务商,蓝汛、百度、阿里云、腾讯
url_param--------->http # 可以实现 session 保持
hdr # 基于客户端请求报文头部做下一步处理

socat 

启动 

 在haproxy中下载socat

查看haproxy

echo "show info"|socat stdio /var/lib/haproxy/stats  查看haproxy状态

查看server状态 

查看权重

echo get weight webcluster/web2 | socat stdio /var/lib/haproxy/stats 

更改权重 

echo "set weight webcluster-host/web1 1"  | socat  stdio  /var/lib/haproxy/stats 

关闭webserver

[root@haproxy ~]# echo "enable server webcluster-host/web1"  | socat  stdio  /var/lib/haproxy/stats  

 处理多进程

 查看进程文件

[root@haproxy ~]# ll /var/lib/haproxy/
总用量 0
srw------- 1 root root 0  8月  9 21:20 stats

haproxy多进程如何热处理 开启两个文件 记得重启

 在查看一下

cookie 

注意:不支持 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的请求都发送到同一台后端服务器

 在haproxy中配置

测试 在haproxy中测试

在网页中测试 有cookie

IP透传

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

四层代理

4层负载均衡(4层交换机)

  1. 工作在第4层(传输层)
  2. 负载均衡器 根据 IP范围和端口转发用户请求
  3. 常见的基于四层的负载均衡器有LVS、F5等。

在haproxy中设置

 vim /etc/haproxy/haproxy.cfg 



 启动haproxy


在webserver中配置nginx

 vim /etc/nginx/nginx.conf

 测试

在haproxy 在wevserver1和webserver2中查看日志

 

七层透传

工作在第7层(应用层)
负载均衡器 根据 用户请求的内容将请求转发到不同的后端服务器。因此也称为"内容交换器"。
这种负载平衡模式允许您在同一域和端口下运行多个Web应用程序服务器。
支持多种应用协议,常见的有HTTP、FTP、SMTP等
常见的七层负载均衡器有HAproxy、Nginx等。

 在haproxy中设置

vim /etc/haproxy/haproxy.cfg

在nginx的主机中设定参数 

vim /etc/nginx/nginx.conf 

启动 

在 apache中设定的参数 首先要下载好

yum install httpd -y

 启动

测试

nginx

apache 

ACL

访问控制列表ACL,Access Control Lists)
是一种基于包过滤的访问控制技术
它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过
滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内
容进行匹配并执行进一步操作,比如允许其通过或丢弃。
#示例 frontend test_acl bind *:80 mode http 
#acl bad_browers hdr_beg(User-Agent) -i curl 
#http-request deny if bad_browers #acl test hdr_dom(host) -i www.timinglee.org 
#acl test hdr_end(host) -i .org 
#acl test base_sub -m sub org #acl test path_sub -m sub /a 
#acl test path_end -m sub /a 
#acl test path_reg -i ^/t 
acl test url_sub -m sub lee 
acl test path_dir -m sub a 
use_backend test_web if test 

default_backend default_webserver 

backend default_webserver 
mode http 
server web1 172.25.254.20:80 check inter 3 fall 3 rise 5 
backend test_web 
mode http 
server web2 172.25.254.30:80 check inter 3 fall 3 rise 5
域匹配, header 中的 dom host
要有解析C:\Windows\System32\drivers\etc zai这里配置如果写完之后不能保存  就用window+X
输入notepad
打开 C:\Windows\System32\drivers\etc

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

 beg

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

 结尾 end

 

 base

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

子串  xin 或者在名字或者在路径 

base_sub

 测试

正则表达式 以···开头 以···结尾 sub_reg

 

 测试

逻辑处理 

不是

or

 并且写两个 默认的

acl的动静分离访问控制

基于域名配置

在haproxy中配置

 要有解析

基于IP的

在haproxy中配置

 基于浏览器

拒绝curlwget的访问

在火狐浏览器中测试

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

在webserver主机中编辑的

基于php

 在haproxy中设置

 测试

 

 自定义错误界面

将两台主机都停止后访问浏览器出现的界面 出现报错

 在haproxy中配置

创建一个文件更改报错内容

mkdir /etc/haproxy/errorpage -p

编辑内容vim /etc/haproxy/errorpage/503.http

错误 定义到一个网站上比如 www.baidu.com

 

四层负载示例 

首先在webserver1和webserver2中下载mariadb

做一下区分

在webserver1和webserver2中配置

 vim /etc/my.cnf.d/mariadb-server.cnf

 远程登陆所以haproxy也要下载mariadb-server

在webserver1和webserver2中mysql中创建一个用户

将所有的权限赋予给这个用户

https的加密访问

 在haproxy建立一个文件村密钥

 查看一下

 

查看端口号

 

 全面加密

frontend webserver
bind *:80
redirect scheme https if !{ ssl_fc }
mode http
use_backend webcluster
  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值