首先搭建两台nginx
node1 192.168.31.128 (backup)
node2 192.168.31.129 (master)
两台node都安装keepalived服务
yum -y install keepalived
修改keepalived的配置文件
vim /etc/keepaliced/keepalived.conf
master的配置文件
#检测脚本
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本检测nginx是否启动
interval 2 #检测脚本执行的间隔单位是秒
weight 2 #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色MASTER为主BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号主从要一直
priority 100 # 优先级数值越大获取处理请求的优先级越高
advert_int 1 # 检查间隔默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
chk_http_port #调用检测脚本
}
virtual_ipaddress {
192.168.31.130 # 定义虚拟ip(VIP)可多设每行一个
}
}
backup的配置文件
#检测脚本
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本检测nginx是否启动
interval 2 #检测脚本执行的间隔
weight 2 #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色MASTER为主BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号主从要一直
priority 99 # 优先级数值越大获取处理请求的优先级越高
advert_int 1 # 检查间隔默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
chk_http_port #调用检测脚本
}
virtual_ipaddress {
192.168.31.130 # 定义虚拟ip(VIP)可多设每行一个
}
}
检测脚本
#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then #如果nginx没有启动就启动nginx
systemctl start nginx #重启nginx
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移
killall keepalived
fi
fi
启动keepalived
systemctl start keepalived
为了方便观察实验效果,我们修改两台节点的nginx 的index内容
/usr/share/nginx/html/index.html
访问vip(192.168.31.30)
可以看到是主nginx
那么我们关掉node(master)(或者关闭nginx)
恢复master
实验成功
如果vip是公网IP如何实现?
需要借助阿里云或者腾讯云的高可用虚拟IP实现(目前还在公测中),不过对于防范攻击意义不大,在遭受到ddos或者cc攻击时,当流量过大这个公网ip依然会被隔离(黑洞),nginx高可用只适用于防范服务器意外宕机的情况。