Nginx双机主备(Keepalived实现)

2023-11-19

前言

首先介绍一下Keepalived,它是一个高性能的服务器高可用或热备解决方案,起初是专为LVS负载均衡软件设计的,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实现web服务端的高可用。

Keepalived以VRRP协议为实现基础,VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。

VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。

下面我们介绍一下nginx keepalived高可用方案的部署安装。

环境准备

在两台主机上准备如下压缩文件:

  • keepalived-2.0.20.tar.gz
  • nginx-1.16.1.tar.gz
虚拟IP 真实IP nginx端口 主从
192.168.124.20 192.168.124.13 80 MASTER
192.168.124.20 192.168.124.14 80 BACKUP

安装nginx

file
新建一个用户:

useradd tianyan

确定安装目录,我这里的安装目录是:/home/tianyan/tianyan_soft/nginx.install。

在这个目录下分别新建两个目录用于安装nginx和keepalived,解压两个压缩包。

执行安装命令:

./configure --prefix=/home/tianyan/tianyan_soft/nginx.install \
--sbin-path=/home/tianyan/tianyan_soft/nginx.install/sbin/nginx --conf-path=/home/tianyan/tianyan_soft/nginx.install/conf/nginx.conf \
--error-log-path=/home/tianyan/tianyan_soft/nginx.install/error.log \
--http-log-path=/home/tianyan/tianyan_soft/nginx.install/access.log \
--pid-path=/home/tianyan/tianyan_soft/nginx.install/nginx.pid \
--lock-path=/home/tianyan/tianyan_soft/nginx.install/nginx.lock \
--user=tianyan --group=tianyan \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-threads  \
--with-pcre \
--http-client-body-temp-path=/home/tianyan/tianyan_soft/nginx.install/client/  \
--http-proxy-temp-path=/home/tianyan/tianyan_soft/nginx.install/proxy/ \
 --http-fastcgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/fcgi/  \
--http-uwsgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/uwsgi  \
--http-scgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/scgi  

如果报错,记得安装相关依赖:

yum install gcc gcc-c++
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)。

注:以非root权限启动时,会出现 nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) 错误。

原因:Linux只有root用户可以使用1024一下的端口

解决办法:

  • 1.按照root权限启动

  • 2.将 /usr/local/nginx/conf/nginx.conf 文件中的80端口改为1024以上。

安装keepalived

./configure --prefix=/usr/local/keepalived

上述命令执行完毕后继续执行:

make && make install

安装完毕后,目录是这个样子:

file

将配置文件拷贝到系统对应的目录下

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
编辑 master 节点的 keepalived.conf
vim /etc/keepalived/keepalived.conf

内容参考如下:

! Configuration File for keepalived

global_defs {
    #一个没重复的名字即可
    router_id hyq_slave
   }


#ng是否运行
vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh"
        interval 2
        weight -20
}

vrrp_instance VI_1 {
    state BACKUP      #  必填,可以是MASTER或BACKUP

    interface ens33
    virtual_router_id 101
    priority 90
    advert_int 1

    # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式
    # 本机ip
    unicast_src_ip 192.168.124.14
    unicast_peer {
        # 其他机器ip
        192.168.124.13
    }
    # 设置nopreempt防止抢占资源
    nopreempt

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    # 与上方nginx运行状况检测呼应
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.124.20
    }
}
编辑 slave 节点的 keepalived.conf
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
    #一个没重复的名字即可
    router_id hyq_slave
   }


#ng是否运行
vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh"
        interval 2
        weight -20
}

vrrp_instance VI_1 {
    state BACKUP      #  必填,可以是MASTER或BACKUP   


    interface ens33
    virtual_router_id 101
    priority 90
    advert_int 1

    # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式
    # 本机ip
    unicast_src_ip 192.168.124.14
    unicast_peer {
        # 其他机器ip
        192.168.124.13
    }
    # 设置nopreempt防止抢占资源
    nopreempt

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    # 与上方nginx运行状况检测呼应
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.124.20
    }
}
编写nginx_check.sh脚本

在/etc/keepalived目录下新建nginx_check.sh脚本

touch nginx_check.sh

编辑其内容为:

#!/bin/sh
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ]
then
  /usr/sbin/nginx
  sleep 1
  A2=`ps -C nginx --no-header |wc -l`
  if [ $A2 -eq 0 ]
  then
    systemctl stop keepalived
  fi
fi

含义是:如果 nginx 停止运行,尝试启动,但是如果无法启动,则杀死本机的 keepalived 进程, keepalied将会把虚拟 ip 绑定到 BACKUP 机器上。
注意: /usr/sbin/nginx是nginx的启动命令,如果你安装到其他目录,则相应的替换。

