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

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

相关推荐
N1cez34 分钟前
linux conda 安装 配置
linux·conda
snpgroupcn35 分钟前
深入了解SAP物料类型是什么?
运维·数据库
GOTXX39 分钟前
【计算机网络】初识Socket编程,揭秘Socket编程艺术--UDP篇
linux·开发语言·网络·计算机网络·php·socket·套接字
蓝天扶光40 分钟前
初识Linux以及Linux的基本命令
linux·运维·服务器
cyt涛1 小时前
WEB服务器——Tomcat
运维·服务器·http·servlet·tomcat·web·jsp
2401_854391081 小时前
Spring Boot影院管理系统:小徐的创新
服务器·数据库·spring boot
promise5241 小时前
MySQL实现按分秒统计数据量
linux·运维·数据库·sql·mysql·shell
想躺平的做题家1 小时前
Linux高级编程_26_shell
linux·运维·服务器·c
北雨南萍1 小时前
CentOS7 离线部署docker和docker-compose环境
运维·docker·容器
_.Switch1 小时前
Python Web 开发中的DevOps 实践与自动化运维
运维·开发语言·前端·python·架构·serverless·devops