Haproxy+keepalived实现动静分离(基于端口的虚拟主机实现)

安装前准备:
    需要5台机器,两台安装haproxy+keepalived实现主从,其余三台做后台动态与静态的真实服务器。
     该实现后端主机使用基于端口的虚拟主机来实现。后端使用了4台虚拟主机,两静两动。关闭防火墙、selinux,保证时间均同步
VIP:192.168.0.100
haproxy1:192.168.0.121
haproxy2:192.168.0.124
http:192.168.0.127
配置:
1、安装haproxy、keepalived(2个节点均安装)

yum install haproxy -y
yum install keepalived -y 

2、配置haproxy。核心使用haproxy的acl功能。
     HAproxy可以工作在7层模型下,因此,要实现HAProxy的强大功能,一定要学会使用强大灵活的ACL规则,通过ACL规则实现基于Haproxy的只能负载均衡系统。
ACL一般有两种功能:
     (1)、通过设置的ACL规则检查客户端请求时候合法,如果符合ACL规则要求,那么就将放行;如果不符合规则,则直接中断请求。
     (2)、符合ACL规则要求的请求将被提交到后端的服务器集群,进而实现基于ACL规则的负载均衡。

frontend  web
    bind *:80
    acl url_static1       path_beg       -i /static /images /javascript /stylesheets
    acl url_static2       path_end       -i .jpg .gif .png .css .js
    acl nginx    path_beg -i /nginx
    acl php    path_end -i .php
    use_backend static1          if url_static1
    use_backend static2          if url_static2
    use_backend nginx          if nginx
    use_backend php          if php
backend static1
    balance     roundrobin
     server    web1    192.168.0.127:80 check
backend static2
    balance     roundrobin
     server    web2    192.168.0.127:81 check
backend nginx
    balance     roundrobin
     server    web3    192.168.0.127:82 check
backend php
    balance     roundrobin
     server    web4    192.168.0.127:83 check

     上述acl定义了四个ACL规则,分别是static1,static2,nginx,php。规则中的path_end,path_beg分别代表如果客户端的请求的URL中以.php,.gif,.png结尾则返回true。访问路径以/static/,/images,/nginx等开始时返回true.
     后面的use_backend行代表当满足ACL规则后要调度到哪个后端。例如:如果用户请求php动态内容时返回到83端口的虚拟主机。这些主机里也可以再使用多台主机实现负载均衡。
3、配置haproxy的监控web页面

listen    admin_stats
  bind *:81
  mode http
  stats enable
  stats hide-version
  stats refresh    20s
  stats uri /haproxy_stats
  stats realm welcome to haproxy
  stats auth gaofan:123456
  stats admin if TRUE

     利用本机81端口实现监控。
    
4、搭建虚拟主机,在服务端安装http或者nginx软件,实现基于端口的四台虚拟主机。该案例以httpd为例。

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<Directory "/var">
  Options Indexes FollowSymLinks
  AllowOverride none
#  Order allow,deny
#  Allow from all
  Require all granted
</Directory>

NameVirtualHost *:80
<VirtualHost *:80>
  ServerName static1.test.org
  DocumentRoot "/var/www/html/static1"
</VirtualHost>

NameVirtualHost *:81
<VirtualHost *:81>
  ServerName static2.test.org
  DocumentRoot "/var/www/html/static2"
</VirtualHost>

NameVirtualHost *:82
<VirtualHost *:82>
  ServerName nginx.test.org
  DocumentRoot "/var/www/html/nginx"
</VirtualHost>

NameVirtualHost *:83
<VirtualHost *:83>
  ServerName php.test.org
  DocumentRoot "/var/www/html/php"
</VirtualHost>

在httpd.conf文件中添加上述配置,并添加监听的端口

Listen 80
Listen 81
Listen 82
Listen 83

同时要注意注释掉httpd的默认根

#DocumentRoot "/var/www/html"

配置所需要的页面:

[root@ga html]# pwd
/var/www/html
[root@ga html]# tree .
.
├── nginx
│   └── nginx
│       └── index.html
├── php
│   └── test.php
├── static1
│   ├── images
│   │   └── index.html
│   ├── javascript
│   │   └── index.html
│   ├── static
│   │   └── index.html
│   └── stylesheets
│       └── index.html
└── static2
    └── 0.jpg

     利用虚拟主机与物理机其实原理都差不多。生产中就要严格区分动与静。动态的可以使用tomcat、PHP、Resin等,静态使用httpd、nginx等
4、启动httpd,先自己测试访问




5、测试都可以访问到,再来将代理端1的haproxy.cfg拷贝到代理端2。

scp /etc/haproxy/haproxy.cfg 192.168.0.124:/etc/haproxy/

6、打开haproxy的日志功能

[root@localhost keepalived]# vim /etc/rsyslog.conf
添加如下内容
# Save haproxy messages also to haproxy.log
local2.*                                                /var/log/haproxy.log
并且将记录的UDP与TCP的注释都打开

# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

7、重启日志,当有访问请求时就可以在/var/log/下看到haproxy的日志信息。

systemctl restart rsyslog

8、配置好haproxy后,建议两个代理端都用自身IP去访问不同的URL,看是否得到上述测试结果。若结果不对,最容易出错的地方就是ACL的配置,仔细检查。
9、配置keepalived

! Configuration File for keepalived

global_defs {
   notification_email {
   }
   router_id keepalived1
}
vrrp_script chk_haproxy {
  script "/etc/keepalived/check_haproxy3.sh"
  interval 1
  weight 10

}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 61
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.100
    }
    track_script {
        chk_haproxy
   }
}

将该文件拷贝到代理端2,同时修改state处为BACKUP,priority降低一点。
10、编写上述的检测haproxy脚本

[root@localhost keepalived]# cat ./check_haproxy3.sh
#!/bin/bash
if [ $(ps -C haproxy --noheader | wc -l) -eq 0 ]; then
    systemctl start haproxy
fi
sleep 2
if [ $(ps -C haproxy --noheader | wc -l ) -eq 0 ]; then
    systemctl start keepalived
fi

上述的检测方式特别多,目的就是检测当某一端haproxy如果down掉了,保证VIP可以漂移至另一端,实现高可用。
最常用的可以使用killall命令:

killall -0 haproxy

但是!笔者在测试时有时候就很奇怪,明明关掉了haproxy,VIP漂不过去,很纳闷!希望有大神可以指点。
11、启动haproxy、keepalived。
12、利用VIP访问测试:





13、再测试高可用状态,将代理端1 的haproxy关掉。看看VIP是否在代理端2,若不在就应该好好检查探测脚本。
14、查看监控页:

在该页面也可以实现调整后端真实服务端的状态。

15、Haproxy的功能是及其强大的,可以代理后端mysql的读操作,还可以接一个共享存储。可以尝试,共同探讨!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值