天天看点

HAProxy

1 关于HAProxy

1.1 介绍:

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

1.2 衡量负责均衡器性能的因素:

Session rate 会话率:每秒钟产生的会话数

Session concurrency 并发会话数:服务器处理会话的时间越长,并发会话数越多

Data rate 数据速率:高会话数,高数据速率要求更多的内存

1.3 HAProxy工作模式:

mode http:客户端请求被深度分析后再发往服务器

mode tcp: 客户端与服务器之间建立会话,不检查第七层信息

mode health: 仅做健康状态检查,已经不建议使用

1.4 配置文件说明:

global部分:全局设置进程级别参数

default:为后续的其它部分设置缺省参数    缺省参数可以被后续部分重置

frontend:描述接收客户端侦听套字节集

backend:描述转发链接的服务器集

listen:把frontend和backend结合到一起的完整声明

vim /etc/haproxy/haproxy.cfg

###########全局配置#########

global

    log            127.0.0.1 local2         #日志输出配置,所有日志都记录在本机,通过local2输出

    chroot      /var/lib/haproxy          #chroot运行路径

    pidfile      /var/run/haproxy.pid    #pid存放的路径

    maxconn     4000                      #最大的连接数

    user             haproxy

    group           haproxy

    daemon                                    #以守护进程运行

###########默认配置#########

defaults

    mode           http                  #默认的模式mode {  tcp|http|health },tcp是4层,http是7层,health只返回OK

    log               global

    option          httplog             #日志类别,采用httplog

    option         dontlognull       #不记录健康检查日志信息

    option         http-server-close            #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式实现

    option   forwardfor   except 127.0.0.0/8

    option         redispatch     

    retries        3                              #3次连接失败就认为服务器不可用

    timeout http-request    10s        #默认http请求超时时间

    timeout queue             1m         #默认队列超时时间

    timeout connect           10s       #连接超时

    timeout client               1m        #客户端超时

    timeout server             1m        #服务器超时

    timeout http-keep-alive 10s      #默认持久连接超时时间

    timeout check             10s        #心跳监测超时

    maxconn                     3000     #最大连接数

###########统计页面配置#########

listen stats

   bind 0.0.0.0:1080  #监听端口

   stats refresh 30s   #统计页面自动刷新时间

   stats uri  /stats      #统计页面url

   stats realm Haproxy Manager #统计页面密码框上提示文本

   stats auth admin:admin   #统计页面用户名和密码设置,可以设置多个

   stats hide-version            #隐藏统计页面上HAProxy的版本信息

###########frontend前端配置#########

#原配置文件说明

frontend  main *:5000

    acl url_static       path_beg       -i /static /images /javascript /stylesheets    #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问这个域名就触发images等规则

    acl url_static       path_end       -i .jpg .gif .png .css .js

    #path_beg 匹配路径的开头,path_end 匹配路径的结尾

   use_backend static          if url_static  

   default_backend              app

#自定义配置文件

frontend  web 192.168.4.100:80               #定义前端的名称

   acl url_html      path_end      -i .html       #匹配url的结尾

   acl url_php       path_end      -i .php       #匹配.php的结尾

   use_backend  html-group     if url_html    #定义后端服务组(以html结尾)

   use_backend  php-group      if url_php     #定义后端服务组(以php结尾)

   default_backend         html-group             #默认后端服务组(仅IP)

backend html-group                    #后端服务组的具体的信息

    balance     roundrobin             #轮询调度算法

    server  app101 192.168.4.101:80 check  

    server  app102 192.168.4.102:80 check

backend php-group

    balance     roundrobin

    server  app103 192.168.4.103:80 check

    server  app104 192.168.4.104:80 check

###########backend后端配置#########

backend static                     #backend起的名称,static作用域

    balance     roundrobin     #调度算法

    server      static 127.0.0.1:4331 check

backend app

    balance     roundrobin

    server  app1 127.0.0.1:5001 check

    server  app2 127.0.0.1:5002 check

    server  app3 127.0.0.1:5003 check

    server  app4 127.0.0.1:5004 check

listen webserver 0.0.0.0:80             #webserver:名称,允许所有通过80端口访问

    cookie SERVERID rewrite           #记录客户端访问网站服务器的cookie信息

    balance roundrobin                      #调度算法

    server  server44 192.168.4.44:80 cookie app44 check inter 2000 rise 2 fall 5

    server  server45 192.168.4.45:80 cookie app45 check inter 2000 rise 2 fall 5

    #后端服务器命名server44     cookie 为cookie命名app44

2 案例1普通LB集群

HAProxy服务器:RHEL7.2   IP:192.168.4.41

web:192.168.4.44 192.168.40.45

2.1 配置

[root@ser100 ~]# yum -y install haproxy

[root@ser100 ~]# vim /etc/haproxy/haproxy.cfg

#删除default以下的其它配置,添加如下配置

listen webserver 0.0.0.0:80     #webserver:名称  允许所有通过80端口访问

  cookie SERVERID rewrite    #记录客户端访问网站服务器的cookie信息

  balance roundrobin              #调度算法

  server web101 192.168.4.44:80 cookie app101 check inter 2000 rise 2 fall 5

  server web102 192.168.4.45:80 cookie app102 check inter 2000 rise 2 fall 5

  #后端服务器  cookie app101 为cookie命名

在defaults 最后一行添加  stats  uri  /admin

http://192.168.4.41/admin  是URL

去掉http://192.168.4.41 剩下的就是uri

也可以单独添加:

   stats uri  /admin      #统计页面url

   stats auth admin:admin          #统计页面用户名和密码设置

   stats hide-version                   #隐藏统计页面上HAProxy的版本信息

2.2 启动服务

[root@ser41 ~]# systemctl start haproxy

[root@ser41 ~]# systemctl enable haproxy

2.3 访问

http://192.168.4.41/admin  (根据配置文件)

3 案例2区分业务的LB集群

做普通LB集群对配置文件做了备份,现在对配置文件重新配置

区分不同的业务:在应用层区分

准备4台web服务器,4台web服务器的/var/www/html路径下都存放 .html和.php结尾的文件

3.1 配置

在web服务器上:

yum -y install php           #解释php代码

systemctl restart httpd    #重新加载php模块

vim /var/www/html/a.php

<?php

echo “web42”;

?>

vim /var/www/html/a.html

i am web42

[root@ser41 ~]# vim /etc/haproxy/haproxy.cfg

frontend  webgroup 192.168.4.41:80     #定义前端的名称webgroup,允许只能通过某个ip的某个端口访问

  # acl url_static     path_beg      -i /static  

    acl url_html      path_end      -i .html     #匹配url以html的结尾

    acl url_php       path_end      -i .php     #匹配url以php的结尾

    use_backend  html-group     if url_html   #定义后端服务组(以html结尾)

    use_backend  php-group      if url_php    #定义后端服务组(以php结尾)

    default_backend         html-group           #默认后端服务组(仅IP)

    backend html-group           #后端服务组的具体的信息

        balance     roundrobin    #轮询调度算法

        server  web44 192.168.4.44:80 check   #后端真正的服务器,check:做健康性检查

        server  web45 192.168.4.45:80 check

    backend php-group

        balance     roundrobin

        server  web42 192.168.4.42:80 check

        server  web43 192.168.4.43:80 check

3.2 客户端测试

elinks -dump  http://192.168.4.41/a.html   #结果:轮询只出现在web44,web45

elinks -dump  http://192.168.4.41/a.php   #结果:轮询只出现在web42,web43

继续阅读