HAProxy基于Keepalived做高可用并简单实现Web站点的动静分离

HAProxy简介

  HAProxy 是一个免费的,非常快速和可靠的解决方案,提供 高可用性, 负载均衡和代理对TCP和HTTP的应用程序。它特别适用于非常大流量网站。多年来,它已成为标准开源的负载均衡,现在随最主流的Linux发行版,并且通常默认的云平台部署。

haproxy | center

haproxy-pmode.png


实验描述

1、本实验主要是在前端放置两台通过Keepalived做了高可用的HAProxy反向代理服务器,并实现后端Web站点的动静分离
2、主机列表
节点名称 eth0 eth1 虚拟IP 主要功能
node1 172.16.100.1 192.168.1.11 192.168.1.10 HAProxy Active
node2 172.16.100.2 192.168.1.12 192.168.1.10 HAProxy Backup
node3 172.16.100.3 HTTP Static
node4 172.16.100.4 HTTP Dynamic

详细配置

一、基本配置

1、所有节点的/etc/hosts解析
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.100.1 node1 node1.redhat.com
172.16.100.2 node2 node2.redhat.com
172.16.100.3 node3 node3.redhat.com
172.16.100.3 node3 node3.redhat.com
2、ssh互信

node1

[root@node1 ~]# ssh-keygen -t rsa -P “”
[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub node2

node2

[root@node2 ~]# ssh-keygen -t rsa -P “”
[root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub node1

3、时间同步

node1

[root@node1 ~]# ntpdate 172.16.0.254

node2

[root@node2 ~]# ntpdate 172.16.0.254

查看时间是否同步

[root@node1 ~]# date;ssh node2 ‘date’
Sat Apr 16 10:59:11 CST 2016
Sat Apr 16 10:59:11 CST 2016


二、配置node1与node2节点的KeepAlived服务

1、在两个上’安装keepalived

[root@node1 ~]# yum install keepalived -y;ssh node2 ‘yum install keepalived -y’

2、在node1上编辑配置文件

[root@node1 ~]# vim /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from admin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_maintanance {
    script "[ -f /etc/keepalived/down ] && exit 1 || exit 0"
    interval 3
    weight -20
}
vrrp_instance VI_1 {
    state MASTER              #配置为主节点
    interface eth1            #将虚拟IP配置在eth1接口
    virtual_router_id 51
    priority 100              #权重为100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 5cd403375c990da360bcaf06      #认证密码,与所有节点的要保持一致
    }
    virtual_ipaddress {
        192.168.1.10          #虚拟IP地址
    }
    track_script {
        chk_maintanance
    }
}
3、复制配置文件到node2

[root@node1 ~]# scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/keepalived.conf

4、在node2上修改配置文件为BACKUP节点

[root@node2 ~]# vim /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
    root@localhost
   }
   notification_email_from admin@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_maintanance {
    script "[ -f /etc/keepalived/down ] && exit 1 || exit 0"
    interval 3
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP              #配置为备用节点
    interface eth1            #将虚拟IP配置在eth1接口
    virtual_router_id 51
    priority 99               #权重为99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 5cd403375c990da360bcaf06      #认证密码,与所有节点的要保持一致
    }
    virtual_ipaddress {
        192.168.1.10          #虚拟IP地址
    }
    track_script {
        chk_maintanance
    }
}

5、将两个节点的keepalived服务启动

[root@node1 ~]# service keepalived start;ssh node2 ‘service keepalived start’


三、配置node1与node2节点的HAProxy服务

1、在两个节点上安装haproxy

[root@node1 ~]# yum install haproxy -y;ssh node2 ‘yum install haproxy -y’

2、在node1上编辑配置文件

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

global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend  main *:80
    acl url_static       path_beg       -i /static /images /javascript /stylesheets  #静态内容的ACL规则
    acl url_static       path_end       -i .jpg .gif .png .css .js                   #静态内容的ACL规则

    use_backend static          if url_static         #如果符合静态内容的acl,那么就使用static服务器。
    default_backend             dynamic               #没有被静态内容的ACL匹配到的请求,都将使用dynamic服务器

backend static
    balance     roundrobin                            #轮调算法,
    server  node3 172.16.100.3:80 check               #静态服务器地址

backend dynamic
    balance     roundrobin                            #轮调算法
    cookie  SRV_ID  insert  nocache                   #做cookie绑定
    server  node4 172.16.100.4:80 check cookie node4  #动态服务器地址,并设置cookie value
4、编辑rsyslog文件,使haproxy的日志配置生效

[root@node1 ~]# vim /etc/rsyslog.conf

$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog # provides kernel logging support (previously done by rklogd)

$ModLoad imudp #工作在udp协议
$UDPServerRun 514 #允许514端口接收使用UDP协议转发过来的日志

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

