nginx+keepalived实现nginx高可用集群以及nginx实现Gateway网关服务集群
一、前言
1、简介
Nginx作为一款高性能的Web服务器和反向代理服务器,被广泛使用。且现如今很多高并发场景需要后端服务集群部署,因此nginx也需要支持集群部署从而避免单点故障的问题。
本文将详细介绍使用 Keepalived+Nginx 来实现Nginx的高可用集群和Nginx实现Gateway网关服务集群。
2、什么是Keepalived?
Keepalived是基于VRRP协议,作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
简单来讲Keepalived可以在master和slave子网卡建立一个相同的VIP(virtual IP),然后通过同一个虚拟出来的IP地址就可以访问两台服务器的Nginx。
二、实现步骤
实现 Keepalived+Nginx 高可用集群共有两种常用方案,即主从模式和双主模式。服务安装很简单所以本文不介绍如何安装Keepalived和Nginx服务,将从配置方面分别介绍如何实现。
1、主从模式
这种方案由两台服务器均部署一个Keepalived和一个Nginx服务,然后虚拟出一个VIP地址,两台服务器一台做主一台做备,但同时只有一台机器工作,主节点宕机后由从节点自动成为主节点。当主节点不出现故障的时候,从节点永远处于空闲状态。当主节点宕机重新上线后自动再次成为主节点。
1.1 服务器规划
| 角色 | ip | vip地址 | 部署服务 |
|---|---|---|---|
| 主节点 | 10.50.7.51 | 10.50.7.100 | Keepalived+Nginx |
| 从节点 | 10.50.7.76 | 10.50.7.100 | Keepalived+Nginx |
1.2 服务配置
1.2.1 keepalived配置
1、主节点keepalived.conf 配置如下(我的目录是在 /etc/keepalived/keepalived.conf如下图):

keepalived.conf :
! Configuration File for keepalivedglobal_defs {#路由id:当前安装keepalived节点主机的标识符,全局唯一router_id keep_51
}# 定义chk_nginx脚本,脚本执行间隔10秒,权重-10,检测nginx服务是否在运行。
vrrp_script chk_nginx { #这里通过脚本监测 script "/etc/keepalived/chk_nginx.sh" #脚本执行间隔,每2s检测一次interval 2 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 weight -10 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) fall 2 #检测1次成功就算成功。但不修改优先级 rise 1
}vrrp_instance VI_1 {# 表示的状态,当前服务器为nginx的主节点,MASTER/BACKUPstate MASTER# 当前实例绑定的网卡 可通过ip addr查询interface ens18# 保证主备节点一致virtual_router_id 100# 优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTERpriority 100# 主备之间同步检查的时间间隔,默认1sadvert_int 1# 认证授权的密码,防止非法节点的进入authentication {auth_type PASSauth_pass 1111}# 虚拟出来的VIP地址virtual_ipaddress {10.50.7.100}#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!track_script { #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。 chk_nginx }
}
2、从节点keepalived.conf配置:
! Configuration File for keepalivedglobal_defs {#路由id:当前安装keepalived节点主机的标识符,全局唯一router_id keep_76
}# 定义chk_nginx脚本,脚本执行间隔10秒,权重-10,检测nginx服务是否在运行。
vrrp_script chk_nginx { #这里通过脚本监测 script "/etc/keepalived/chk_nginx.sh" #脚本执行间隔,每2s检测一次interval 2 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 weight -10 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) fall 2 #检测1次成功就算成功。但不修改优先级 rise 1
}vrrp_instance VI_1 {# 表示的状态,当前服务器为nginx的从节点,MASTER/BACKUPstate BACKUP# 当前实例绑定的网卡 可通过ip addr查询interface ens18# 保证主备节点一致virtual_router_id 100# 优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTERpriority 99# 主备之间同步检查的时间间隔,默认1sadvert_int 1# 认证授权的密码,防止非法节点的进入authentication {auth_type PASSauth_pass 1111}# 虚拟出来的VIP地址virtual_ipaddress {10.50.7.100}#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!track_script { #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。 chk_nginx }
}
3、chk_nginx.sh
vim /etc/keepalived/chk_nginx.sh,
编辑完内容之后需要赋权限,命令:chmod +x /etc/keepalived/chk_nginx.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then /home/chnsys/ecms/nginx/sbin/nginxsleep 3 if [ `ps -C nginx --no-header |wc -l` -eq 0 ] thensystemctl stop keepalived fi
fi
或者
#!/bin/bashcounter=$(ps -ef|grep nginx | grep -v 'grep'|wc -l)if [ "${counter}" = "0" ]; then/home/chnsys/ecms/nginx/sbin/nginx || truesleep 3counter=$(ps -ef|grep nginx | grep -v 'grep'|wc -l)if [ "${counter}" = "0" ]; thensystemctl stop keepalivedfifi
上述脚本需要按实际修改nginx的启动命令,两个脚本均可推荐第二个,这两个 Bash 脚本的主要目的是检查 Nginx 是否正在运行,并在其未运行时启动 Nginx。如果启动后 Nginx 仍然未运行,那么它将停止 keepalived 服务,keepalived 停止之后,将由从节点代替为主节点,防止主节点keepalived服务运行但是nginx服务挂掉导致后续服务无法访问的问题。
1.3 启动服务
分别启动两个服务器的nginx服务和keepalived服务,命令如下:
/home/chnsys/ecms/nginx/sbin/nginx(看具体的安装位置)
systemctl start keepalived (全局生效)
1.4 验证效果
分别访问主服务器和从服务器以及虚拟vip的nginx服务的默认页面地址:

