haproxy (负载均衡,读写分离,动静分离,301重定向,错误重定向,haproxy配置文件详解)

1.什么是haproxy?

  • HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
  • HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理,可以对浏览器中的http服务url报文进行解析。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。(有反向代理的功能)
  • HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。
  • 此模型的弊端是,haproxy是单核的,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

2.haproxy配置文件详解

(1)haproxy的安装

yum install haproxy -y (建议用rpm包装)

(2)haproxy配置文件详解

cd /etc/haproxy/  ##haproxy配置文件所在目录
vim haproxy.cfg    ##配置文件绝对路径/etc/haproxy/haproxy.cfg

global
log         127.0.0.1 local2 #全局的日志配置,使用log关键字
chroot      /var/lib/haproxy #改变当前工作目录
#修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限

pidfile     /var/run/haproxy.pid #当前进程id文件
maxconn     4000   #设定每个haproxy进程所接受的最大并发连接数
user        haproxy ##默认haproxy用户是存在的
group       haproxy
daemon  #让haproxy以守护进程的方式工作于后台

defaults
    mode                    http  #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
    log                     global    #应用全局的日志配置
    option                  httplog  # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志
    option                  dontlognull    # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器  或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
    option http-server-close #每次请求完毕后主动关闭http通道
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
# 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。

    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     #每个进程可用的最大连接数

3.开启haproxy日志

可以在配置文件中查看到haproxy的日志是2级日志

 20     # 2) configure local2 events to go to the /var/log/haproxy.log
 21     #   file. A line like the following can be added to
 22     #   /etc/sysconfig/syslog
 23     #
 24     #    local2.*                       /var/log/haproxy.log

配置:
vim /etc/rsyslog.conf 编辑日志管理服务配置文件

 15 $ModLoad imudp  ##开启UDP端口,接受haproxy日志
 16 $UDPServerRun 514

 55 local2.*                                 /var/log/haproxy.log ##日志文件所在路径

在这里插入图片描述
在这里插入图片描述

4. haproxy+apache负载均衡的实现

实验配置:

在负载均衡服务器方(server1):

(1)下载安装haproxy

yum install -y haproxy

(2)更改配置文件


 87 listen admin *:8080  ##监控负载均衡的页面,自动带有健康检查的功能
 88         stats enable
 89         stats uri /status ##监控页面地址
 90         stats auth admin:westos  ##监控帐号密码管理
 91         stats refresh 5s    ##监控刷新频率
 92 
 93 listen westos *:80   ##负载均衡策略
 94         balance roundrobin   ##轮询模式
 95         server web1 172.25.254.22:80 check
 96         server web2 172.25.254.23:80  check

在这里插入图片描述

(3)重启服务
注意:如果配置文件有语法错误,服务是启动不了的

systemctl start haproxy 

在RS–>server2 方

yum install -y httpd   ##编辑发布页面方便查看效果
vim /var/www/html/index.html
server1
systemctl start httpd 

在这里插入图片描述
在RS–>server3 方

yum install -y httpd   ##编辑发布页面方便查看效果
vim /var/www/html/index.html
server3
systemctl start httpd 

在这里插入图片描述
测试:
在真机上,curl http://172.25.19.23(负载均衡服务器的ip)不断测试