Keepalived的日志

Keepalived日志默认位置是在/var/log/messages目录下。我们将其修改一下。

由于系统是centos7,修改位置为:/lib/systemd/system/keepalived.service

原内容:

EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalived
ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS

修改为:

file

修改完毕后重新加载service

systemctl daemon-reload

创建命令软连接:

ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived

执行:

keepalived -D -f /etc/keepalived/keepalived.conf
-D   将日志输出到message日志,默认日志也在message
-f    是指定配置文件

修改/etc/sysconfig/keepalived

把KEEPALIVED_OPTIONS="-D" 修改为:KEEPALIVED_OPTIONS="-D -d -S 0"

file

在/etc/rsyslog.conf 末尾添加

local0.*                                                /var/log/keepalived.log

file

最后执行命令:

service rsyslog restart 

重启keepalived后就可以看到日志在/var/log/keepalived.log下了。

测试验证VIP

当keepalived和nginx都启动后,我们来测试一下。

首先在浏览器里面访问三个地址

  • http://192.168.124.20 (vip)
  • http://192.168.124.13 (master)
  • http://192.168.124.14 (slave)

我修改了一下nginx的index.html,可以看到当前vip指向是13的master节点:

file

然后,我们手动停止13上的nginx,再次访问http://192.168.124.20。

file

说明安装成功。

其中通过ip address命令可以观察到网卡的变化
file

实验到这里,我们就完成了keepalived + nginx 主从配置的安装部署了。

思考:如何开启双主模式

什么是双主模式?

分别介绍一下两种配置

1、Nginx+keepalived 主从配置

file

这种方案就是上文介绍过的,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候,永远处于浪费状态,仅仅用于灾备,平时都是空闲着的。

2、Nginx+keepalived 双主配置

这种方案,使用两个vip地址,前端使用2台机器,互为主备,同时有两台机器工作,当其中一台机器出现故障,两台机器的请求转移到一台机器负担,如下图:

file

推荐阅读

【实战】 elasticsearch 写入速度提升的案例分享

用java做一个能赚钱的微信群聊机器人(PC协议)

Mysql百万量级数据高效导入Redis

可视化界面在线生成JVM参数

java线上故障分析+性能调优

