nginx+keepalived负载均衡及高可用
1 项目背景
keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。采用nginx+keepalived,它是一个高性能的服务器高可用或者热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实现Web服务器端的高可用。使用keepalived可以保证nginx的高可用,他能监控nginx的健康状态,当nginx出现宕机时自动主备切换。
项目架构
Nginx+Keepalived实现高可用

2 项目环境
| 服务器角色(主机名) | IP | 用途 |
|---|---|---|
| Nginx_Master(open-Euler1) | 192.168.121.150 | 提供负载均衡 |
| Nginx_Backup(open-Euler2) | 192.168.121.151 | 提供负载均衡 |
| Client(Rocky8) | 192.168.121.160 | 测试客户端 |
| Web1服务器(open-Euler3) | 192.168.121.152 | 提供Web服务 |
| Web2服务器(open-Euler4) | 192.168.121.153 | 提供Web服务 |
3 项目部署
节点服务器 生产环境中对于节点服务器需要利用共享存储(比如NFS存储)服务器提供的空间来提供服务,此处测试后端存储服务器略。
3.1 web01和web02配置:
提供web服务
#yum install nginx -y //安装nginx服务
[root@open-Euler3 ~]# echo `hostname -I` > /usr/share/nginx/html/index.html #html测试界面
[root@web1 ~]# systemctl start nginx
3.2 nginx负载均衡配置
两台nginx做同样配置
1、安装nginx
yum install nginx
2、配置nginx反向代理
[root@open-Euler1 keepalived]# cd /etc/nginx/conf.d/
[root@open-Euler1 conf.d]# cat lb.conf
upstream webs {server 192.168.121.152:80;server 192.168.121.153:80;
}server {location / {proxy_pass http://webs;
}
}
3.3 调度服务器
3.3.1 主调度服务器
1、安装keepalived
[root@open-Euler1 conf.d]# yum install keepalived -y
2、开发检测nginx存活的shell脚本
[root@open-Euler1 conf.d]# vim /etc/keepalived/check_nginx.sh
#!/bin/bash
#代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];thensystemctl start nginxsleep 2if [ `ps -C nginx --no-header | wc -l` -eq 0 ] thensystemctl stop keepalivedfi
fi
3、配置keepalived
[root@open-Euler1 conf.d]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id LVS_1
}vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh" #你的监控脚本位置,路径不能出错
}vrrp_instance VI_1 {state MASTERinterface ens160lvs_sync_daemon_interface ens192virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.121.180}track_script {check_nginx
}
}
VRRP script(补充)
通过vrrp_script实现对集群资源的监控
1)在keepalived学习总结中已经说过,keepalived只是提供一个VIP,但高可用的是服务,因此keepalived一般会与lvs、nginx、haproxy、mysql…等服务器联合使用,以实现服务的高可用,但是若keepalived与之联合使用的服务异常时,此处keepalived提供的VIP也就没有任何意义了,因此此时的VIP我们希望它可以自动检测与keepalived连用的服务是否正常,若服务不正常,VIP实现自动飘移至backup节点,此时可以使用VRRP scripts实现。
2)keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整。
3)vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值进行下一步操作,脚本可被多个实例调用。track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script。
4)VRRP scripts的实现:
1>通过killall命令探测服务运行状态:
这种监控集群服务的方式主要是通过killall命令实现的。killall会发送一个信号到正在运行的指定命令的进程。如果没指定信号名,则发送SIGTERM。SIGTERM也是信号名的一种,代号为15,它表示以正常的方式结束程序的运行。其实killall可用的信号名有很多,可通过“killall -l ”命令显示所有信号名列表,其中每个信号名代表对进程的不同执行方式,例如,代号为9的信号表示将强制中断一个程序的运行。这里要用到的信号为0,代号为0的信号并不表示要关闭某个程序,而表示对程序(进程)的运行状态进行监控,如果发现进程关闭或其他异常,将返回状态码1,反之,如果发现进程运行正常,将返回状态码0.vrrp_script模块正是利用了killall命令的这个特性,变相实现了对服务运行状态的监控。
例:
vrrp_script check_mysqld {
script "killall -0 mysqld"
interval 2
}track_script {
check_mysqld
}
这个例子定义了一个服务监控模块check_mysqld,其采用的监控的方式是通过“killall -0 mysqld”的方式,其中“interval”选项检查的时间间隔,即2s执行一次检测。
2>通过脚本进行服务状态监控:
vrrp_script <SCRIPT_NAME> { #定义一个检测脚本,在global_defs 之外配置script <STRING>|<QUOTED-STRING> # shell命令或脚本路径interval <INTEGER> # 间隔时间,单位为秒,默认1秒timeout <INTEGER> # 超时时间weight <INTEGER:-254..254> # 权重,当脚本成功或失败对当前节点的优先级是增加还是减少,这个值会与定义的优先级做加法例:-80时则为priority+(-80)。weight为正数:1、当 Master 节点的“ vrrp_script” 脚本检测失败时, 如果 Master 节点的 “priority ” 值小于 Backup 节点的 “ weight” 值与 “ priority ” 值之和, 将发生主、 备切换。2、当 Master 节点的“ vrrp_script” 脚本检测成功时, 如果 Master 节点的 “ weight ” 值与 “ priority ” 值之和大于 Backup 节点的 “ weight” 值与 “ priority” 值之和, 主节点依然为主节点, 不发生切换。weight为负数:1、当 Master 节点的 “ vrrp script” 脚本检测失败时, 如果 Master 传点的 “ priority” 值与 “weight” 值之差小于 Backup 竹点的 “ priority ” 值, 将发生主、 备切换。2、当 Master 节点的“ vrrp_script” 脚本检测成功时, 如果 Master 诗点的 “ priority ” 值大于 Backup 节点的 “priority ” 值, 主节点依然为主节点, 不发生切换。fall <INTEGER> #脚本几次失败转换为失败rise <INTEGER> # 脚本连续监测成果后,把服务器从失败标记为成功的次数user USERNAME [GROUPNAME] # 执行监测的用户或组init_fail # 设置默认标记为失败状态,监测成功之后再转换为成功状态
}
这是最常见的监控方式,其监控过程类似于nagios的执行方式,不同的是,这里只有0、1两种返回状态,例如:
vrrp_script chk_mysqld {
script "/etc/keepalived/check_mysqld.sh"
interval 2
}track_script {
chk_mysqld
}
其中,check_mysqld.sh的内容为:
#!/bin/bash
/usr/bin/mysql -e "show status;" > /dev/null 2>&1
if [ $? -eq 0 ];then
MYSQL_STATUS=0
else
MYSQL_STATUS=1
fiexit $MYSQL_STATUS
这是一个最简单的实现MySQL服务状态检测的shell脚本,它通过登录MySQL数据库后执行查询操作来检测MySQL运行是否正常,如果检测正常,将返回状态码0,否则返回状态码1。
3.3.2 从调度服务器
1、安装keepalived
[root@open-Euler2 conf.d]# yum install keepalived -y
2、开发检测nginx存活的shell脚本
[root@open-Euler2 conf.d]# vim /etc/keepalived/check_nginx.sh
#!/bin/bash
#代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];thensystemctl start nginxsleep 2if [ `ps -C nginx --no-header | wc -l` -eq 0 ] thensystemctl stop keepalivedfi
fi
3、配置keepalived
[root@open-Euler2 keepalived]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id LVS_2 #改
}vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"
}vrrp_instance VI_1 {state BACKUP #改interface ens160lvs_sync_daemon_interface ens192virtual_router_id 51priority 80 #改advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.121.180}track_script {check_nginx
}
}
注意:keepalived配置文件里面注意空格问题。
比如:script "/etc/keepalived/check_nginx.sh"后面不能空格。
4 项目测试
启动主从调度的nginx和keepalived
[root@open-Euler1 ~]# systemctl restart nginx keepalived
[root@open-Euler2 ~]# systemctl restart nginx keepalived
Master,Backup都正常,只有Master对外提供服务
[root@open-Euler1 conf.d]# ip a | grep "192.168.121.180"inet 192.168.121.180/32 scope global ens160
Master宕机,Backup接替Master对外提供服务
模拟Master的keepalived服务器停止
[root@open-Euler1 ~]# systemctl stop keepalived.service
此时VIP在open-Euler2上
[root@open-Euler2 conf.d]# ip a | grep "192.168.121.180"inet 192.168.121.180/32 scope global ens160
Master恢复正常,Master继续提供服务,Backup停止服务
模拟Master的keepalived服务恢复正常
[root@open-Euler1 ~]# systemctl start keepalived.service
此时VIP在Master上
[root@open-Euler1 conf.d]# ip a | grep "192.168.121.180"inet 192.168.121.180/32 scope global ens160
Master上的nginx服务停止,监控脚本尝试重新启动nginx
[root@open-Euler1 conf.d]# systemctl stop nginx
[root@open-Euler1 conf.d]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy serverLoaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)Active: active (running) since Fri 2025-02-28 20:05:22 CST; 4s agoProcess: 14207 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)Process: 14211 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)Process: 14214 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)Main PID: 14215 (nginx)Tasks: 3 (limit: 8932)Memory: 4.0MCGroup: /system.slice/nginx.service├─ 14215 "nginx: master process /usr/sbin/nginx"├─ 14216 "nginx: worker process"└─ 14217 "nginx: worker process"Feb 28 20:05:22 open-Euler1 systemd[1]: Starting The nginx HTTP and reverse proxy server...
Feb 28 20:05:22 open-Euler1 nginx[14211]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Feb 28 20:05:22 open-Euler1 nginx[14211]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Feb 28 20:05:22 open-Euler1 systemd[1]: Started The nginx HTTP and reverse proxy server.
可以看到即使我关闭了nginx服务监控脚本也帮我重新开启了服务
模拟修改错误nginx配置文件的话导致无法启动
[root@open-Euler1 conf.d]# vim /etc/nginx/nginx.conf
[root@open-Euler1 conf.d]# systemctl stop nginx