可以看到,访问虚拟的VIP地址也可以访问到主服务器的nginx的默认页面。
1.5 主从切换
1、nginx
关闭主节点上的nginx服务,观察主节点的nginx是否会被自动重启。如果重启则说明chk_nginx脚本执行成功,如果nginx未能重启,则应当执行脚本中的命令关闭keepalived服务。
2、keepalived
关闭主节点的keepalived服务,观察vip是否会绑定到从服务器上。
重启主节点的keepalived服务,观察vip是否会绑定到主服务器上。
2、互为主从模式
这种方案,使用两个VIP地址,互为主备,轮询请求两个VIP地址,同时有两台机器工作,当其中一台机器出现故障,两台机器的请求转移到一台机器负担,非常适合于生产架构环境。
2.1 服务器规划
| 角色 | ip | vip地址 | 部署服务 |
|---|---|---|---|
| 主、从节点 | 10.50.7.51 | 10.50.7.100 | Keepalived+Nginx |
| 从、主节点 | 10.50.7.76 | 10.50.7.101 | Keepalived+Nginx |
2.2 服务配置
2.2.1 keepalived配置
在双主模式中,大致内容与主从模式一样,需要额外添加以下内容,新增一个新的vrrp_instance配置,state 为主从配置相反的角色,如下:
注:chk_nginx.sh脚本在1.2.1 keepalived配置的第三个
1、主节点keepalived.conf 配置如下:
! Configuration File for keepalivedglobal_defs {#路由id:当前安装keepalived节点主机的标识符,全局唯一router_id keep_51}# 定义chk_nginx脚本,脚本执行间隔10秒,权重-10,检测nginx服务是否在运行。vrrp_script chk_nginx { #这里通过脚本监测 script "/etc/keepalived/chk_nginx.sh" #脚本执行间隔,每2s检测一次interval 2 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 weight -10 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) fall 2 #检测1次成功就算成功。但不修改优先级 rise 1 }vrrp_instance VI_1 {# 表示的状态,当前服务器为nginx的主节点,MASTER/BACKUPstate MASTER# 当前实例绑定的网卡 可通过ip addr查询interface ens18# 保证主备节点一致virtual_router_id 100# 优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTERpriority 100# 主备之间同步检查的时间间隔,默认1sadvert_int 1# 认证授权的密码,防止非法节点的进入authentication {auth_type PASSauth_pass 1111}# 虚拟出来的VIP地址virtual_ipaddress {10.50.7.100}#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!track_script { #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。 chk_nginx }}vrrp_instance VI_2 {# 表示的状态,当前服务器为nginx的主节点,MASTER/BACKUPstate BACKUP# 当前实例绑定的网卡 可通过ip addr查询interface ens18# 保证主备节点一致virtual_router_id 101# 优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTERpriority 99# 主备之间同步检查的时间间隔,默认1sadvert_int 1# 认证授权的密码,防止非法节点的进入authentication {auth_type PASSauth_pass 1111}# 虚拟出来的VIP地址virtual_ipaddress {10.50.7.101}#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!track_script { #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。 chk_nginx }}
2、从节点keepalived.conf 配置如下:
! Configuration File for keepalivedglobal_defs {router_id 76
}# 定义chk_nginx脚本,脚本执行间隔10秒,权重-10,检测nginx服务是否在运行。
vrrp_script chk_nginx { #这里通过脚本监测 script "/etc/keepalived/chk_nginx.sh" #脚本执行间隔,每2s检测一次interval 2 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 weight -10 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) fall 2 #检测1次成功就算成功。但不修改优先级 rise 1
}vrrp_instance VI_1 {state BACKUPinterface ens18virtual_router_id 100priority 99advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.50.7.100}#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!track_script { #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。 chk_nginx }
}vrrp_instance VI_2 {state MASTERinterface ens18virtual_router_id 101priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.50.7.101}#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!track_script { #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。 chk_nginx }
}
2.3 启动或重启服务
分别启动两个服务器的nginx服务和keepalived服务,命令如下:
/home/chnsys/ecms/nginx/sbin/nginx(看具体的安装位置)
systemctl restart keepalived (全局生效)
2.4 验证效果
分别访问主服务器和从服务器的虚拟vip的nginx服务的默认页面地址:

