nginx+keepalived健康检查案例详解(解决nginx出现故障却不能快速切换到备份服务器的问题)
文章目录
- 简介
- 配置过程
- 前置环境请看
- 创建健康检查脚本
- 结果测试
简介
在我们通过nginx+keepalived实现高可用后,会发现nginx出现故障的时候keepalived并不会将虚拟ip切换到备份服务器上其原理就是nginx和keepalived是两个独立的服务,Nginx的故障状态不会触发Keepalived本身的故障转移机制。
所以我们可以通过配置健康检查机制来解决这个问题
配置过程
前置环境请看
链接: keepalived+nginx实现高可用的案例详解(主从模式)
lvs和nginx的配置都在前置环境里
主机名 | ip | 服务 | 虚拟ip |
---|---|---|---|
ngx1 | 192.168.10.11 | nginx+keepalived | 192.168.10.111 |
ngx2 | 192.168.10.12 | nginx+keepalived | 192.168.10.111 |
创建健康检查脚本
vim /etc/keepalived/chk_nginx_port.sh
#!/bin/bash
nginx_count=$(ps -C nginx --no-header | wc -l)
if [ $nginx_count -eq 0 ]; then
echo "Nginx is not running"
systemctl start nginx
nginx_count=$(ps -C nginx --no-header | wc -l)
if [ $nginx_count -eq 0 ]; then
systemctl stop keepalived
fi
fi
简单解释
这个脚本的作用是监测 Nginx 服务的运行状态,并在其未运行时尝试启动它。如果 Nginx 启动失败,脚本会停止 Keepalived 服务。
赋予这个脚本执行权限
chmod +x /etc/keepalived/chk_nginx_port.sh
更改keepalived配置文件
vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_DEVEL1
}
vrrp_script chk_nginx_port {
script "/etc/keepalived/chk_nginx_port.sh"
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.111
}
track_script {
chk_nginx_port
}
}
重启keepalived
systemctl restart keepalived
这个是主从的配置,所以从端不需要配置健康检查
如果是双主配置,另一端同理
结果测试
ngx1停止nginx服务
vim /etc/nginx/nginx.conf
随便添几个字母,让nginx起不来就好
重启nginx
systemctl restart nginx
可以看到会报错
查看ip
ip add
可以发现虚拟ip已经转移
到ngx2查看ip
ip add
可以看到转移过来的虚拟ip
访问虚拟ip
也是ngx2的web页面
其他服务同理,更改脚本内容即可