Nginx+keepalived实现nginx高可用

2023-05-16

提前备好两台服务器(主:192.168.2.34,备:192.168.2.24),并安装好nginx,nginx安装此文不做赘述

1、下载keepAlived至/usr/local并解压

wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
tar -zxvf keepalived-2.2.7.tar.gz

2、安装

#创建安装目录
mkdir /usr/local/keepalived
#安装
cd keepalived-2.2.7/
./configure --prefix=/usr/local/keepalived  --sysconf=/etc  ##此处指定安装目录以及配置文件路径
make && make install

3、此时/usr/local 目录下会有三个文件,除了安装目录(keepalived)其余两个都可以删除

 

4、新增配置文件。

#我们安装时就指定了配置文件所在目录/etc/keepalived下
cd /etc/keepalived
#拷贝一个新的配置文件
cp keepalived.conf.sample keepalived.conf

5、修改配置文件

1)主服务上修改配置

! Configuration File for keepalived

global_defs {
   router_id just01 
}

vrrp_script chk_nginx {
    script "/usr/local/src/nginx_check.sh"  #脚本文件路径
    interval 3  # 检测脚本执行的间隔:3s
    weight 2  #权重,如果这个脚本检测为真,服务器权重+2
}

vrrp_instance VI_1 {
    state MASTER   # 指定keepalived的角色,MASTER为主,BACKUP为备。备份服务器上需将MASTER 改为BACKUP
    interface ens192  # 通信端口 通过ip addr可以看到,根据自己的机器配置
    virtual_router_id 51  # vrrp实例id  keepalived集群的实例id必须一致,即主、备机的virtual_router_id必须相同
    priority 100  #优先级,数值越大,获取处理请求的优先级越高。主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1  #心跳间隔,默认为1s。keepalived多机器集群 通过心跳检测当前服务器是否还正常工作,如果发送心跳没反应,备份服务器就会立刻接管;
    authentication {
        auth_type PASS  #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_pass justech  #密码,主备服务器的要设成一样
    }
    virtual_ipaddress {
        10.66.53.200 # 定义虚拟ip(VIP),可多设,每行一个,需要是公司中未使用的ip,最好跟服务器真实ip的网段一样,比如测试环境10.66.53 正式环境10.66.52
    }
	 track_script {
		   chk_nginx  #定义脚本名称,与上面的 vrrp_script 的值一致
	 }
}

2)从服务上修改配置

! Configuration File for keepalived

global_defs {
   router_id just02
}

vrrp_script chk_nginx {
    script "/usr/local/src/nginx_check.sh"  #脚本文件路径
    interval 3  # 检测脚本执行的间隔:3s
    weight 2  #权重,如果这个脚本检测为真,服务器权重+2
}

vrrp_instance VI_1 {
    state BACKUP  # 指定keepalived的角色,MASTER为主,BACKUP为备。
    interface ens192   # 通信端口 通过ip addr可以看到,根据自己的机器配置
    virtual_router_id 51 # vrrp实例id  keepalived集群的实例id必须一致,即主、备机的virtual_router_id必须相同
    priority 80  #优先级,数值越大,获取处理请求的优先级越高。主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1  #心跳间隔,默认为1s。keepalived多机器集群 通过心跳检测当前服务器是否还正常工作,如果发送心跳没反应,备份服务器就会立刻接管;
    authentication {
        auth_type PASS  #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_pass justech  #密码,主备服务器的要设成一样
    }
    virtual_ipaddress {
        10.66.53.200  # 定义虚拟ip(VIP),可多设,每行一个,需要是公司中未使用的ip,最好跟服务器真实ip的网段一样,比如测试环境10.66.53 正式环境10.66.52
    }
	track_script {
		chk_nginx #定义脚本名称,与上面的 vrrp_script 的值一致
	}
}

6、将keepalived加入系统服务

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/sbin/keepalived /etc/init.d/
##刷新系统进程
systemctl daemon-reload
##启动、终止、查看状态、重启
systemctl start keepalived.service
systemctl stop keepalived.service
systemctl status keepalived.service
systemctl restart keepalived.service

7、启动keepalived服务(主备都启)

  8、查看网卡ip

