nginx配置实例-高可用主备模式

目录

什么是高可用?

解决的问题?

双机热备方案

keepalived是什么?

故障转移机制

环境准备

一、实现过程

1.1安装keepalived

 安装好以后,将keepalived程序开启,并且加入到开机启动项中

1.2修改主机(192.168.81.130)keepalived配置文件

1.3修改备机(192.168.81.131)keepalived.conf配置文件

1.4重启keepalived,使得修改的配置文件生效。

1.5在主节点和从节点上查看虚拟IP是否绑定到ens33网卡上

二、高可用验证

2.1修改两个服务器默认访问的nginx的html页面作为区别

2.2在浏览器使用虚拟IP地址来访问服务

2.3接下来模拟宕机

2.3.1杀死主节点的keepalived的三个进程、停止nginx服务

2.3.2观察虚拟IP,此时绑定到从节点的网卡上

2.4在浏览器在此使用虚拟IP访问服务


什么是高可用?

高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是天有不测风云。所以我们只能尽可能的去减少服务的故障。

解决的问题?

在生产环境上很多时候是以Nginx做反向代理对外提供服务,但是一天Nginx难免遇见故障,如:服务器宕机。当Nginx宕机那么所有对外提供的接口都将导致无法访问。

虽然我们无法保证服务器百分之百可用,但是也得想办法避免这种悲剧,今天我们使用keepalived来实现Nginx的高可用。

双机热备方案

这种方案是国内企业中最为普遍的一种高可用方案,双机热备其实就是指一台服务器在提供服务,另一台为某服务的备用状态,当一台服务器不可用另外一台就会顶替上去。

keepalived是什么?

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件

故障转移机制

Keepalived高可用服务之间的故障切换转移,是通过VRRP 来实现的。
在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

环境准备

192.168.81.130 centos01

192.168.81.131 centos02

两台centos 7,安装好nginx

一、实现过程

1.1安装keepalived

yum 方式直接安装,该方式会直接安装依赖

yum install -y keepalived
 安装好以后,将keepalived程序开启,并且加入到开机启动项中
systemctl start keepalived
systemctl enable keepalived
1.2修改主机(192.168.81.130)keepalived配置文件

yum 方式安装的会在配置文件在/etc/keepalived下

vi /etc/keepalived/keepalived.conf

keepalived.conf

