HAProxy的功能概述
反向代理
1. mode http,https: 七层反向代理(仅支持http,https七层协议)
2. mode tcp: (伪)四层反向代理
调度器
四层调度和七层调度的区别
1.四层调度服务器仅仅起到的是管道的作用,tcp连接是客户端和真实的后端服务器之间来建立的,调度器只起到一个转发作用(不受套接字数量限制)
2.七层调度表示调度服务器既要充当客户端的服务器(和客户端建立完整连接)又要充当后端服务器的客户端,向后端服务器发送建立连接请求
各种调度算法介绍balance
1.roundrobin 加权轮询 (适合短连接)
根据后端服务器的权重额度,生成对应的主机对象个数 存放到一个数组中 然后轮询这个数组 比如 有两台后端服务器(node1,node2)权重为2:1
总权重就为2+1=3 生成的轮询数组为 [node1,node1,node2] 然后直接轮询此数组即可实现加权轮询
动态轮询:支持服务器数量的总权重动态改变 支持慢启动 支持最大的节点数是4095
2.static-rr 静态轮询
静态轮询:修改权重和后台节点数量后 必须重启服务才能生效 不支持慢启动 无节点数量限制
3.leastconn 加权最少连接数 (适合长连接)
把当前任务调度到后台主机连接数是最少的上面
4.frist 先到先得
第一个服务器的并发连接数满额了后才会往第二台主机上调度 串行调度 设置权重无效
5.source 源地址hash
将同一个IP发送的所有请求发往同一个后台服务器进行处理
实现方式:
1.把每个IP和第一次调度处理的后台服务器的对应关系映射成hash表存放在内存中
2.map-based: 静态数组取模法 除权取余数法 哈希数据结构是一个静态的数组
3.consistent: 一致性hash算法 一致性哈希 哈希数据结构是一个树
问题:
1.将大量的SNAT的主机识别成一个IP
2.后端服务器宕机
把所有的session存放在一台单独的redis服务器中
6.uri算法
不管客户端只要访问的是同一个URL,就始终发给后端同一个缓存服务器 提高缓存利用率
7.uri_param算法
www.a.com/index;username=jack 对 jack字符串进行hash计算然后调度到某个服务器,以后只要是jack发起的请求都会被调度到同一个服务器
8.hdr(<name>) 算法
对于每个http请求,取出指定的http首部的值做hash计算,然后相同的http首部的值被调度到同一个后端服务器
HAProxy的安装
已经被集成到base仓库,直接使用yum install haproxy即可
HAProxy配置文件说明
分为两个配置段 global全局配置段和proxies代理配置段
global
proxies
defaults 为fronted backend listen 提供默认配置
fronted 前端配置 类似于 nginx server {}
backend 后端配置 类似于 nginx upstream {}
listen 同时拥有前端和后端
HAproxy配置实例
前端配置 frontend main *:80 mode http #mode只能在frontend和listen中定义 标识此代理是七层还是四层代理 #bind *:80 default_backend webserver 后端配置 backend webserver balance roundrobin server webserver1 172.20.127.177:80 check server node2 172.20.127.178:80 check weight 3 backend webserver balance uri hash-type consistent server webserver1 172.20.127.177:80 check server node2 172.20.127.178:80 check weight 3 backend webserver balance hdr(User-Agent) hash-type consistent server webserver1 172.20.127.177:80 check server node2 172.20.127.178:80 check weight 3 backend webserver balance roundrobin cookie WEBSRCOOKIE insert nocache indirect server webserver1 172.20.127.177:80 check cookie ck1 server node2 172.20.127.178:80 check cookie ck2 #七层状态检测后端服务器 backend webserver balance roundrobin option httpchk GET /test11.html server webserver1 172.20.127.177:80 check server node2 172.20.127.178:80 check #四层代理 listen ssh bind :2222 mode tcp balance leastconn server srv1 172.20.127.177:22 check server srv2 172.20.127.178:22 check ssh 172.20.127.175 -p 2222 errorfile 文件路径 errorloc url #操作http请求头和响应头 #响应头 frontend main *:80 mode http default_backend webserver stats enable rspidel ^Server:.* rspadd laozide: tianhuangwansui #请求头 frontend main *:80 mode http default_backend webserver stats enable reqdel ^Server:.* reqadd laozide: tianhuangwansui ACL实现访问控制和动静分离 访问控制 frontend main *:80 mode http default_backend webserver acl mynet src 172.20.20.0/16 http-request allow if mynet #http-request deny if mynet acl badip src 172.20.20.222 block if badip errorfile 403 /etc/haproxy/errorfile errorloc 403 http://www.baidu.com 动静分离 url > http://www.yxh.com:80/static/images/a.jpg path > /static/images/a.jpg(url去掉协议,主机名,端口) path_beg /images/ 以/images/开始 path_end .jpg .jpeg .png path_sub images 包含images子字符串 path_dir jpegs 包含jpegs子目录 path_dom jd 包含jd子域名 url示例 http://www.yxh.com:80/static/images/a.jpg url_beg url_end url_sub url_dir url_dom [root@localhost html]# find /usr/share -iname "*.jpg" -exec cp {} ./images ; frontend main *:80 mode http default_backend webserver stats enable acl url_img path_beg /images acl url_img path_end .jpg .png .jpeg .gif use_backend imgsrvs if url_img backend imgsrvs balance roundrobin server imgsrv1 172.20.127.177:80 check backend webserver balance roundrobin server webserver1 172.20.127.177:80 check server node2 172.20.127.178:80 check
代理服务调试步骤
从七层架构底层向上层一层一层分析
1. 先检查服务器的链路层 查看远程主机是否在线
2. 然后在服务器的网络层 ping 远程主机
3. 查看远程主机的相关服务是否启动 相应端口是否处于监听