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

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

相关推荐
j七七25 分钟前
5分钟搭微信自动回复机器人5分钟搭微信自动回复机器人
运维·服务器·开发语言·前端·python·微信
大锦终29 分钟前
【Linux】HTTP协议
linux·运维·服务器·网络·http
搬砖的小码农_Sky32 分钟前
远程桌面:Ubuntu Desktop操作系统上如何安装Rustdesk远程桌面客户端(离线安装包)
linux·ubuntu·远程工作
ragnwang1 小时前
解决 Ubuntu 安装 NVIDIA 固件时的包冲突问题
linux·运维·ubuntu
rengang661 小时前
AI驱动的DevOps:AI大模型自动化部署、监控和运维流程
运维·人工智能·ai编程·devops·ai智能体编程
Mr.小海1 小时前
Kubernetes GPU 运维组件介绍
运维·容器·kubernetes
掘金安东尼1 小时前
Caddyfile:用最简单的方式配置最现代的 Web 服务器
运维·服务器·前端
CC.GG1 小时前
【Linux】进程概念(四)(命令行参数和环境变量)
linux·运维·服务器
我命由我123452 小时前
PDFBox - PDF 页面坐标系、PDF 页面尺寸获取、PDF 页面位置计算
java·服务器·开发语言·笔记·后端·java-ee·pdf
我爱钱因此会努力2 小时前
shell实战-跳板机和测试主机是否在线
服务器·tcp/ip·bash