[root@data-anal keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:6e:9b:d2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.34/24 brd 192.168.2.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.2.111/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::716c:e679:1315:14/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

 

先在主服务器(192.168.2.34)上查看,可以看到我们配置的网卡上多出来一个虚拟ip:192.168.2.111,反观备服务器(192.168.2.24)上是没有的。

如果都有的话,可能是配置文件中的虚拟路由id(virtual_router_i)不相同,导致分成了两个虚拟路由

9、通过虚拟ip访问我们提前装好的nginx,我们安装好的两个nginx分别做了区分

  • 主服务器(192.168.2.34)nginx欢迎页

  •  备服务器(192.168.2.24)nginx欢迎页

10、通过我们的VIP(192.168.2.111)访问nginx,此时我们看到是主服务器(192.168.2.34)在响应。

 

11、我们关停主服务器keepalive服务,同时监控备服务器日志信息(默认在 /var/log/messages ),可以看到备服务器同步已经注册了虚拟ip(192.168.2.111),同时通过 ip addr 查看,发现主服务器的虚拟ip已经剔除。

1

systemctl stop keepalived.service

12、此时通过虚拟ip再进行访问,发现已经是备服务器(192.168.2.24)在响应,此时已经实现了keepAlived的高可用。高并发时备服务器可以有多个。

 13、keepalived的高可用为了保证其他服务的正常使用,如果keepalived可用,但应用服务不可用那就是个假象。所以检测其他服务的功能也是必备的,此处我们以检测nginx服务为例(两台服务器都做配置)

  • 在/etc/keepalived目录增加nginx检测脚本chk_nginx.sh,并赋权可执行 chmod +x chk_nginx.sh

 

#!/bin/bash
## 查看某个名称的进程个数  ps -C nginx --no-header |wc -l
A=`netstat -tnlp | grep 80 | grep nginx | wc -l`
if [ $A -eq 0 ];then
  /usr/local/nginx/sbin/nginx
  sleep 2
  if [ `netstat -tnlp | grep 80 | grep nginx | wc -l` -eq 0 ];then
     systemctl stop keepalived.service
  fi
fi

 在keepalived.conf中增加检测。两点要求:vrr_script 在vrrp_instance 之前track_script 在virtual_ipaddress之前

vrrp_script chk_nginx {
    script "/etc/keepalived/chk_nginx.sh"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.2.111
    }
    track_script {
        chk_nginx
    }
}

 

14、重启keepalived服务,保证主备keepalived服务正常,此时34服务器为主,24服务器为备,且虚拟ip在34服务器上,此时关停主服务器nginx,再查进程时发现nginx依然服务正常且 PID 已变,说明已经被keepalived重新拉起

15、此处我们假设一下nginx拉不起来的场景,在脚本中注释拉起nginx的语句,此处不用重启keepalived。

 16、我们停掉nginx,同时我们在备服务器上可以看到,虚拟ip已经漂移至备服务器,同时主keepalived服务已经被停掉

/usr/local/nginx/sbin/nginx -s stop

停之前主keepalived进程

备服务日志

 

停止后keepalived进程

17、此时我们keepalived + Nginx高可用已经实现。

PS:实操过程中有几个要点:

  • 设置网卡时,使用 ip addr 查看绑定网卡信息 
  • 设置虚拟ip时,一定要设置当前网络环境没有被分配的ip,已经分配的ip,启动服务也不会报错,但访问不到。可以用局域网ip扫描工具扫描下。

     
  • chk_nginx.sh中检测间隔时间(sleep 1)一定要比keepalived.conf中配置的检测间隔时间(interval 2)要短,不然会出现一直到不了停keepalived进程
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx+keepalived实现nginx高可用 的相关文章