! Configuration File for keepalivedglobal_defs {notification_email {	#设置报警邮件地址,需要开启本机postfix或者sendmail服务;xxx@alibaba-inc@qq.com}notification_email_from root@localhost.com	#用于设置邮件的发送地址,即报警邮件发送者;smtp_server 127.0.0.1	#用于设置邮件的SMTP Server地址;smtp_connect_timeout 30	#设置连接SMTP Server的超时时间;router_id LVS_DEVEL #LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}vrrp_script chk_ngnix {script /etc/keepalived/scripts/chk_nginx.sh #监控nginx脚本路径interval 2 #检测时间间隔weight -10 #如果条件成立的话,则权重 -10
}vrrp_instance VI_1 {state MASTER      #主从状态(MASTER/BACKUP)interface ens33      #绑定虚拟 IP 的网络接口,注:ip addr查询virtual_router_id 52 #虚拟路由的 ID 号, 两个节点设置必须一样mcast_src_ip 192.168.81.130 #填写本机ippriority 100 #主节点优先级,主要比从节点优先级高 #garp_master_delay 30advert_int 1        #每隔1s发送一次心跳authentication {    auth_type PASSauth_pass 1111  #校验类型:密码=1111}# 将track_script块加入 instance 配置块track_script {chk_ngnix       #执行Nginx监控服务}virtual_ipaddress {192.168.81.136  #虚拟ip(设置虚拟ip网段需要同一个,需要根据项目去调整 )}
}

virtual_ipaddress 里面可以配置vip,在线上通过vip来访问服务。

interface需要根据服务器网卡进行设置通常查看方式ip addr

authentication配置授权访问后备机也需要相同配置1.3

1.3修改备机(192.168.81.131)keepalived.conf配置文件
! Configuration File for keepalivedglobal_defs {notification_email {	#设置报警邮件地址,需要开启本机postfix或者sendmail服务;xxx@alibaba-inc@qq.com}notification_email_from root@localhost.com	#用于设置邮件的发送地址,即报警邮件发送者;smtp_server 127.0.0.1	#用于设置邮件的SMTP Server地址;smtp_connect_timeout 30	#设置连接SMTP Server的超时时间;router_id LVS_DEVEL #LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}vrrp_script chk_ngnix {script /etc/keepalived/scripts/chk_nginx.sh #监控nginx脚本路径interval 2 #检测时间间隔weight -10 #如果条件成立的话,则权重 -10
}vrrp_instance VI_1 {state BACKUP      #主从状态(MASTER/BACKUP)interface ens33      #绑定虚拟 IP 的网络接口,注:ip addr查询virtual_router_id 52 #虚拟路由的 ID 号, 两个节点设置必须一样mcast_src_ip 192.168.81.131  #填写本机ippriority 90 #主节点优先级,主要比从节点优先级高#garp_master_delay 30advert_int 1        #每隔1s发送一次心跳authentication {    auth_type PASSauth_pass 1111  #校验类型:密码=1111}# 将track_script块加入 instance 配置块track_script {chk_ngnix       #执行Nginx监控服务}virtual_ipaddress {192.168.81.136  #虚拟ip(设置虚拟ip网段需要同一个,需要根据项目去调整 )}
}

1.4编写nginx监控脚本

#创建
mkdir -p /etc/keepalived/scripts/#编辑
vim /etc/keepalived/scripts/chk_nginx.sh#添加可执行权限
chmod 755 /etc/keepalived/scripts/chk_nginx.sh 
#!/bin/bash#      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#      + 1、此脚本为nginx监控脚本,与keepalived组件配合使用    
#      + 2、keepalived配置文件:/etc/keepalived/keepalived.conf       
#      + 3、脚本输出日志/etc/keepalived/check_service.log
#      + 4、默认脚本路径在/etc/keepalived/scripts下,需要改变路径,请修改keepalived配置   	               
#      + 5、创建此脚本后请赋予可执行权限chmod +x /etc/keepalived/scripts/chk_nginx.sh      
#      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++####################基础参数####################
#获取当前时间
DATE=`date +%Y%m%d`
#日志输出路径
logPath=/etc/keepalivedA=`ps -C nginx --no-header |wc -l` 
# 判断nginx是否宕机,如果宕机了,尝试重启
echo "$(date +%Y'-'%m'-'%d' '%H':'%M':'%S) 进程数:$A" | tee -a ${logPath}/check_service.log 
if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机 sleep 3 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then echo "$(date +%Y'-'%m'-'%d' '%H':'%M':'%S)nginx is over! stop keepalived!" | tee -a ${logPath}/check_service.logsystemctl stop keepalivedexit 1fi
elseecho "$(date +%Y'-'%m'-'%d' '%H':'%M':'%S) nginx is run!" | tee -a ${logPath}/check_service.logexit 0		
fi

1.4重启keepalived,使得修改的配置文件生效。
systemctl restart keepalived
1.5在主节点和从节点上查看虚拟IP是否绑定到ens33网卡上

主节点

从节点

二、高可用验证

2.1修改两个服务器默认访问的nginx的html页面作为区别

2.2在浏览器使用虚拟IP地址来访问服务

2.3接下来模拟宕机
2.3.1杀死主节点的keepalived的三个进程、停止nginx服务

当主节点的 Nginx 停止工作时,keepalived 会检测到主服务器的状态发生了变化,并尝试将虚拟 IP 转移到备用服务器上。但是,如果主节点的 keepalived 还在运行,它可能会认为主节点仍然可用,并尝试保持虚拟 IP 在主服务器上,这将导致无法通过虚拟 IP 访问服务。

因此,在停止主节点的 nginx 时,应该同时停止主节点的 keepalived,以便从节点可以接管虚拟 IP,并成为新的主节点。这样,即使主节点的 nginx 停止工作,从节点也可以接管服务并继续提供服务。

2.3.2观察虚拟IP,此时绑定到从节点的网卡上

2.4在浏览器在此使用虚拟IP访问服务

至此,keepalived对nginx高可用已经实现!!!

#为美好的开源世界贡献一份力量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

winform入门篇3 -- 手工创建窗口

手工创建窗口 Form, 窗口 可以手工创建一个窗口类 class MyFrom : Form { } 1.创建一个windows 窗体应用 这样就自动创建了一个窗体应用Form1 现在不使用这个自动创建的,手工写一个 2.手动创建 1.删除Form1.cs 2.添加 新建MyForm 类 让该类继承Form 在构造…

Covalent Network(CQT)推出以太坊质押迁移计划,以增强长期结构化数据可用性、塑造万亿级 LLM 参数体系

作为 Web3 领先的链上数据层,Covalent Network(CQT)宣布了其将质押操作从 Moonbeam 迁移回以太坊的决定。此举是 Covalent Network(CQT)走向以太坊时光机(EWM)的第一步,EWM 是一个为…

Python | 超前滞后分析

Nino SST Indices (Nino 12, 3, 3.4, 4; ONI and TNI) 有几个指标用于监测热带太平洋,所有这些指标都是基于海表温度(SST)异常在一个给定的区域的平均值。通常,异常是相对于30年的周期来计算的。厄尔尼诺3.4指数(Nio 3.4 index)和海洋厄尔尼诺指数(Ocea…

golang代码练习样例模版--推荐--测试学习使用的方法

golang代码练习样例模版 以前用的python代码,每次测试都是一个python文件,但是go就是以文件夹为目录为 结构的测试(同一个文件夹下,不能有同名的函数) 大部分时间就是测试,如何对go程序函数进行测试&#…

【java工具-灵活拉取数据库表结构和数据】

需求: 假设我们现在有一个需求,需要快速拉取数据库的某些表建表语句,和数据,平时做备份之类; 我这边自己写了个工具,不多废话,也不整虚的, 直接看代码: package com.…

GitLab教程(一):安装Git、配置SSH公钥

文章目录 序一、Git安装与基本配置(Windows)下载卸载安装基本配置 二、SSH密钥配置 序 为什么要使用代码版本管理工具: 最近笔者确实因为未使用代码版本管理工具遇到了一些愚蠢的问题,笔者因此认为代码版本管理工具对于提高团队…

JR-SMD201-P便携式网络解码器

详细介绍: JR-SMD201-P便携式网络解码器采用1/2U设计,支持AVS/H.265/H.264/MPEG2解码,支持IP输入,支持1080P/1080I/720P/576I/480I多种分辨率,支持DRA/AC3/EAC3/AAC/MPEG等音频。 产品特点 支持输入方式IP 接口丰富&a…

户外骑行存档(图新地球与运动健康App)经验分享

0序 之前天天加班熬夜,身体素质有些下降,在锻炼的过程中喜欢上了骑行,周周骑、天天骑。 骑行会产生很多的轨迹(有很多朋友不喜欢装很多app,就用手机自带的运动健康,也有喜欢专业运动app的,道理…

SQL注入原理与信息获取及常规攻击思路靶场实现

SQL注入原理与信息获取及常规攻击思路靶场实现 很早的时候就写了,权当备份吧 Web程序三层架构 表示层 :与用户交互的界面 , 用于接收用户输入和显示处理后用户需要的数据 业务逻辑层 :表示层和数据库访问层之间的桥梁 , 实现业务逻辑 ,验证、…

BPMN.JS中文教程学习

基础篇 vue bpmn.js 建模BpmnModeler将数据转图形bpmnModeler.importXML // basic.vue<script>// 引入相关的依赖import BpmnModeler from bpmn-js/lib/Modelerimport {xmlStr} from ../mock/xmlStr // 这里是直接引用了xml字符串export default {name: ,components: {…

三维点云:对原始点云数据进行体素化

文章目录 一、原始点云二、对原始点云进行体素化三、结果展示 一、原始点云 &#x1f349;原始点云为.pts文件&#xff0c;内容为x, y, z的坐标 原始点云展示 二、对原始点云进行体素化 使用open3d库实现&#xff0c;如果没有需要在命令行执行pip install open3d import o…

vue vue3 手写 动态加载组件

效果展示 一、需求背景&#xff1a; # vue3 项目涉及很多图表加载、表格加载 #考虑手写一个动态加载组件 二、实现思路 通过一个加载状态变量&#xff0c;通过v-if判断&#xff0c;加载状态的变量等于哪一个&#xff0c;动态加载组件内部就显示的哪一块组件。 三、实现效果…

安装Schedule库的方法最终解答!_Python第三方库

安装Python第三方库Schedule 我的环境&#xff1a;Window10&#xff0c;Python3.7&#xff0c;Anaconda3&#xff0c;Pycharm2023.1.3 Schedule库 Schedule 是一个轻量级、功能强大而灵活的任务调度工具库&#xff0c;用于在指定的时间间隔内执行任务。为用户提供了简单易用的…

kali使用msf+apkhook520+cploar实现安卓手的攻击

学习网络安全的过程中&#xff0c;突发奇想怎么才能控制或者说是攻击手机 边找工作边实验 话不多说启动kali 一、使用msfapktool生成简单的木马程序 首先使用kali自带的msfvenom写上这样一段代码 选择安卓 kali的ip 一个空闲的端口 要输出的文件名 msfvenom -p android/met…

kafka(五)——消费者流程分析(c++)

概念 ​ 消费者组&#xff08;Consumer Group&#xff09;&#xff1a;由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据&#xff0c;一个分区只能由一个组内消费者消费&#xff1b;消费者组之间互不影响。所有的消费者都属于某个消费者组&#xff0c;即消费者…

今日arXiv最热大模型论文:Dataverse,针对大模型的开源ETL工具,数据清洗不再难!

引言&#xff1a;大数据时代下的ETL挑战 随着大数据时代的到来&#xff0c;数据处理的规模和复杂性不断增加&#xff0c;尤其是在大语言模型&#xff08;LLMs&#xff09;的开发中&#xff0c;对海量数据的需求呈指数级增长。这种所谓的“规模化法则”表明&#xff0c;LLM的性…

HTML - 请你说一下如何阻止a标签跳转

难度级别:初级及以上 提问概率:55% a标签的默认语义化功能就是超链接,HTML给它的定位就是与外部页面进行交流,不过也可以通过锚点功能,定位到本页面的固定id区域去。但在开发场景中,又避免不了禁用a标签的需求,那么都有哪些方式可以禁用…

【就近接入,智能DNS-Geo DNS ,大揭秘!】

做过后端服务或者网络加速的小伙伴&#xff0c;可能或多或少都听说过&#xff0c;智能DNS或者Geo DNS&#xff0c;就是根据用户的位置&#xff0c;返回离用户最近的服务节点&#xff0c;就近接入&#xff0c;以达到服务提速的效果。 那么大家有没想过&#xff0c;这个背后的原理…

C++:日期类的实现 const修饰 取地址及const取地址操作符重载(类的6个默认成员函数完结篇)

一、日期类的实现 根据之前赋值运算符重载逻辑&#xff0c;我们现在来实现完整的日期类。 1.1 判断小于 上篇博客已经实现: bool operator<(const Date& d) {if (_year < d._year){return true;}else if (_year d._year){if (_month < d._month){return true…

总结C/C++中程序内存区域划分

C/C程序内存分配的几个区域&#xff1a; 1. 栈区&#xff08;stack&#xff09;&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中&#xff0c;效率很⾼…