keepalived实现nginx的高可用
注意:这里nginx以及keepalived已经装好了,如果没有装好请参考我的安装部署文档
1、修改 Keepalived 配置文件(keepalived.conf)
(1) MASTER 节点配置文件(192.168.44.71)
vim /etc/keepalived/keepalived.conf
先查一下本机 IP 地址所在的网络接口相同, 我的是 eth0,后面用得着

以下两张图片分开截的
! Configuration File for keepalived
global_defs {
router_id 192.168.44.71 ## 标识本节点的字条串,通常为 hostname
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
interval 2 ## 检测时间间隔
weight -20 ## 如果条件成立,权重-20
}
vrrp_instance VI_1 {
state MASTER ## 主节点为 MASTER, 对应的备份节点为 BACKUP
interface eth0 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同, 我的是 eth0
virtual_router_id 71 ## 虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址
mcast_src_ip 192.168.44.71 ## 本机 IP 地址
priority 100 ## 节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
nopreempt ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样, 默认 1s
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx ## 执行 Nginx 监控的服务
}
virtual_ipaddress {
192.168.44.70 ## 虚拟 ip,可以定义多个
}
}
(2)BACKUP 节点配置文件(192.168.44.73)
vim /etc/keepalived/keepalived.conf
先查一下本机 IP 地址所在的网络接口相同, 我的是 eth0,后面用得着
! Configuration File for keepalived
global_defs {
router_id 192.168.44.73 ## 标识本节点的字条串,通常为 hostname
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 71
mcast_src_ip 192.168.44.73 ## 本机 IP 地址
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
## 将 track_script 块加入 instance 配置块
track_script {
chk_nginx ## 执行 Nginx 监控的服务
}
# 虚拟 IP 池, 两个节点设置必须一样
virtual_ipaddress {
192.168.44.70
}
}
2、编写 Nginx 状态检测脚本 主从服务器上都要,所以两份
编写 Nginx 状态检测脚本 /etc/keepalived/nginx_check.sh (已在 keepalived.conf 中配置)脚本要求:如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程, keepalied将虚拟 ip 绑定到 BACKUP 机器上。 内容如下:
vim /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
保存后,给脚本赋执行权限:
chmod +x /etc/keepalived/nginx_check.sh
3、启动 Keepalived nginx
/usr/local/nginx/sbin/nginx -s reload
service keepalived start
4、Keepalived+Nginx 的高可用测试
同时启动192.168.44.71和192.168.44.73上的Nginx和Keepalived,我们通过VIP(192.168.44.70)来访问Nginx,如下:
注意:我这里由于网络原因配置隧道转发,所以用127.0.0.1分别配置了端口号!!!
1)启动192.168.44.71来访问Nginx
2)启动192.168.44.73来访问Nginx
3)启动192.168.44.70来访问Nginx
5、开始测试
我们关闭192.168.44.71(主)上的Keepalived和Nginx
cd /usr/local/nginx/sbin/
./nginx -s stop
pkill keepalived
此时,我们再通过VIP(192.168.44.70)来访问Nginx,如下
我们再开启192.168.44.71上的Keepalived和Nginx
在192.168.44.71执行如下命令:
./nginx -s reload
service keepalived start
因为我们写了脚本nginx_check.sh,这个脚本会为我们自动自动Nginx。
此时,我们再通过VIP(192.168.44.70)来访问Nginx,如下