首先我们说一下整体思路,如图
每个NGINX都有个自己的IP地址,但是让他俩来共同轮流使用一个VIP,以便主(MASTER)宕机后备(BACKUP)来接替VIP来继续提供服务。
这里我们用四台虚拟机,来分别代表NGINX1、NGINX2、WEB1、WEB2,WEB3忽略就好。
准备工作
关闭所有机器的防火墙等安全机制
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0
NGINX测试机安装keepalived
[root@nginx ~]# yum -y install keepalived ipvsadm
WEB测试机安装apache,这里直接用yum安装
[root@node ~]# yum -y install httpd
NGINX1配置
首先修改主配置文件
[root@nginx1 ~]# vim /usr/local/nginx/conf/nginx.conf
**
http{
***略***
upstream apache_pool {
server 192.168.200.11:80 weight=1;
server 192.168.200.112:80 weight=1;
}
server {
***略***
location / {
root html;
index index.html index.htm;
proxy_pass http://apache_pool;
proxy_set_header Host $http_host;
}
}
}
**
keepalived配置文件修改
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port {
script "/check/chk_nginx" #通过此脚本检测
interval 2 #执行时间间隔,默认单位秒
weight -20 #脚本执行成功后降低的优先级,这里是-5
fall 2 #检测两次失败后才确定失败
rise 1 #检测一次成功即成功
}
vrrp_instance VI_1 {
state MASTER
interface eno16777728
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.254
}
track_script { #引用VRRP脚本,即在 vrrp_script 部分指定的名字。
chk_http_port
}
}
写一个检测NGINX状态的脚步,如果NGINX出现问题的话,停止keepalived服务,让出VIP。
[root@nginx ~]# mkdir /check
[root@nginx ~]# vim /check/chk_nginx
***
#bin/bash
ps -C nginx --no-heading >/dev/null
if [ $? -ne 0 ]
then
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
sleep 2
ps -C nginx --no-heading >/dev/null
if [ $? -ne 0 ]
then
systemctl stop keepalived
#killall -9 keepalived
fi
fi
***
[root@nginx ~]# chmod +x /chech/chk_nginx
NGINX2的配置与1相同,这里就不做多解释了
开启网络服务
[root@node1 ~]# systemctl start httpd
测试
NGINX测试机开启keepalived服务
[root@nginx ~]# systemctl start keepalived
用网页查看
当主动关闭NGINX1服务是,我们可以看到VIP跑到了NGINX2上,因为脚本的原因,我们可以选择关闭NGINX1的网卡来进行故障测试
首先我们看到2没有 VIP地址
关闭1的网卡后
我们可以看到2上已经获取到了VIP地址