文章目录
1. HAProxy简介
HAProxy官网:https://www.haproxy.org/
1.1 HAProxy
HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站点, 这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的 web 服务器不被暴露到网络上
- 安装:
yum install -y haproxy
1.2 配置文件参数
- global:设置全局配置参数,属于进程的配置,通常是和操作系统相关
- defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件
- frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend
- backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器
- Listen:frontend和backend的组合体
1.3 配置文件说明
global:全局参数的设置
log 127.0.0.1 local2#指定日志设备
chroot /var/lib/haproxy#jail 目录
pidfile /var/run/haproxy.pid#定义haproxy的pid
maxconn 4000#定义每个haproxy进程的最大连接数
#由于每个连接包括一个客户端和一个服务器端,所以单个进程的TCP会话最大数目将是该值的两倍。
user haproxy# 设置运行haproxy的用户,也可用uid
group haproxy# 设置运行haproxy的组,也可用gid
daemon# 以守护进程的方式运行
#nbproc 16# 设置haproxy启动时的进程数
stats socket /var/lib/haproxy/stats#
defaults:默认部分的定义
mode http#mode {http|tcp|health}
#http是七层模式,tcp是四层模式,health是健康检测,返回OK
log global#应用全局的日志配置
option httplog#http 日志格式
option dontlognull #禁用空链接日志
option http-server-close#每次请求完毕后主动关闭http通道
option forwardfor except 127.0.0.0/8
option redispatch #当 client 连接到挂掉的机器时,重新分配到健康的主机
retries 3#连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
timeout http-request 10s#http请求超时时间
timeout queue 1m#一个请求在队列里的超时时间
timeout connect 10s#连接超时
timeout client 1m#客户端超时
timeout server 1m#服务器端超时
timeout http-keep-alive 10s#设置http-keep-alive的超时时间
timeout check 10s#检测超时
maxconn 3000#定义每个haproxy进程的最大连接数
stats uri /status#haproxy 监控页面
stats auth admin:westos#设置统计页面认证的用户和密码
frontend:前端
frontend main *:80#前端,监听的实例名称main、地址、端口
#定义一个名叫url_static的acl,匹配路径以下面几个开头的
acl url_static path_beg -i /static /images /javascript /stylesheets
#定义一个名叫url_static的acl,当请求的url末尾是以.jpg.gif等结尾的,将会被匹配到
acl url_static path_end -i .jpg .gif .png .css .js
# 如果满足策略url_static时,就将请求交予backend static
use_backend static if url_static
#默认后端,名称为app
default_backend app
backend:后端
backend app#定义一个名为app的后端
balance roundrobin# 设置haproxy的调度算法
#使用server关键字来设置后端服务器
#后端服务内部名称为app1,app2
#后端服务器的IP和端口
#check接受健康监测
server app1 192.168.17.2:80 check
server app2 192.168.17.3:80 check
2. HAProxy日志配置
vim /etc/rsyslog.conf
:编辑日志配置文件
$ModLoad imudp
$UDPServerRun 514#开启日志端口
*.info;mail.none;authpriv.none;cron.none;local.none /var/log/messages
local2.* /var/log/haproxy.log
systemctl restart rsyslog.service
:重启日志服务systemctl start haproxy.service
:开启haproxy服务cat /var/log/haproxy.log
3. 配置haproxy并设置加密访问
vim /etc/haproxy/haproxy.cfg
stats uri /status#设置统计页面的uri为/status
stats auth admin:westos#设置统计页面认证的用户和密码
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
backend app#后端
balance roundrobin#调度算法
server app1 192.168.17.2:80 check
server app2 192.168.17.3:80 check
- 重启服务:
systemctl restart haproxy.service
netstat -antlupe
:可以查看到haproxy端口号为80
- 访问测试
4. 调度source算法
将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器.这可以使得同一个客户端IP的请求始终被派发至某特定的服务器.不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器.常用于负载均衡无cookie功能的基于TCP的协议.其默认为静态,不过也可以使用hash-type修改此特性
vim /etc/haproxy/haproxy.cfg
- 重启服务:
systemctl restart haproxy.service
- 测试
- 实验完改回rr算法,轮询调度,并重启服务
5. 默认后端与备用后端
vim /etc/haproxy/haproxy.cfg
- 重启服务:
systemctl restart haproxy.service
- 在static的后端server2主机的发布目录下建立目录images,并传入一张图片
- 测试1:访问 http://192.168.17.1/status
- 测试2:访问http://192.168.17.1/images
6. 备用服务器backup
vim /etc/haproxy/haproxy.cfg
vim /etc/httpd/conf/httpd.conf
:修改Apache端口号为8080,开启httpd
- 重启服务:
systemctl restart haproxy.service
- 测试:当默认后端服务器server3宕机后,自动访问本机成功
7. 黑名单与白名单
1 黑名单
vim /etc/haproxy/haproxy.cfg
- 重启服务:
systemctl restart haproxy.service
- 测试:用黑名单中的主机访问192.168.17.1访问失败!但是其他主机却可以正常访问!
2 白名单:设置仅黑名单主机可访问即为白名单
3 设置黑名单为整个网段
#一个网段不能访问
acl blacklist src 192.168.17.0/24
block if blacklist
8. 重定向
8.1 发生错误后重定向
vim /etc/haproxy/haproxy.cfg
acl blacklist src 192.168.17.250
block if blacklist
errorloc 403 http://www.baidu.com
- 重启服务:
systemctl restart haproxy.service
- 测试
8.2 直接重定向
vim /etc/haproxy/haproxy.cfg
#全局重定向
redirect location http://www.westos.org
#仅黑名单重定向
redirect location http://www.westos.org if blacklist
- 重启服务:
systemctl restart haproxy.service
- 测试
9. 访问控制
vim /etc/haproxy/haproxy.cfg
acl list src 192.168.17.250
acl denyjpg path /images/wsx.png
http-request deny if denyjpg list
- 重启服务:
systemctl restart haproxy.service
- 测试
10. 读写分离
10.1 HAProxy主机配置
vim /etc/haproxy/haproxy.cfg
acl write method PUT
acl write method POST#(HEAD为读)
use_backend static if write
- 重启服务:
systemctl restart haproxy.service
10.2 读 调用的后端主机配置
server3
yum install -y php
systemctl restart httpd.service
- 在server3的默认发布目录下有一个目录upload,两个php文件
chmod 777 /var/www/html/upload/
scp upload_file.php [email protected]:/var/www/html/
:向读的后端传入php文件
- 测试:访问http://192.168.17.1/index.php,但是不能上传.ipg图片
10.3 写 调用的后端主机配置
yum install -y php
systemctl restart httpd.service
- 测试:访问http://192.168.17.1/index.php,上传.jpg图片成功!