$IncludeConfig /etc/rsyslog.d/*.conf

*.info;mail.none;authpriv.none;cron.none /var/log/messages

authpriv.* /var/log/secure

mail.* -/var/log/maillog

cron.* /var/log/cron

*.emerg *

uucp,news.crit /var/log/spooler

local7.* /var/log/boot.log
local2.* /var/log/haproxy.log #与haproxy里面的日志设置相对应
5、将修改好的配置文件复制到node2

[root@node1 ~]# scp /etc/rsyslog.conf node2:/etc/rsyslog.conf
[root@node1 ~]# scp /etc/haproxy/haproxy.cfg node2:/etc/haproxy/haproxy.cfg

6、启动haproxy服务并重启rsyslog服务

[root@node1 ~]# service haproxy start;ssh node2 ‘service haproxy start’
[root@node1 ~]# service rsyslog restart;ssh node2 ‘service rsyslog restart’


四、配置静态站点

1、node3安装httpd服务

[root@node3 ~]# yum install httpd -y

2、在/var/www/html/目录下准备一张图片

[root@node3 ~]# ls /var/www/html/
magedu.png

3、启动httpd服务

[root@node3 ~]# service httpd start


五、配置动态站点

1、node4安装httpd和php服务

[root@node3 ~]# yum install httpd php -y

2、在/var/www/html/目录下准备一个index.php文件

[root@node4 ~]# vim /var/www/html/index.php

<html>
    <head><title>Welcome to magedu.com</title></head>
    <body>
        <img src="/magedu.png"/>
        <?php
        echo "<h1>Welcome to Magedu</h1>";
        ?>
    </body>
</html>
3、启动httpd服务

[root@node3 ~]# service httpd start


实验测试

一、KeepAlived为HAProxy实现高可用的测试

1、首先查看MASTER节点的虚拟IP是否配置成功

Alt textMASTER_IP.jpg

可以看到虚拟IP在eth1接口上配置成功

2、打开浏览器,输入虚拟地址进行测试

Alt text1.gif

测试没有问题

3、将node1节点down掉,查看BACKUP节点状态

[root@node1 ~]# touch /etc/keepalived/down

Alt textBACKUP_IP.jpg

虚拟IP转移到了node2

4、刷新浏览器,看是否还能继续访问

Alt text2.gif

测试没有问题


二、Web网站的动静分离测试

1、打开浏览器,按F12打开调试工具,输入虚拟地址,查看资源是否都被加载

Alt text3.gif

网页文件与图片资源都加载成功

2、关闭node3的httpd服务,测试是否还能继续加载资源

[root@node3 ~]# service httpd stop

Alt text4.gif

当静态服务器停止服务后,图片资源加载不到了

3、将node3的httpd服务恢复,测试是否还能继续加载资源

[root@node3 ~]# service httpd start

Alt text5.gif

当静态服务器恢复服务后,图片资源又能正常加载了


实验总结

  在backend dynamic里面,我加入了cookie绑定,但服务器只有一台,这是为了做实验方便,有兴趣的同学可以多加入几台服务器,测试下cookie绑定的效果,还是很不错的。实验就做到这里,如果在实验过程中有问题,可以在评论区留言交流。


原创文章,作者:张小凡,如若转载,请注明出处:http://www.178linux.com/14923

(0)
张小凡张小凡
上一篇 2016-04-16
下一篇 2016-04-16

相关推荐

  • 使用httpd反向代理模块实现tomcat负载均衡集群(下)

    上一篇讲解了http使用mod_http和mod_ajp代理模块实现tomcat负载均衡,下面我们来讲解使用http的mod_jk实现taomcat的负载均衡集群: 注意:http的mod_jk是第三方扩展模块,在新http版本中以不支持,在httpd 1.3和2.0效果较好 6、使用mod_jk实现tomcat负载均衡集群 6.1安装mod_jk [roo…

    Linux干货 2015-07-21
  • vim文本编辑器练习

    1、复制/etc/profile至/tmp/目录,用查找替换命令删除/tmp/profile文件中的行首的空白字符? :%s@^[[:space:]]\+@@gc   2、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首添加一个#号? :%s@^[…

    Linux干货 2016-08-12
  • 马哥教育网络班21期+第11周课程练习

    1、详细描述一次加密通讯的过程,结合图示最佳。 首先发送方用单向加密的方法提取数据的特征码,用自己的私钥加密这段特征码,并附加到数据的后面。 发送方用对称加密算法把数据及特征码整个进行加密。 发送方用接收发的公钥加密对称密钥并附加到数据后面。 接收方用私钥解密对称密钥。 接收方用对称密钥解密出数据及加密的特征码。 接收方用发送方的公钥解密特征码,并用相同的算…

    Linux干货 2016-10-09
  • 十二.Linux博客-2016年8月16日文件查找和压缩、rpm包管理、while循环、until循环

    格式说明: 操作 概念 命令 说明及举例 十二.文件查找和压缩、rpm包管理、yum、while循环、until循环 tar tar -zcvf /testdir/etc.tar.gz /etc/ 备份etc创建etc.tar.gz文件 压缩为gz格式 显示过程 tar -jcvf&nbs…

    Linux干货 2016-08-24
  • Week 1–Linux基础2

    四. Linux系统命令使用格式:  但首先,在linux中我们要知道linux系统中基本的命令格式如下: 命令字 【命令选项】 【命令参数】   Command 【option】 【arguments】 在这里主要介绍这几个命令的使用格式(Ifconfig,echo, tty, startx, export, pwd, history, shut…

    Linux干货 2016-12-05
  • 五大主流数据库模型

    导读:无论是关系型数据库还是非关系型数据库,都是某种数据模型的实现。本文将为大家简要介绍5种常见的数据模型,让我们来追本溯源,窥探现在流行的数据库解决方案背后的神秘世界。 什么是数据模型? 访问数据库中的数据取决于数据库实现的数据模型。数据模型会影响客户端通过API对数据的操作。不同的数据模型可能会提供或多或少的功能。一般而言,数据模型不会直接提供过多的功能…

    Linux干货 2015-04-04