什么是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的算法
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
动态算法
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
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
其他算法
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
![](https://i-blog.csdnimg.cn/direct/96eb3e300b934a2b934ba1782d93e5b4.png)
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
算法总结
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
配置语法
name: #cookie 的 key名称,用于实现持久连接
insert: #插入新的cookie,默认不插入cookie
indirect: #如果客户端已经有cookie,则不会再发送cookie信息
nocache: #当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie,
#因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器
在haproxy中配置
测试 在haproxy中测试
在网页中测试 有cookie
IP透传
四层代理
4层负载均衡(4层交换机)
- 工作在第4层(传输层)
- 负载均衡器 根据 IP范围和端口转发用户请求
- 常见的基于四层的负载均衡器有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
#示例 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
![](https://i-blog.csdnimg.cn/direct/e815b0a9a12e4a73a347ad39aa12e32f.png)
![](https://i-blog.csdnimg.cn/direct/4cfd3e4517aa4595aa5c272b0e399a41.png)
![](https://i-blog.csdnimg.cn/direct/a78df50a14244988861437c8ece1b0c8.png)
beg
请求的host开头,如 www. img. video. download. ftp
结尾 end
base
子串 xin 或者在名字或者在路径
base_sub
测试
正则表达式 以···开头 以···结尾 sub_reg
测试
逻辑处理
不是
or
并且写两个 默认的
acl的动静分离访问控制
基于域名配置
在haproxy中配置
要有解析
基于IP的
在haproxy中配置
基于浏览器
拒绝curl和wget的访问
在火狐浏览器中测试
基于文件后缀名实现动静分离
在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建立一个文件村密钥
查看一下
查看端口号
全面加密