ELK实践攻略

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx双机主备(Keepalived实现) 的相关文章

  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • Nginx 502 网关错误。通过增加buffer来解决。为什么?

    我正在设置 LEMP 堆栈来运行 Drupal 我安装了 Nginx 和 PHP FastCGI Nginx 工作正常 但任何运行 PHP 的尝试都会出现错误 502 Bad Gateway 谷歌很快发现 nginx 502 错误网关 ht
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • WordPress 3.0 .htaccess 到 nginx 重写规则的转换

    RewriteEngine On RewriteBase BASE uploaded files RewriteRule files index php L RewriteCond REQUEST URI wp content plugin
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Nginx 与 Daphne 给出 502 Bad Gateway

    由于 Django Channels 和 uwsgi 出现问题 我决定用 daphne 替换 uwsgi 关注后this http masnun rocks 2016 11 02 deploying django channels usin
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐

  • IDEA中如何使用debug调试项目 一步一步详细教程

    原文链接 https www linuxidc com Linux 2017 09 146772 htm 在现在的开发中 我们经常采用Debug来追踪代码的运行流程 通常在程序运行过程中出现异常 启用Debug模式可以分析定位异常发生的位置
  • ST-LINK在MDK环境下载hex提示“Internal command error”和“Error:Flash Download failed Cortex-M3”错误的解决办法

    ST LINK V2在MDK环境下 使用SW DP模式下载hex时出现以下错误提示 出现这种错误一般都是ST LINK和目标板SW DP接线时没有将目标板的电源线接到ST LINK插座的TVCC端导致的 解决步骤 1 目标板使用外接电源供电
  • JDK8新特性(二):JDK8接口增强

    1 接口增强 在JDK8之前 JDK规定接口中只能定义 静态常量 抽象方法 修饰词 interface 接口名 静态常量 抽象方法 在JDK8之后 对接口进行了增强 我们可以在接口中定义 静态常量 抽象方法 默认方法 静态方法 修饰词 in
  • CUDA各版本官方下载地址

    一 CUDA各版本官方下载地址 地址 https developer nvidia com cuda toolkit archive 二 说明 备忘 平时找个版本太难找了 转载于 https www cnblogs com songxing
  • Vue2 + 高德地图API 获取用户当前位置等信息,错误default.CitySearch is not a Constructor的应对

    效果 高德地图API参考手册 控制台输出信息 代码 public index html 使用CDN引入高德地图API
  • SQL--查询结果最后加合计行

    union all 是一种 SQL 操作符 用于将两个或多个 SELECT 语句的结果集合并成一个结果集 与 union 不同的是 union all 不会去重 即会保留重复的行 使用 union all 可以方便地将多个表或查询结果合并成
  • 计算机二级【C语言】-复习使用

    文章目录 第一章 C语言概述 1 1 C语言基础知识 1 23题 1 2 常量 变量和数据类型 24 73题 第二章 运算符与表达式 2 1 C语言运算符简介 74 79题 2 2 算术运算符和算数表达式 80 99题 2 3 赋值运算符和
  • Docker环境安装

    安装Docker 开启Docker服务 查看安装结果 设置开机启动 配置Docker镜像下载加速
  • 【第42篇】MicroNet:以极低的 FLOP 实现图像识别

    文章目录 摘要 一 简介 二 相关工作 三 我们的方法 MicroNet 3 1 设计原则 3 2 Micro Factorized 卷积 3 3 动态 Shift Max 3 4 与先前工作的关系 四 MicroNet 架构 五 实验 I
  • JWT解析库-nimbus-jose-jwt

    JWT解析库 nimbus jose jwt nimbus jose jwt 使用他可以生成或者解析对称加密或者非对称加密的的JWT JWS是JWT规范的落地实现 1 依赖 1 1 pom依赖
  • 深夜好文

    题图 https unsplash com oldskool2016 无论项目中还是面试都离不开装饰器话题 装饰器的强大在于它能够在不修改原有业务逻辑的情况下对代码进行扩展 权限校验 用户认证 日志记录 性能测试 事务处理 缓存等都是装饰器
  • 时间复杂度常见算法

    常见时间复杂度对应算法 注 if的时间复杂度为O 1 一层for循环时间复杂度为O n 两次for循环时间复杂度为O n 一个算法中有多个for 但都是单层for 时间复杂度为O n
  • C语言 每日一题

    C语言 每日一题 9 13 9 19 9月13日 星期一 题目一 有1 2 3 4个数字 能组成多少个互不相同且无重复数字的三位数 都是多少 题目二 输入一个int型整数 按照从右向左的阅读顺序 返回一个不含重复数字的新的整数 保证输入的整
  • Navicat导入Excel数据顺序变了

    项目场景 Navicat导入Excel数据 问题描述 从Excel表格中导入数据到数据库中 但是 在导入的过程中 我们常会发现数据顺序出现了问题 导致数据错位 给数据的处理带来了极大的麻烦 原因分析 这个问题的出现是由于数据库的默认排序规则
  • Jina AI 两周年

    文章导读 2 月是 Jina AI 的生日月 全球各地 Office 用妙趣横生的在线游戏 以及美味的食物 欢快的合照 共同为 Jina AI 庆生 2020 年 2 月 新冠病毒开始肆虐全球 世界各地都逐步进入抗疫紧急状态中 几乎在同一时
  • 【Python】WARNING: Ignoring invalid distribution -ip (c:\python39\lib\site-packages)

    问题描述 在Win10命令行中使用pip命令出现警告信息 WARNING Ignoring invalid distribution ip c python39 lib site packages 解决方案 进入警告信息中报错的目录 c p
  • MyISAM和InnoDB

    1 MyISAM 默认表类型 它是基于传统的ISAM类型 ISAM是Indexed Sequential Access Method 有索引的顺序访问方法 的缩写 它是存储记录和文件的标准方法 不是事务安全的 而且不支持外键 如果执行大量的
  • 8.3雾

    先上图 其实很简单 就是光照和雾的系数插值 雾出现在与摄像机的一定距离 在这个距离内 没雾 在这个距离外 越远雾越大 即雾的系数从0到1 光照系数从1到0 在shader中 代码如下 cbuffer cbFixed float gFogSt
  • 安川服务器输入输出信号,最全PLC输入输出各种回路接线!

    原标题 最全PLC输入输出各种回路接线 一 输入回路接线 输入电路是PLC接收信号的端口 对模拟量来说一般为0 40MA直流电流或0 10V直流电压信号 输入接线是指外部输入器件 任何无源的触点和集电极开路的NPN三极管 接通输入回路闭合
  • Nginx双机主备(Keepalived实现)

    前言 首先介绍一下Keepalived 它是一个高性能的服务器高可用或热备解决方案 起初是专为LVS负载均衡软件设计的 Keepalived主要来防止服务器单点故障的发生问题 可以通过其与Nginx的配合实现web服务端的高可用 Keepa