前言
对于 Nginx 高可用场景,学习到了 Nginx + Keepalived 实现 HA(High-Availability) 双机热备的相关内容,在虚拟机中完成了简单的实现以及测试,本文是对实现过程的记录。
参考目录
环境说明
- Linux 环境(CentOS 8)虚拟机两台。
- 主机IP:192.168.10.128,备份机IP:192.168.10.129。
- Nginx 版本 1.17.3。
实现说明

- 有两台机器,当客户端请求访问时,访问的是由 Keepalived 配置自定义的虚拟IP(vip 192.168.10.200),而非机器真实IP。
- 默认情况下,vip 指向的是主机(192.168.10.128),只有当异常情况下主机服务不可用时,才会指向备用机(192.168.10.129)。
- 异常情况一:主机 Keepalived 不可用时,vip 会指向备用机。
- 异常情况二:主机 Nginx 不可用时,vip 无法自动检测到该异常,需要 Nginx 检测脚本定时检测 Nginx 情况,如果检测到 Nginx 出现异常无法启动,则会杀死 Keepalived 进程,使 vip 指向备用机。
Nginx 安装
这一步骤在此不再赘述。
为了方便查看,在 html 文件夹下的 index.html 文件加上了本机的IP,如下图: 
Keepalived 安装
yum 安装
yum install keepalived
修改配置 keepalived.conf
配置文件位置:
/etc/keepalived/keepalived.conf
此处只保留了主要配置,其他配置可以查看参考目录自行添加。
主机配置:
! Configuration File for keepalived
global_defs {
router_id lb128
}
vrrp_instance myserver {
state MASTER
interface ens160
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.200
}
}
备份机配置:
! Configuration File for keepalived
global_defs {
router_id lb129
}
vrrp_instance myserver {
state BACKUP
interface ens160
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.200
}
}
注意事项:
- router_id 可以自定义。
- myserver 实例名称可以自定义。
- interface ens160 是我本机的网卡名称,需要根据自身的情况进行修改,查看命令:
ip addr 。 
启动服务
配置完成后启动服务查看状态:
systemctl start keepalived
systemctl status keepalived
主机: 
备用机: 
设置开机启动
chkconfig keepalived on

访问测试
使用虚拟IP访问,会指向主机。 
异常情况一:Keepalived 不可用
 主机 Keepalived 不可用时,虚拟IP会指向备用机。
关闭主机 Keepalived
systemctl stop keepalived
 查看IP:
ip addr
 IP没有虚拟地址只有真实地址。
访问测试:指向备用机
使用虚拟IP访问,会指向备用机。 
查看备用机 Keepalived 状态
查看IP:
ip addr
 IP有虚拟地址。
查看 Keepalived 状态:
systemctl status keepalived

重新开启主机 Keepalived
虚拟IP会重新指向主机,因为主机权重比备用机高,主机 Keepalived 重启时会重新进行选举。
异常情况二:Nginx 不可用
 在视频里面这种情况有提及,但是没有做具体实现。
在前文说明中已经概况了这一实现的方式,所以这里不再赘述。
关闭主机 Nginx

访问测试:无法使用虚拟IP访问
 Keepalived 正常,所以 vip 无法指向备用机。
Nginx 检测脚本 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
首先查看 nginx 是否运行(ps -C nginx --no-header |wc -l ),如果没有启动则执行命令启动(/usr/local/nginx/sbin/nginx ),休眠 2s 再进行判断,如果还是无法启动则杀掉 keepalived 进程。
赋予脚本权限:
chmod 777 /etc/keepalived/nginx_check.sh
脚本执行:
sh /etc/keepalived/nginx_check.sh
定时执行脚本:
crontab -e
*/1 * * * * sh /etc/keepalived/nginx_check.sh 2> /usr/local/logs/keepalived/error.log
脚本启动后即可监控 Nginx 状态。
|