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页面

其他服务同理,更改脚本内容即可

相关推荐
Jurio.12 分钟前
Python Ray 分布式计算应用
linux·开发语言·python·深度学习·机器学习
潮流coder29 分钟前
ssh公钥 key生成
运维·ssh
守城小轩1 小时前
基于Chrome140的Reddit账号自动化(关键词浏览)——运行脚本(三)
运维·自动化
eventer1231 小时前
构建 HertzBeat Docker 镜像的技术实践
运维·docker·容器
深耕AI1 小时前
【wordpress系列教程】02 Blocksy主题
运维·服务器·前端
元气满满-樱1 小时前
rewrite常用全局变量
nginx·web
遇见火星1 小时前
Jenkins核心部署流程
运维·jenkins
Sleepy MargulisItG2 小时前
Linux 权限基本理解
linux
_F_y2 小时前
Linux:自主shell编写
linux