一、haproxy理论介绍
1、haproxy的来源以及下载网站
haproxy由c语言编写的,可以提供负载均衡和高可用性,
社区版下载网站:HAProxy - The Reliable, High Perf. TCP/HTTP Load Balancer
2、负载均衡及其优点
2.1、负载均衡:
当用户流量访问时,通过一台设备,将流量合理调度到内部主机中,从而加快处理流量的效率
2.2、负载均衡的优点
增加服务器的业务处理能力,解决服务器硬件瓶颈问题
节约公网ip地址,降低成本
隐藏内部服务器ip,增加服务器安全性
配置简单,只需更改固定文件
性能较强,可以并发数万以及数十万
2.3、利用硬件进行负载均衡
美国F5网络公司----F5
耀--------------------array
深信服-----------------AD-1000
2.4、利用haproxy配置负载均衡
2.4.1、四层负载均衡
通过ip和port(端口)进行负载均衡的分配
记录tcp,和udp流量由哪些服务器处理,后续该请求连接的流量都通过该服务器处理
通过NAT技术,转发到后台服务器
支持四层负载均衡的软件:LVS , Nginx , Haproxy等
通过虚拟url或主机ip进
2.4.2、七层负载均衡
通过对虚拟URL或主机i进行对流量的识别,根据应用层信息进行解析
代理后台服务器与客户端进行连接,可以进行后端检测
支持七层代理的软件:Nginx , Haproxy
2.4.3、四层与七层的区别
区别在于对服务器进行负载均衡时依据四层或七层的信息来进行负载均衡
四层负载均衡:通过三层的IP地址,和四层的端口号,决定流量的负载均衡,对需要进行负载均衡的流量进行nat处理,转发至后台服务器,记录下TCP和UDP是与哪台服务器建立连接的,后续这个连接的所有流量处理都是此服务器完成
七层负载均衡:在四层的基础上,加入应用层特征进行考虑,比如URL、浏览器类别等进行负载均衡
四层负载均衡的吞吐能力较强,但是七层的负载均衡安全性较强
二、haproxy实验配置
1、haproxy的基础配置
1、实验环境部署
三台主机:一台haprey,两台sr子机
haorey :ip---172.25.254.100,安装haproxy
sr1 :ip---172.25.254.10 , 安装nignx
sr2 :ip---172.25.254.20 , 安装nignx
2、haproxy主机配置
haproxy默认开启后端检测,即当一个子机挂掉后,将不会继续给该主机发送流量
2.1、进入配置文件
rpm -qc haproxy
[root@haprey sun]# vim /etc/haproxy/haproxy.cfg #进入配置文件
2.2、更改配置文件
2.3、启动服务使配置生效
开启服务:
[root@haprey sun]# systemctl start haproxy
[root@haprey sun]# systemctl start haproxy.service
2.4、查看配置是否生效
在本地主机上面curl172.25.254.100网段,看是否符合轮询规则
2.5、listen方式配置
3、haproxy参数
3.1、设置进程数
默认一个进程中执行一个线程
[root@haprey sun]# pstree -p | grep haproxy #查看进程
|-haproxy(31489)---haproxy(31491)---{haproxy}(31492)
[root@haprey sun]# systemctl restart haproxy.service #重启服务
[root@haprey sun]# pstree -p | grep haproxy #查看进程,建议cpu几核就开几个
|-haproxy(31810)-+-haproxy(31812)
| `-haproxy(31813)
3.2、查看线程数
[root@haprey sun]# cat /proc/31812/status | grep -i thread #查看进程数
Threads: 1
Speculation_Store_Bypass: thread vulnerable
注意:多线程与多进程不能同时开启
3.3、定向存储日志设置
上一篇文章简单的描述了haproxy中的global(全局配置)的简单配置,这篇文章则系统的介绍一下haproxy-proxies中的配置。
1、proxies配置说明
参数 | 作用 |
defaults | 默认配置项,针对下面三项生效 |
frontend | 前端配置(类似与LVS服务主机) |
backend | 后端配置(类似于RS服务器组) |
listen | 前后端可以通过这个参数一起配置,生产环境下常用 |
2、proxies配置
2.1、defaults 配置详解
注:如果下面的前后端已经指定参数,则按指定的参数执行,如果未指定参数,就按配置列表内的参数执行
2.2、backend 配置详解
2.2.1、server参数
配置完后重启功能
[root@haprey sun]# systemctl restart haproxy
(1)backip与disabled参数
即所有子机都无法访问时访问指定的backup网段
当在子机后面加上 disabled 时,该子机下线,删除disabled时,子机上线
(2)redirect参数
注意:使用redirect时,将子机ip命令段注释掉
(3)msxconn参数
配置更改完后重启功能
[root@haprey sun]# systemctl restart haproxy
3、动态调整proxies参数
以上更改配置文件,更改完成后需要刷新所有集群状态,影响很大,所以需要工具单独更新,改哪个就控制哪个
3.1、socat工具
进入配置文件
[root@haprey sun]# vim /etc/haproxy/haproxy.cfg
安装socat工具
[root@haprey sun]# dnf install socat -y
查看集群权重
[root@haprey sun]# echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
更改权重
echo "set weight webcluster/web1 1 "| socat stdio /var/lib/haproxy/stats
测试轮询结果正常
下线后端服务器
[root@haprey sun]# echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
上线后端服务器
[root@haprey sun]# echo "enable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
多进程更改
1、静态算法
1.1、static-rr
不支持慢启动
不支持socat进行的热处理
主机数量没有限制
1.2、first
根据服务器列表位置,自上而下进行调动,当当前服务器连接达到上限时,新请求分配给其他服务器
会忽略权重设置
不支持socat进行热处理
listen webcluster
bind *:80
mode http
# balance roundrobin
balance first #设置为first算法
# redirect prefix http://www.baidu.com/
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
2、动态算法
基于权重的轮询动态调度算法
新请求优先调度到负载低的服务器
权重可用动态调整不用重启
2.1、roundrobin
基于权重的轮询算法
支持慢启动
数据传给权重高但负载小的主机
每个后端最多支持4095个服务器
listen webcluster
bind *:80
mode http
balance roundrobin
#balance first #设置为first算法
# redirect prefix http://www.baidu.com/
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
2.2、leastconn
将流量给当前链接最少的服务器
支持慢启动和热修改
权重次考虑,优先给链接少的
listen webcluster
bind *:80
mode http
balance leastconn
#balance first
# redirect prefix http://www.baidu.com/
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
3、其他算法
即是动态算法,也可以作为静态算法
3.1、source
同一来源的所有请求会被打到后端的子机上
基于hash地址进行运算转到后端服务器
默认为静态算法
可以通过hash-type调整为动态算法
listen webcluster
bind *:80
mode http
balance source
#balance first
# redirect prefix http://www.baidu.com/
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
3.1.1、取模法
对source进行hash计算,再基于服务器权重取模,决定将此请求转发给哪台服务器
设定后,不支持慢启动,不支持在线调整权重,为静态算法
后端服务器上下线时,因总权重改变导致整体改变
3.2、
4、哈希一致性
1、当服务器总权重进行变化时,对调度结果影响是局部的,不会引起大的变动
该算法是动态的,支持socat在线权重调整,支持慢启动
算法:后端服务器的哈希环点(服务器ip)%(2^32)
客户机哈希环点(客户机ip)%(2^32)
客户机落点 | 配对的服务器 |
弧1 | 服务器2 |
弧2 | 服务器3 |
弧3 | 服务器1 |
listen webcluster
bind *:80
mode http
balance source #配置哈希算法
hash-type consistent
#balance first
# redirect prefix http://www.baidu.com/
server web1 172.25.254.10:80 check inter 2 fall 3 rise 5 weight 2
server web2 172.25.254.20:80 check inter 2 fall 3 rise 5 weight 1
2、uri (不支持tcp)
基于对用户请求的左半部分或整个uri做hash,再将hash结果对总权重进行取模,根据最终结果将请求转发到指定服务器
同一来源的所有请求会被打到后端的子机上
配置文件配置
listen webcluster
bind *:80
mode http
# balance roundrobin
balance uri
hash-type consistent
3、url_param
对url中的params的参数key对应的value值进行hash计算,并由服务器总权重相除后派发到相应的服务器。同一来源的所有请求会被打到一个后端的子机上
可以指定多个param参数
配置文件参数
listen webcluster
bind *:80
mode http
# balance roundrobin
balance url_param name,userid
hash-type consistent
4、hdr(根据浏览器来指定去哪个服务器)
针对http头部请求的信息做hasha
由name指定的http将被取出做hash计算
若取模无效后,使用默认的轮询调度
配置文件参数
listen webcluster
bind *:80
mode http
# balance roundrobin
balance hdr(User-Agent)
hash-type consistent
算法使用场景
Uri------http 缓存服务器,CDN服务商
url_param----http 可以实现session保持
hdr------ --------基于客户端请求报文做下一步处理
5、haproxy的状态页
状态页启用
listen stats
mode http
bind *:9999
stats enable
stats uri /status
stats auth lee:lee
启用后登录网址观看状态页
1、基于cookie的会话保持
cookie value:为server指定cookie值,相对于source的hash调度算法,精度更高,但也加大了haproxy的负载,
1.1、配置选项
name 指定coookie的名称
insert 插入新的cookie,默认不插入cookie
indirect :如果客户端由cookie,则不再发送cookie信息
nocache:当client和hapoxy之间有缓存服务器时,不允许中间缓存器缓存cookie
1.2、配置
balance roundrobin
# balance hdr(User-Agent)
# balance source
# hash-type consistent
# redirect prefix http://www.baidu.com/
cookie WEBCOOKIE insert nocache indirect
server web1 172.25.254.10:80 cookie sun1 check inter 2 fall 3 rise 5
server web2 172.25.254.20:80 cookie sun2 check inter 2 fall 3 rise 5
记录真实的ip地址,用于数据统计和安全分析
1、ip透传
1.1、七层透传
httpd服务看不到ip透传地址,需要进行配置
进入配置文件
[root@web2 sun]# vim /etc/httpd/conf/httpd.conf
查看httpd日志
[root@web2 sun]# cat /etc/httpd/logs/access_log
2、四层ip透传(nginx)
进入配置文件更改
[root@haprey sun]# vim /etc/haproxy/haproxy.cfg
进入配置文件更改
[root@web1 sun]# vim /etc/nginx/nginx.conf
1、acl匹配模式
acl 名称 匹配规范 具体操作符 操作对象类型
1.1、ACL-name名称
acl test(名字) path_end -m sub /a
#ACL名称,大小写字母,数字0~9,严格区分大小写
1.2、ACL匹配规范
命令 | 作用 |
hdr_beg | 前缀匹配(以xxx开头) |
hdr_end | 后缀匹配(以xxx结尾) |
hdr_dom | 区域匹配(是xxx) |
hdr_dir | 路径匹配 |
hdr_len | 长度匹配 |
hdr_reg | 正则表达式匹配 |
hdr_sub | 字串匹配 |
再windows里面配置解析
解析路径
C:\Windows\System32\drivers\etc
修改etc里面的host文件
172.25.254.100 www.sun.org
配置完后即可正常访问www.sun.org
2、ACL动静分离
2.1、基于访问路径的访问控制
2.2、基于ip的访问控制
刷新配置文件
[root@haprey sun]# systemctl restart haproxy.service
2.3、基于浏览器的访问控制、
2.4、基于文件后缀名进行动静分离
启动httpd
[root@web1 sun]# systemctl restart httpd
下载PHP
进入vim /var/www/html/index.php
配置php文件
<?php
phpinfo();
?>
自定义错误界面
示例:errorfile <code> <file>(当出现相应错误代码时,跳转到file文件)
[root@haprey sun]# mkdir /etc/haproxy/errorpage -p
创建错误文件夹
[root@haprey sun]# vim /etc/haproxy/errorpage/503.http
创建503的错误自定义文件
配置完后重启服务
systemctl restart httpd
haproxy 四层负载
使用数据库来进行四层负载
[root@web1 sun]# dnf install mariadb-server -y
查看数据库id
hppts的加密访问
需要制作证书和密钥
[root@haprey sun]# mkdir -p /etc/haproxy/certs
证书文件制作
[root@haprey sun]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/sun.org.key -x509 -days 365 -out /etc/haproxy/cert/timinglee.org.sun
[root@haprey sun]# cat /etc/haproxy/certs/sun.org.key /etc/haproxy/certs/sun.org.key > /etc/haproxy/certs/sun.org.pem
查看端口是否开启
[root@haprey sun]# netstat -antlupe | grep haproxy
跳转443端口
配置状态页
写完重启服务
systemctl daemon-reload