实现效果:haproxy不仅实现了负载均衡的效果;还起到了一个反向代理的作用,客户主机不知道真实服务器
在这里插入图片描述
在这里插入图片描述
监控查看(http://172.25.254.21:8080/status)
在这里插入图片描述
在这里插入图片描述
模拟RS挂机,自带健康检查:
在这里插入图片描述

5.haproxy实现动静分离访问

5.1 动静分离简述

  • 动静分离是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。

  • api接口服务化:动静分离之后,后端应用更为服务化,只需要通过提供api接口即可,可以为多个功能模块甚至是多个平台的功能使用,可以有效的节省后端人力,更便于功能维护。

  • 动静分离后,前后端只需要关心接口协议即可,各自的开发相互不干扰,并行开发,并行自测,可以有效的提高开发时间,也可以有些的减少联调时间

  • 动静分离可减轻后端服务器压力,提高静态资源访问速度:后端不用再将模板渲染为html返回给用户端,且静态服务器可以采用更为专业的技术提高静态资源的访问速度

5.2 动静分离的实现

配置:
在haproxy服务器方配置(server1):

(1)修改配置文件
vim /etc/haproxy/haproxy.cfg


#frontend:用来匹配接收客户所请求的域名,uri等,并针对不同的匹配,做不同的请求处理
frontend  westos *:80
    acl url_static       path_beg       -i  /images
    acl url_static       path_end       -i .jpg .gif .png

    use_backend static          if url_static
    default_backend  app (默认访问app)
#backend:定义后端服务器集群
backend static (静态) 
        #balance roundrobin
        server web2 172.25.42.14:80 check

backend app
        #balance roundrobin
        server web1 172.25.42.13:80 check
	server local 172.25.42.12:8000 backup (如果后端real server down掉 则调度报错页面 但是正常情况下不会访问 因为 是“backup”)



systemctl restart haproxy  ##重启服务

(2)添加httpd服务访问
yum install httpd -y 
vim /etc/httpd/conf/httpd.conf   ##修改http服务端口为为8000,因为80端口已经被haproxy占用
 42 Listen 8000
 vim /var/www/html/index.html  ##编写发布内容,模拟动态内容

systemctl start httpd ##启动http服务

在这里插入图片描述
在静态资源服务器方配置(server3):
在httpd服务创建静态资源目录,模拟静态资源找一个照片放在发布目录下
在这里插入图片描述

测试
在浏览器中分别模拟访问静态动态资源;静态资源:(http://172.25.254.21/redhat.jpg)真实访问的是172.25.254.23RS;
在这里插入图片描述
动态资源(http://172.25.254.21):真实访问的是172.25.254.22RS,根据所写的haproxy策略,当22主机宕掉了,会访问haproxy主机服务器。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6. haproxy错误重定向

实验一:403错误重定向
haproxy服务器方配置:

vim  /etc/haproxy/haproxy.cfg  ##编辑配置文件

frontend  westos *:80
    acl url_static       path_beg       -i  /images  #(以什么开头 默认根目录)
    acl url_static       path_end       -i .jpg .gif .png #(以什么结尾)

    acl badhost  src  172.25.254.3  #(模拟错误:设定谁不能访问我)
    block if badhost
    errorloc 403 http://172.25.42.21:8000 #(注意端口不要冲突)(403:服务器拒绝你的访问 服务器设定你是坏的 )(如果是403错误就重定向到 172.25.254.12:8000)

     use_backend static          if url_static
     default_backend  app

backend static
        balance roundrobin
        server web2 172.25.42.14:80 check

backend app
        balance roundrobin
        server web1 172.25.42.13:80 check



systemctl restart haproxy  ##重启服务

在这里插入图片描述
测试:
在浏览器中访问服务器 http://172.25.254.21
只设定谁不允许访问时:
在这里插入图片描述
403重定向访问:
在这里插入图片描述
实验二:所有错误重定向
在haproxy服务器方配置:

vim  /etc/haproxy/haproxy.cfg ##编辑配置文件

frontend  westos *:80
    acl url_static       path_beg       -i  /images  (以什么开头 默认根目录)
    acl url_static       path_end       -i .jpg .gif .png (以什么结尾)

    acl badhost  src  172.25.42.250  ##(设定谁不能访问我)
    redirect location http://172.25.42.12:8000 if badhost ##(如果出现错误访问 就重定向 不管是什么错误)

     use_backend static          if url_static
     default_backend  app


backend static
        balance roundrobin
        server web2 172.25.42.14:80 check

backend app
        balance roundrobin
        server web1 172.25.42.13:80 check

在这里插入图片描述
测试:
在浏览器中访问haproxy服务器,http://172.25.254.21
在这里插入图片描述

7. 301永久重定向(域名重定向)

301重定向与302定向:

  • 301 redirect: 301 代表永久性转移(Permanently Moved)
    302 redirect: 302 代表暂时性转移(emporarily Moved )

  • 详细来说,301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)这是它们的共同点。

  • 他们的不同在于301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址

配置:
之前其他的服务器配置不变

vim  /etc/haproxy/haproxy.cfg ##编辑配置文件

    acl westos.org hdr_beg(host) -i westos.org  
    acl 172.25.42.12 hdr_beg(host) -i 172.25.42.12
   redirect code 301 location http://www.westos.org if westos.org
     (以westos.org访问 自动重定向 www.westos.org)
     redirect code 301 location http://www.westos.org if 172.25.42.12
     (以172.25.42.12访问 自动重定向 www.westos.org)
     use_backend static          if url_static
     default_backend  app


systemctl  restart  haproxy ##重启服务

在这里插入图片描述
测试:
在物理机上使用curl -I 172.25.254.21获取报文信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.haproxy读写分离

什么是读写分离?

读写分离为了确保数据库产品的稳定性,很多数据库拥有双机热备功能。也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器;第二台数据库服务器,主要进行读的操作。

配置:
在两台real server 分别配置(server2和server3):

 yum install php -y
chmod 777 upload (默认上传目录一定要给权限)

在haproxy服务器方配置(server1):

vim /etc/haproxy/haproxy.cfg   ##编辑配置文件,编写调度策略


    acl read method GET      
    acl read method HEAD     //两个read write 只用一个就行
    acl write method PUT
    acl write method POST

     use_backend app          if write  
     default_backend  static (默认静态页面 为了测试 刚开始 www.westos.org 时是172.25.42.14 而写(上传时 却是在172.25.254.13 上进行的) 做到了读写分离)

backend static
        balance roundrobin
        server web2 172.25.42.14:80 check

backend app
        balance roundrobin
        server web1 172.25.42.13:80 check (默认会上传到这个real server)
        server local 172.25.42.12:8000 backup
  

在这里插入图片描述
测试:
在浏览器中访问 http://172.25.0.1/index.php
上传一张照片(模拟写操作),点击submit提交,提交成功后可以在写对应的RS上(server3)查看到提交资源
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值