keepalived+nginx实现web高可用
目录
高可用集群搭建
Keepalived+nginx实现web高可用
一.节点规划
二.基础准备
1.修改主机名
2.关闭防火墙和selinux服务
三.用keepalived配置高可用
1.安装nginx服务
2.修改nginx配置文件
3.启动nginx
4.访问nginx
5.安装keepalived服务
6.编辑配置文件
7.编写nginx状态检测脚本
8.给脚本文件755权限
9.启动keepalived
10.测试高可用
(1)测试1:
(2)测试2:
(3)测试3:
(4)测试4:
(5)测试5:
高可用集群搭建
Keepalived+nginx实现web高可用
一.节点规划
| IP | 主机名 | 节点 |
| 192.168.77.130 | Master | 主节点 |
| 192.168.77.132 | Backup | 从节点 |
| 192.168.77.100 | Vip地址 |
二.基础准备
1.修改主机名
主节点:
| Hostnamectl set-hostname master bash |
从节点:
| Hostnamectl set-hostname backup bash |
2.关闭防火墙和selinux服务
| Systemctl stop firewalld Systemctl disable firewalld Setenforce 0 |
三.用keepalived配置高可用
1.安装nginx服务
主节点采用编译安装方式安装nginx,从节点采用yum方式安装nginx
主节点:
安装编译环境依赖包:
| #安装c语言和编译安装的环境 Yum -y install gcc gcc-c++ make automake autoconf libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel |
安装nginx:
| Wget http://nginx.org/download/nginx-1.13.7.tar.gz 没有wget的话需要先安装wget Yum -y install wget |
解压nginx安装包:
| Tar -zxvf nginx-1.13.7.tar.gz |
编译安装nginx:
| Cd nginx-1.13.7 #./configure是运行nginx安装脚本 --prefix是配置安装路径 ./configure --prefix=/usr/local/nginx #make && make install开始编译安装 Make && make install |
从节点:
安装nginx:
| Yum -y install nginx |
2.修改nginx配置文件
修改nginx首页面内容为节点的IP地址,方便后续测试观察
两台机器采用不同方式安装nginx配置文件路径会有不同
主节点:
| Vi /usr/local/nginx/html/index.html |
修改配置为如下:
| <body> <h1>192.168.77.130</h1> |

从节点:
| Vi /usr/share/nginx/html/index.html |
修改配置为如下:
| <div id="content"> <h1>192.168.77.132</h1> |

3.启动nginx
主节点:
| Cd /usr/local/nginx/sbin/ ./nginx |

用netstat -ntpl命令查看是否有80端口 有则说明服务已启动:
| Netstat -ntpl #如果出现未找到命令,需要下载net-tools Yum -y install net-tools |

从节点:
| Systemctl start nginx Systemctl status nginx Netstat -ntpl |

4.访问nginx
| http://192.168.77.130 http://192.168.77.132 |


