一、haproxy简介
- HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
- HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。
多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制
,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。 - HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
- HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
补充:进程与线程
进程是资源分配的最小单位,线程是CPU调度的最小单位
做个简单的比喻:进程=火车,线程=车厢
二、haproxy与lvs
01_RS配置
- 删除VIP:
ip addr del 172.25.2.100/24 dev eth0
- 清除filter 所有规则
arptables -F
02_DS配置
- DS1和DS4停掉keepalived和http服务
systemctl stop keepalived.service
systemctl stop httpd.service
- 安装haproxy
yum install -y haproxy
更改配置文件
vim /etc/haproxy/haproxy.cfg
- 开启haproxy服务
systemctl start haproxy.service
03_测试
三、haproxy日志配置
- 编辑日志配置文件
vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514#开启日志端口
*.info;mail.none;authpriv.none;cron.none;local2.none /var/log/messages #关于local2的日志不记录
local2.* /var/log/haproxy.log #只记录关于local2的所有日志
- 重启日志服务
systemctl restart rsyslog.service
- 开启haproxy服务
systemctl start haproxy.service
- 查看日志
cat /var/log/haproxy.log
四.、haproxy设置加密访问
- 编辑配置文件
vim /etc/haproxy/haproxy.cfg
stats uri /status #设置统计页面的uri为/status
stats auth admin:westos #设置统计页面认证的用户和密码
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:80#前端名称为main,端口号为80
# acl url_static path_beg -i /static /images /javascript /stylesheets
# acl url_static path_end -i .jpg .gif .png .css .js
# use_backend static if url_static
default_backend app#默认后端,名称为app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
#backend static
# balance roundrobin
# server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app #后段
balance roundrobin#rr调度算法
server app1 172.25.2.2:80 check
server app2 172.25.2.3:80 check
2. 重启服务:
systemctl reload haproxy.service
3. 访问测试
访问172.25.2.1/status 需要登陆
五、haproxy设置source调度算法(源IP哈希)
将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器.这可以使得同一个客户端IP的请求始终被派发至某特定的服务器.不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器.常用于负载均衡无cookie功能的基于TCP的协议.其默认为静态,不过也可以使用hash-type修改此特性
- 编辑配置文件
vim /etc/haproxy/haproxy.cfg
- 重启服务:
systemctl reload haproxy.service
- 测试
- 实验完改回rr算法,轮询调度,并重启服务
六、默认后端与备用后端
- 编辑配置文件
vim /etc/haproxy/haproxy.cfg
2. 重启服务:
systemctl reload haproxy.service
3. 在static的后端server2主机的发布目录下建立目录images,并传入一张图片
测试1:访问 172.25.2.1/status
测试2:访问172.25.2.1/images/vim.jpg
七、备用服务器backup
- 编辑配置文件
vim /etc/haproxy/haproxy.cfg
- 修改Apache端口号为8080,开启httpd
vim /etc/httpd/conf/httpd.conf
- 重启服务:
systemctl reload haproxy.service
- server3宕机
systemctl stop httpd.service
测试1:访问172.25.2.1
测试2:访问 172.25.2.1/status app1显示为红色宕机,backup接管。
八、黑名单与白名单
01_黑名单
- 编辑配置文件
vim /etc/haproxy/haproxy.cfg
- 重启服务:
systemctl restart haproxy.service
- 测试
用黑名单中的主机访问172.25.2.1失败
其他主机可以正常访问
02_白名单
- 编辑配置文件
vim /etc/haproxy/haproxy.cfg
- 重启服务:
systemctl restart haproxy.service
- 测试
用白名单中的主机访问172.25.2.1成功
其他主机访问失败
03_白名单为整个网段
- 编辑配置文件
vim /etc/haproxy/haproxy.cfg
- 重启服务
systemctl restart haproxy.service
- 测试
白名单中的网段主机均可访问
九、重定向
01_黑名单403错误
-
编辑配置文件
vim /etc/haproxy/haproxy.cfg
-
重启服务
systemctl restart haproxy.service
-
测试
02_403错误后重定向
-
编辑配置文件
vim /etc/haproxy/haproxy.cfg
-
重启服务
systemctl restart haproxy.service
-
测试
访问172.25.2.1,重定向。
网页访问172.25.2.1,直接跳转到百度。
03_直接重定向
-
编辑配置文件
vim /etc/haproxy/haproxy.cfg
-
重启服务
systemctl restart haproxy.service
-
测试
名单中的主机重定向
不在名单中的主机正常访问
十、访问控制
-
编辑配置文件
vim /etc/haproxy/haproxy.cfg
-
重启服务
systemctl restart haproxy.service
-
测试
名单中的主机禁止访问72.25.2.1/images/vim.jpg
不在名单中的主机可以访问72.25.2.1/images/vim.jpg
十一、读写分离
01_haproxy主机配置
-
编辑配置文件
vim /etc/haproxy/haproxy.cfg
-
重启服务
systemctl restart haproxy.service
02_"读"主机配置
- server3的默认发布目录下有upload目录及两个php文件
- 更改upload_file.php配置文件
- 增加upload目录权限
chmod 777 /var/www/html/upload
- 安装php
yum install -y php
- 重启apache
systemctl restart httpd.service
- 将文件upload_file.php拷贝给“写”server2段
scp upload_file.php server2:/var/www/html/
03_"写"主机配置
- 在/var/www/html下创建upload目录
mkdir upload
- 增加upload目录权限
chmod 777 /var/www/html/upload
- 安装php
yum install -y php
- 重启apache
systemctl restart httpd.service
测试:访问172.25.2.1/index.php,上传图片成功
在写端server2的upload目录下有上传的图片。