可以看到两个服务器互为主从的效果
2.5 主从切换
同上述1.5中效果验证即可
三、实现网关集群
本文通过两种方案实现 Keepalived+Nginx 的高可用集群。还有一些其他的特性功能,例如主备节点切换后邮件通知等也只需修改相关配置即可,本文主要实现主备切换的功能就不在此赘述。
一般来讲会再通过nginx来路由请求后台网关服务,网关服务同样需要集群来解决单点故障问题,可以利用nginx的特性来反向代理网关集群:
1、nginx.conf配置
upstream niginx-http-cluster{server 10.50.7.51:8080;server 10.50.7.76:8080;
}server {listen 8080;server_name localhost;location / {proxy_redirect off;proxy_set_header Host $host;proxy_set_header Origin '';proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://niginx-http-cluster/hello/;}
}
按照上述配置之后,nginx会轮询访问两个网关服务的地址,当其中一个服务挂掉之后,就会自动切换到正常的服务,从而实现网关服务集群。
相关文章:
nginx+keepalived实现nginx高可用集群以及nginx实现Gateway网关服务集群
一、前言 1、简介 Nginx作为一款高性能的Web服务器和反向代理服务器,被广泛使用。且现如今很多高并发场景需要后端服务集群部署,因此nginx也需要支持集群部署从而避免单点故障的问题。 本文将详细介绍使用 KeepalivedNginx 来实现Nginx的高可用集群和N…...
主键、外键、建表范式、MySQL索引、用户管理
1 案例1:主键 1.1 问题 完成如下练习: 练习主键的创建、查看、删除、添加、验证主键练习复合主键的使用练习与auto_increment连用的效果 1.2 方案 主键使用规则: 表头值不允许重复,不允许赋NULL值一个表中只能有一个primary…...
探究前端路由hash和history的实现原理(包教包会)
今天我们来讲一讲前端中很重要的一个部分路由(router),想必前端小伙伴对‘路由’一词都不会感到陌生。但是如果哪天面试官问你,能大概说一说前端路由的实现原理吗? 你又会如何应对呢? 今天勇宝就带着大家一…...
幻兽帕鲁服务器多少钱?有买过的吗?
幻兽帕鲁服务器多少钱?太卷了,降价到24元1个月,阿里云4核16G10M游戏服务器26元1个月、149元半年,腾讯云4核16G游戏服务器32元、312元一年,华为云26元,京东云主机也是26元起。云服务器吧yunfuwuqiba.com给大…...
MCU独立按键单控LED实现
##江科大视频学习,并且对具体的一些小细节进行更详细的分析。 什么是独立按键? 轻触按键:相当于是一种电子开关,按下开头接通,松开时开头断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 注意…...
[数据集][目标检测]游泳者溺水数据集VOC+YOLO格式2类别895张
数据集制作单位:未来自主研究中心(FIRC) 数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):895 标注数量(xml文件个数):…...
2402C++,C++使用单链列表
原文 #include <windows.h> #include <malloc.h> #include <stdio.h>//用于列表项的结构;第一个成员是SLIST_ENTRY结构,其他成员是数据.在此,数据只是测试 typedef struct _PROGRAM_ITEM {SLIST_ENTRY ItemEntry;ULONG Signature; } PROGRAM_ITEM, *PPROGR…...
《Docker极简教程》--Docker服务管理和监控--Docker服务的监控
Docker监控的必要性在于确保容器化环境的稳定性、性能和安全性。以下是几个关键原因: 性能优化和故障排除:监控可以帮助识别容器化应用程序的性能问题,并快速进行故障排除。通过监控关键指标,如CPU利用率、内存使用、网络流量等&…...
C++初阶 | [八] (下) vector 模拟实现
摘要:vector 模拟实现讲解(附代码示例),隐藏的浅拷贝,迭代器失效 在进行 vector 的模拟实现之前,我们先粗略浏览一下 stl_vector.h 文件中的源码来确定模拟实现的大体框架。 这里提供一些粗略浏览源码的技巧…...
信息安全计划
任何管理人员或人力资源专业人士都知道,除非彻底记录标准和实践,否则永远无法真正实施和执行标准和实践。正如您可能想象的那样,在保护您的网络、技术和数据系统免受网络威胁以及在发生这些事件时规划最及时、高效和有效的响应时,…...
【更新完毕】2024牛客寒假算法基础集训营6 题解 | JorbanS
文章目录 [A - 宇宙的终结](https://ac.nowcoder.com/acm/contest/67746/A)[B - 爱恨的纠葛](https://ac.nowcoder.com/acm/contest/67746/B)[C - 心绪的解剖](https://ac.nowcoder.com/acm/contest/67746/C)[D - 友谊的套路](https://ac.nowcoder.com/acm/contest/67746/D)[E …...
FL Studio All Plugins Edition2024中文完整版Win/Mac
FL Studio All Plugins Edition,常被誉为数字音频工作站(DAW)的佼佼者,是音乐制作人和声音工程师钟爱的工具。它集音频录制、编辑、混音以及MIDI制作为一体,为用户提供了从创作到最终作品输出的完整工作流程。这个版本…...
神经网络系列---归一化
文章目录 归一化批量归一化预测阶段 测试阶段γ和β(注意)举例 层归一化前向传播反向传播 归一化 批量归一化 (Batch Normalization)在训练过程中的数学公式可以概括如下: 给定一个小批量数据 B { x 1 , x 2 , … …...
2023 龙蜥操作系统大会演讲实录:《兼容龙蜥的云原生大模型数据计算系统——πDataCS》
本文主要分三部分内容:第一部分介绍拓数派公司,第二部分介绍 πDataCS 产品,最后介绍 πDataCS 与龙蜥在生态上的合作。 杭州拓数派科技发展有限公司(简称“拓数派”,英文名称“OpenPie”)是国内基础数据计…...
【Vue渗透】Vue站点渗透思路
原文地址 极核GetShell 前言 本文经验适用于前端用Webpack打包的Vue站点,阅读完本文,可以识别出Webpack打包的Vue站点,同时可以发现该Vue站点的路由。 成果而言:可能可以发现未授权访问。 识别Vue 识别出Webpack打包的Vue站…...
主数据管理是数字化转型成功的基石——江淮汽车案例分享
汽车行业数字化转型的背景 在新冠疫情导火索的影响下,经济全球化政治基础逐渐动摇。作为全球最大的汽车市场,我国的汽车市场逐渐由增量转为存量市场。 在数字化改革大背景下,随着工业4.0时代的到来,江淮汽车集团力争实现十四五数…...
【Spring连载】使用Spring Data访问 MongoDB(十一)----加密Encryption (CSFLE)
[TOC](【Spring连载】使用Spring Data访问 MongoDB(十一)----加密Encryption (CSFLE)) 一级目录 二级目录 三级目录...
【postgresql】数据表id自增与python sqlachemy结合实例
需求: postgresql实现一个建表语句,表名:student,字段id,name,age, 要求:每次添加一个数据id会自动增加1 在PostgreSQL中,您可以使用SERIAL或BIGSERIAL数据类型来自动生成主键ID。以下是一个创建名为stude…...
什么是索引?在 MySQL 中有哪些类型的索引?它们各自的优势和劣势是什么?
什么是索引?在 MySQL 中有哪些类型的索引?它们各自的优势和劣势是什么? 索引是数据库中用于帮助快速查询数据的一种数据结构。在 MySQL 中,索引可以显著提高查询性能,因为它允许数据库系统不必扫描整个表来找到相关数据…...
Docker安装与基础知识
目录 -----------------Docker 概述--------------------------- 容器化越来越受欢迎,因为容器是: Docker与虚拟机的区别: Docker核心概念: ●镜像 ●容器 ●仓库 -----------------安装 Docker--------------------------…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