查看日志
[root@open-Euler1 nginx]# tail -f /var/log/messages
可以看到日志中监控脚本检测失败

这时VIP就飘移到了open-Euler2服务器上
相关文章:
nginx+keepalived负载均衡及高可用
1 项目背景 keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。采用nginxkeepalived,它是一个高性能的服务器高可用或者热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的…...
6.人工智能与机器学习
一、人工智能基本原理 1. 人工智能(AI)定义与范畴 核心目标:模拟人类智能行为(如推理、学习、决策)分类: 弱人工智能(Narrow AI):专精单一任务(如AlphaGo、…...
VirtualBox虚拟机转VM虚拟机
前言:部分靶机只适用于VirtualBox,VM打不开VirtualBox的文件,所以需要进行转换 前置条件:本机已经下载VM和VirtualBox 第一步:文件转换 找到VirtualBox.exe所在位置,启动cmd窗口 文件转换的命令…...
谈谈 HTTPS 的工作原理,SSL / TLS 握手流程是什么?
一、HTTPS 核心机制:非对称加密 对称加密 HTTPS HTTP over TLS/SSL,通过 混合加密体系 解决三大问题: 防窃听 - 对称加密传输内容(如 AES)防篡改 - 数字签名验证数据完整性防冒充 - 数字证书验证服…...
使用DeepSeek+KIMI生成高质量PPT
一、使用DeepSeek DeepSeek官网:DeepSeek 点击“开始对话”,进入交互页面。 在上图中,输入问题,即可获取AI生成的结果。 基础模型(V3):通用模型(2024.12),高…...
基于SpringBoot的失物招领平台的设计与实现
基于SpringBoot的失物招领平台的设计与实现 基于微信小程序的失物招领系统 失物招领小程序 校园失物招领小程序 基于微信小程序SSMMySQL开发,高分JAVA成品毕业设计,附带往届论文、启动教程、讲解视频、二次开发教程和配套安装包文件,论文中…...
鸿蒙NEXT开发-元服务和服务卡片的开发
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 目录 1. 元服务基本概念 1.1 基本介绍 1.2 元…...
【Spark+Hive】基于Spark大数据技术小红书舆情分析可视化预测系统(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
目录 一、项目背景 二、项目目标 三、算法介绍 四、开发技术介绍 五、项目创新点 六、项目展示 七、权威教学视频 源码获取方式在文章末尾 一、项目背景 在数字经济蓬勃发展的当下,社交电商平台小红书凭借其"内容电商"的独特模式,已…...
IO基础知识和练习
一、思维导图 二、练习 1.使用标准IO函数,实现文件的拷贝 #include <head.h> int main(int argc, const char *argv[]) {FILE *pfopen("./one.txt","r");FILE *fpfopen("./two.txt","r");if(pNULL)PRINT_ERROR(&qu…...
gradle libs.versions.toml文件
1.libs.versions.toml介绍2.创建libs.versions.toml文件3.libraries5.versions6.plugins7.bundles 1.libs.versions.toml介绍 下图是官网介绍 意思就是说项目所有插件和库的依赖版本都统一在这个文件配置。 文件中有以下四个部分 versions, 申明要使用的插件和库的版本号的…...
影刀RPA开发拓展--SQL常用语句全攻略
前言 SQL(结构化查询语言)是数据库管理和操作的核心工具,无论是初学者还是经验丰富的数据库管理员,掌握常用的 SQL 语句对于高效管理和查询数据都至关重要。本文将系统性地介绍最常用的 SQL 语句,并为每个语句提供详细…...
2024_BUAA数据结构上机题解分享
📎 GitHub/Gitee同步开源 | 🚀 点击访问Gitee仓库 点击访问GitHub仓库 (若访问缓慢可尝试切换仓库镜像源) 这份代码库不是捷径,而是北航数据结构的生存地图。当你被困在递归迷雾中时,愿这些经过OJ系统千锤百…...
什么是分布式和微服务?
一、分布式系统 定义: 分布式系统是由多个独立的计算节点(或称为服务器、计算机)通过网络相互连接,共同协作以完成特定任务的系统。这些节点可以运行在不同的物理服务器或虚拟机上。 核心思想: 提高系统的可扩展性&am…...
2025 Lakehouse 趋势全景展望:从技术演进到商业重构
1. 为什么湖仓正在成为企业数据架构的必选项? 越来越多的企业正在通过实时数据处理能力构建核心竞争力——用户期待 APP 精准捕捉需求并实时响应,企业员工追求业务系统的秒级反馈,这些场景背后是千亿级数据资产的敏捷调度。 据 IDC 预测&am…...
一、NRF2401无线通信模块使用记录
一、电路引脚图 1、引脚说明: 2、引脚标号: 找到1号引脚,与原理图对号入座。 3、cubemx初始化配置: 5、驱动文件 配置spi,并构建发送与接收函数接口 .h #define TX_ADR_WIDTH 5 //发射地址宽度 #define TX_PLO…...
NVIDIA GPU 架构详解:Pascal、Volta、Turing、Ampere、Ada、Hopper、Blackwell
目录 1. Pascal(帕斯卡)架构(2016)关键技术性能特性代表产品应用场景 2. Volta(伏特)架构(2017)关键技术性能特性代表产品应用场景 3.Turing(图灵)架构&#…...
初阶数据结构(C语言实现)——3顺序表和链表(2)
2.3 数组相关面试题 原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。OJ链接 力扣OJ链接-移除元素删除排序数组中的重复项。力扣OJ链接-删除有序数组中的重复项合并两个有序数组。力扣OJ链接-合并两个有序数组 2.3.1 移除元素 1…...
DeepSeek R1模型性能瓶颈分析与解决方案
摘要 研究发现,DeepSeek R1模型在处理复杂问题时可能遭遇性能瓶颈。当模型过度思考时,其性能会下降。通过减少不必要的思考过程,计算成本可降低43%。研究团队分析了4018条轨迹数据,并创建了一个开源数据集,以推动智能体…...
IP-----BGP协议
7.BGP协议 1.BGP的所属分类 2.BGP的特性 3.BGP的数据包 4.BGP的6种状态机 5.BGP的工作过程 6.BGP的路由黑洞 1.BGP路由黑洞 2.解决方法 7.BGP的防环 1.EBGP水平分割 2.IBGP水平分割 1.解决IBGP环路的规则 2.解决IBGP水平分割问题 3.作用 8.BGP的基础配置 1.查看…...
【String】917. 仅仅反转字母
917. 仅仅反转字母 - 力扣(LeetCode) 使用双指针,一个指针指向s的开始,一个指向s的末尾,同时遍历即可。...
python3使用selenium打开火狐并全屏
序言 本来桌面端全屏这种东西现在用electron或者tauri来做软件的全屏,但是奈何今天拿到了一块早些年的nx板子,arm架构的,系统有点老,装node只能到16版本,装了半天终于搞好了,发现这个系统没法隐藏系统的顶…...
探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码
文章目录 二、关键算法原理剖析2.1 Viterbi 解码2.1.1 卷积码与网格图基础**卷积码****网格图****生成多项式****理想情况下解码过程** 2.1.2 Viterbi 算法核心思想2.1.3 路径度量与状态转移机制2.1.4 算法流程与关键步骤详解2.1.5 译码算法举例与复杂度分析2.1.6 算法代码示例…...
Spring Bean 作用域设置为prototype在并发场景下是否是线程安全的
在并发场景下,将 Spring Bean 作用域设置为 prototype 通常能在一定程度上保证线程安全,但这并不意味着绝对的线程安全 1. prototype 作用域的特点 在 Spring 中,Bean 的作用域定义了 Bean 的生命周期和可见性。prototype 作用域表示每次从…...
金融项目实战
测试流程 测试流程 功能测试流程 功能测试流程 需求评审制定测试计划编写测试用例和评审用例执行缺陷管理测试报告 接口测试流程 接口测试流程 需求评审制定测试计划分析api文档编写测试用例搭建测试环境编写脚本执行脚本缺陷管理测试报告 测试步骤 测试步骤 需求评审 需求评…...
mybatis热点面试题第五弹
1. MyBatis与Hibernate的区别 答案: MyBatis: 不完全是一个ORM框架,需要手动编写SQL语句,灵活性高,适合对数据库操作有高性能要求的场景。缺点是无法做到数据库无关性,如果需要支持多种数据库,…...
c++头文件和命名空间
在 C 中,头文件和命名空间是两个重要的概念,它们分别用于代码组织和作用域管理。 一、头文件(Header Files) 1. 作用 声明接口:存放函数、类、变量的声明(而非定义)。代码复用:通…...
命令行参数和环境变量 ─── linux第13课
目录 命令行参数 命令行参数列表: 如何实现命令行参数传递到此进程 环境变量 基本概念 常见环境变量 查看环境变量方法 编辑 环境变量如何写入 总结: 测试PATH 命令行参数 同一个程序,可以根据命令行参数的不同,表现不同功能 比如:指令中的选项的实现. ls -al…...
基于 openEuler 22.09 的 OpenStack Yoga 部署
openEuler 虚拟化环境部署 使用 VMWare Workstation 创建三台 2 CPU、8G内存、100 GB硬盘 的虚拟机 主机 IP 作用 Controller 192.168.184.110 控制节点 Compute 192.168.184.111 计算节点 Storage 192.168.184.112 存储节 一 基础配置 1.1 配置 yum 源 由于 op…...
【Linux实践系列】:用c语言实现一个shell外壳程序
🔥本文专栏:Linux Linux实践项目 🌸博主主页:努力努力再努力wz 那么今天我们就要进入Linux的实践环节,那么我们之前学习了进程控制相关的几个知识点,比如进程的终止以及进程的等待和进程的替换,…...
通俗易懂的分类算法之K近邻详解
通俗易懂的分类算法之K近邻详解 用最通俗的语言和例子,来彻底理解 K近邻(K-Nearest Neighbors,简称 KNN) 这个分类算法。不用担心复杂的数学公式,我会用生活中的例子来解释,保证你一听就懂! 1.…...