随机推荐

  • 一个强大的iOS瀑布流布局LBWaterFallLayout

    文章目录 效果图实现思路实现原理核心计算逻辑实现代码协议文件 h 文件 m 文件 使用方法 效果图 实现思路 UICollectionView的精髓就是UICollectionViewLayout UICollectionViewLayou
  • vue3使用websocket简易封装,包含错误重连机制

    websocket实现的全双工通信 xff0c 真真太香了 xff0c 以下是笔者在使用时 xff0c 自己封装的一个简易js工具 若需要源码 xff0c 请移步这里 1 初始化连接 64 description 初始化websocket
  • CentOS7.2安装pyspider

    按照pyspider官方QuickStart xff0c 安装pyspider之前先安装pip xff0c 下面命令直接摘抄了 http blog csdn net myfancysky article details 48847971 w
  • Cannot find module ‘@/xxx‘ or its corresponding type declarations.Vetur(2307)

    问题 开发 vue3 43 ts 项目 xff0c 使用了 monorepo 多个项目在同一个仓储 xff0c 但是在 script 标签里引 ts 文件报错了 xff0c vetur 插件没有应用项目下 tsconfig 配置 xff0c
  • C++学习笔记(《C++新经典》基础部分)

    文章目录 第 9 章 指针9 2 变量的指针和指向变量的指针变量9 2 3 指针变量作为函数参数 第 10 章 结构体与共用体10 1 结构体类型定义 xff0c 结构体变量的定义 引用与初始化10 1 1 定义一个结构体类型10 1 2
  • 汇编中基本的数据类型

    1 字节 xff08 DB xff09 define byte 一个字节有8位二进制组成 xff0c 其最高位是第7位 xff0c 最低位是第0位 在表示有符号数时 xff0c 最高位就是符号位 00001001 xff1d 9 10001
  • 不改HOST,另类打开谷歌搜索的方法

    Google 国内外镜像地址 xff1a http www opengg cn http www gfsoso com http www xiexingwen com http www wow com http www 886404 com
  • x86汇编指令详解

    80x86指令系统 80x86指令系统 xff0c 指令按功能可分为以下七个部分 1 数据传送指令 2 算术运算指令 3 逻辑运算指令 4 串操作指令 5 控制转移指令 6 处理器控制指令 7 保护方式指令 3 3 1数据传送指令 数据传送
  • 汇编指令解释大全

    汇编语言指令详讲 2011 05 13 17 31 32 标签 xff1a it 分类 xff1a 汇编 C C java VB编程 AAA 未组合的十进制加法调整指令 AAA ASCII Adgust for Addition 格式 AA
  • 基于 SpringBoot + Vue 实现的可视化拖拽编辑的大屏项目

    一个基于 SpringBoot 43 Vue 实现的可视化拖拽编辑的大屏项目 AJ Report AJ Report由 安吉加加 开源的一个BI平台 xff0c 酷炫大屏展示 xff0c 能随时随地掌控业务动态 xff0c 让每个决策都有数
  • 汇编语言总结笔记

    汇编语言初识 xff08 一 xff09 开始学习汇编语言 xff0c 对相关的所学知识做个总结 xff0c 希望对自己可以有所提高 1 在计算机中数的表示方式 因为计算机中只能存储二进制数 xff0c 所以一般都是通过二进制直接进行存储
  • Ubuntu18.04重启后无法进入图形化界面

    如果你没有瞎卸载很多东西的话 xff0c 先在字符界面输入你的用户名和密码 xff0c 先尝试这个命令 xff1a sudo systemctl isolate graphical target 不行的话 xff0c 我的解决办法 xff1
  • STM32按键外部中断控制LED流水灯-HAL库

    续上一篇 基于HAL库的32流水灯 http t csdn cn 30QT4 一 硬件选用上 xff0c 我们增加一个四角按键 二 原理图设计 xff0c 上也增加一个开关 LED0 LED2 gt PA0 PA2引脚 KEY1 gt PA
  • Linux系统下定时关机命令shutdown

    接触过linux系统的都知道shutdown命令用于安全的关闭 重启计算机 xff0c 用决定命令shutdown不仅可以实现定时关机 xff0c 还可以由用户自己决定关机时的参数 xff1a 以下简单了解一下同样的功能在linux下使用s
  • 解决Ubuntu 显卡驱动升级导致的 显卡驱动和内核版本不匹配的问题

    解决Ubuntu 显卡驱动升级导致的 显卡驱动和内核版本 xff08 同时内核存在问题 xff09 不匹配的问题 不要轻易升级显卡驱动版本 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xf
  • Nginx+Consul_Upsyc动态切换配置实现动态流量切换

    Nginx 43 Consul Upsyc动态切换配置 大纲 基础概念安装流程测试例子 基础概念 动态配置可以让nginx在不停机的情况下 xff0c 实现动态的切换后端负载的服务器 xff0c 为各种发布方式提供基础的流量切换工作 htt
  • [AHK]实现Word保存前先更新目录

    重新定义热键Ctrl 43 s 用AHK重新定义Ctrl 43 s热键 xff0c 实现当按Ctrl 43 s后 xff0c 会先更新Word中插入的目录 AHK源代码 span class token punctuation span 作
  • win10把中文用户名改为英文用户名的两种方法

    电脑安装好win10系统后后创建了一个中文名的账户 xff0c 进入系统发现C User下的文件夹是中文名 xff0c 虽然中文名方便识别 xff0c 但是这样有一个很不好的地方 xff0c 那就是很多软件安装在个路径下 xff0c 有些软
  • [QMT]08-从本地行情数据解析历史K线信息

    用python解析QMT本地数据 获取本地行情数据 get local data field list 61 stock code 61 period 61 39 1d 39 start time 61 39 39 end time 61
  • Nginx+keepalived实现nginx高可用

    提前备好两台服务器 xff08 主 xff1a 192 168 2 34 xff0c 备 xff1a 192 168 2 24 xff09 xff0c 并安装好nginx xff0c nginx安装此文不做赘述 1 下载keepAlived