5.安装keepalived服务
主从节点:
| Yum -y install keepalived |
6.编辑配置文件
红字为修改的地方
| vi /etc/keepalived/keepalived.conf |
编辑master节点配置文件(192.168.77.130)
| ! Configuration File for keepalived global_defs { #全局配置标识 notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id 192.168.77.130 #路由id,不能重复,通常为hostname vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" #检测nginx状态的脚本路径 interval 2 #每2秒运行一次上面的脚本 } vrrp_instance VI_1 { state MASTER interface ens33 #网卡名称,与本机ip地址所在网卡名 virtual_router_id 51 称相同. priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { #设置虚拟ip 192.168.77.100 #设置vip为100 } track_script { #执行脚本 chk_nginx #对应vrrp_script配置的脚本 } } |
编辑backup节点配置文件(192.168.77.132)
| ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id 192.168.77.132 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 } vrrp_instance VI_1 { state BACKUP #可选值为master或者backup interface ens33 virtual_router_id 51 priority 90 #定义优先级,数字越大优先级越高,ma advert_int 1 ster优先级必须要大于backup优先级 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.77.100 } track_script { chk_nginx } } |
7.编写nginx状态检测脚本
两台虚拟机都要编写
| Vi /etc/keepalived/nginx_check.sh |
主节点:
| #!/bin/bash #时间变量,用于记录日志 d=`date --date today +%Y%m%d_%H:%M:%S` #计算nginx进程数量 n=`ps -C nginx --no-heading|wc -l` #如果进程为0,则启动nginx,并且再次检测nginx进程数量, #如果还为0,说明nginx无法启动,此时需要关闭keepalived if [ $n -eq "0" ]; then /usr/local/nginx/sbin/nginx n2=`ps -C nginx --no-heading|wc -l` if [ $n2 -eq "0" ]; then echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log #杀掉keepalived,是为了防止脑裂。脑裂指的是高可用集群中,当主从切换时,主上的keepalived还在启动,会和从争抢VIP,导致后台链接服务器时,不知道连接哪台服务器好,导致出错。 systemctl stop keepalived fi fi |
从节点:
| #!/bin/bash #时间变量,用于记录日志 d=`date --date today +%Y%m%d_%H:%M:%S` #计算nginx进程数量 n=`ps -C nginx --no-heading|wc -l` #如果进程为0,则启动nginx,并且再次检测nginx进程数量, #如果还为0,说明nginx无法启动,此时需要关闭keepalived if [ $n -eq "0" ]; then systemctl start nginx ##因为是yum安装,启动有点不一样 n2=`ps -C nginx --no-heading|wc -l` if [ $n2 -eq "0" ]; then echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log systemctl stop keepalived fi fi |
8.给脚本文件755权限
| Chmod 755 /etc/keepalived/nginx_check.sh |
![]()
9.启动keepalived
| Systemctl start keepalived #启动 Systemctl status keepalived #查看运行状态 |

Master节点成功标志:

可以看到。Master节点已经获取到了vip 192.168.77.100
Backup节点成功标志:

Backup节点上只有192.168.77.132这个ip是正常的
MASTER节点正常的情况下,BACKUP节点一定不会有浮动IP,也就是VIP只能同时在一个节点上。
10.测试高可用
为了区分master和backup两个角色,我们需要先把两台机器的Nginx做一个区分,其实编译安装的Nginx和yum安装的Nginx版本肯定不一样,事实就是如此:
通过curl -I来查看差异:

(1)测试1:
关闭master上的nginx服务
| Cd /usr/local/nginx/sbin/ ./nginx -s stop Ps -aux | grep nginx |

脚本可以再次启动nginx,无法关闭
还有一种情况通过彻底关闭nginx来实现放在测试五讲解
(2)测试2:
在master上增加iptabls规则
| Iptables -I OUTPUT -p vrrp -j DROP |


可以发现master和backup上都出现了vip。在master上依旧有VIP,master上虽然被禁掉了VRRP协议,但它并不认为自己宕机了,所以不会释放VIP资源。如果master和backup都绑定了VIP,那么对外提供服务就会紊乱,这种情况被称为“脑裂”,这种情况是不允许发生的.
解决的话需要关闭master上的keepalived服务
恢复状态
| Iptables -F |
(3)测试3:
关闭master上的keepalived服务
| Systemctl stop keepalived |


访问vip成功切换到从上。
(4)测试4:
启动master上的keepalived服务
| Systemctl start keepalived |


Vip又调回到了主上。
(5)测试5:
彻底关闭nginx服务
需修改master的nginx配置文件
| Vi /usr/local/nginx/conf/nginx.conf |

我们在配置文件开头的woker和event前面添加个注释
测试完成后要修改回来
然后查看nginx进程
使用kill命令将nginx服务停掉

这时候我们再查看keepalived服务

能看到脚本使keepalived停掉了
然后在master和backup节点上查看ip

能看到vip成功转移到backup节点上,没有发生脑裂的情况。

至此测试完毕。
相关文章:
keepalived+nginx实现web高可用
目录 高可用集群搭建 Keepalived+nginx实现web高可用 一.节点规划 二.基础准备 1.修改主机名 2.关闭防火墙和selinux服务 三.用keepalived配置高可用 1.安装nginx服务 2.修改nginx配置文件 3.启动nginx 4.访问nginx 5.安装keepalived服务 6.编辑配置文件…...
边界层气象:脉动量预报方程展开 | 湍流脉动速度方差预报方程 | 平均湍流动能收支方程推导
写成分量形式 原始式子: ∂ u i ′ ∂ t u ‾ j ∂ u i ′ ∂ x j u j ′ ∂ u ‾ i ∂ x j u j ′ ∂ u i ′ ∂ x j − 1 ρ ‾ ⋅ ∂ p ′ ∂ x i g θ v ′ θ ‾ v δ i 3 f ϵ i j 3 u j ′ v ∂ 2 u i ′ ∂ x j 2 ∂ ( u i ′ u j ′ ‾ ) ∂ x j…...
TOSUN同星TsMaster使用入门——2、使用TS发送报文,使用graphics分析数据等
在第一章里面已经介绍了关于同星工程的创建和最基础的总线分析,接下来看看怎么使用TS发送报文以及图形化分析数据。 目录 一、使用Graphics分析报文信号/变量(对标CANoe Graphics) 二、使用数值窗口统计信号值/变量 三、使用TS发送报文 3…...
【操作系统】实验七:显示进程列表
实验7 显示进程列表 练习目的:编写一个模块,将它作为Linux内核空间的扩展来执行,并报告模块加载时内核的当前进程信息,进一步了解用户空间和内核空间的概念。 7.1 进程 进程是任何多道程序设计的操作系统中的基本概念。为了管理…...
day10 电商系统后台API——接口测试(使用postman)
【没有所谓的运气🍬,只有绝对的努力✊】 目录 实战项目简介: 1、用户管理(8个) 1.1 登录 1.2 获取用户数据列表 1.3 创建用户 1.4 修改用户状态 1.5 根据id查询用户 1.6 修改用户信息 1.7 删除单个用户 1.8 …...
JavaScript ES6+ 语法速通
一、ES6 基础语法 1. let 和 const 声明变量 let:块级作用域,可以重新赋值。const:块级作用域,声明常量,不能重新赋值。 let name Li Hua; name Li Ming; // 可修改const age 21; // age 22; // 报错࿰…...
移动端h5自适应rem适配最佳方案
网页开发中,我们常用的单位有如下几个: px:像素固定,无法适配各分辨率的移动设备em: 该单位受父容器影响,大小为父元素的倍数rem: 因为html根元素大小为16px,所以默认 1rem 16px,rem只受根元素…...
2024年使用 Cython 加速 Python 的一些简单步骤
文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 文章有点长,期望您能坚持看…...
EasyExcel设置表头上面的那种大标题(前端传递来的大标题)
1、首先得先引用easyExcel的版本依赖,我那 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency> 2、然后得弄直接的实体类,&…...
【Linux网络编程】第十弹---打造初级网络计算器:从协议设计到服务实现
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Protocol.hpp 1.1、Request类 1.1.1、基本结构 1.1.2、构造析构函数 1.1.3、序列化函数 1.1.4、反…...
无限弹窗?无限重启?
Windows开机自启目录: "%USERPROFILE%\AppData\Roaming\Microsoft\windows\StartMenu\Programs\Startup" 基于这个和 start 命令, shutdown 命令, 编写 bat 病毒程序。 无限弹窗 echo start cmd > hack.txt echo %0 >>…...
深入详解人工智能机器学习常见算法中的K-means聚类
目录 引言 1. K-means聚类的基本概念 1.1 K-means聚类的定义 1.2 K-means聚类的核心思想 1.3 K-means聚类的目标函数 2. K-means聚类的核心原理 2.1 初始化 2.2 分配 2.3 更新 2.4 迭代 3. K-means聚类的具体实现 3.1 K-means聚类的算法流程 3.2 K-means聚类的Pyt…...
lc146LRU缓存——模仿LinkedHashMap
146. LRU 缓存 - 力扣(LeetCode) 法1: 调用java现有的LinkedHashMap的方法,但不太理解反正都不需要扩容,super(capacity, 1F, true);不行吗,干嘛还弄个装载因子0.75还中途扩容一次浪费时间。 class LRUC…...
全面深入解析:C语言动态库
引言 动态库(Dynamic Library)是现代软件开发中不可或缺的一部分,它们不仅提高了代码的重用性和维护性,还显著提升了系统的性能和资源利用率。本文将全面探讨C语言中的动态库,从基础概念到高级应用,通过丰…...
运用 SSM 实现垃圾分类系统智能化升级
目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 2.1Java技术 6 2.2 Mysql数据库 6 2.3 B/S结构 7 2.4 SSM框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行性 10 3.1.3 操作可行性 10 …...
LeNet-5:深度学习与卷积神经网络的里程碑
目录 编辑 引言 LeNet-5的结构与原理 输入层 C1层:卷积层 S2层:池化层 C3层:卷积层 S4层:池化层 C5层:卷积层 F6层:全连接层 输出层 LeNet-5的算法基础 LeNet-5的优点 LeNet-5的现代应用 …...
从资产流动分析WIF市场潜力X.game深究其他未知因素
近日,两则关于WIF最新消息引起了投资者们的注意。据报道,11月28日Vintermute在过去13小时内累计从Binance交易所提取了价值533万美元的WIF,此举不仅彰显了其强大的资金实力,更在某种程度上推动了WIF币价的反弹;另一方面…...
深入解析Vue3响应式系统:从Proxy实现到依赖收集的核心原理
深入解析Vue3响应式系统:从Proxy实现到依赖收集的核心原理 响应式系统的基本原理 作为一个热门的JavaScript框架,Vue在3.x版本中引入了基于Proxy的响应式系统。这个系统的核心思想是利用Proxy对象拦截对数据的访问和修改,从而实现数据的自动更…...
FPGA实现GTP光口数据回环传输,基于Aurora 8b/10b编解码架构,提供2套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案 3、工程详细设计方案工程设计原理框图用户数据发送模块基于GTP高速接口的数据回环传输架构GTP IP 简介GTP 基本结构GTP 发送和接收…...
Linux网络 UDP socket
背景知识 我们知道, IP 地址用来标识互联网中唯一的一台主机, port 用来标识该主机上唯一的一个网络进程,IPPort 就能表示互联网中唯一的一个进程。所以通信的时候,本质是两个互联网进程代表人来进行通信,{srcIp&…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
