[转帖]Nginx+Keepalived实现简单的服务高可用

news/发布时间2024/5/4 10:30:20
https://www.cnblogs.com/xiexun/p/14604650.html

 

 

一般情况下,如果我们做小型项目,前端用一个nginx做反向代理即可,大概是这样的

 
image.png

 

但是,作为互联网项目,纯2C的话必然需要做高可用,不仅后端的Server有N个,Nginx同样需要有N个,一主N备,当有一个服务器挂掉的时候,服务能瞬间切换到其他服务器,大概是这样的

 

 
image.png

下面就以上图为例,说明一下如何实现server的高可用。

1、准备

虚拟机两台,同样安装nginx,keepalived,最简单的安装方法yum -y install nginx,yum -y install keepalived。如果找不到安装到哪儿了,可以使用whereis nginx查看,这里不再赘述。
网络划分如下

名称IP虚拟IP操作系统
虚拟机1(VM1) 192.168.136.2 192.168.136.99 centos7.6
虚拟机2(VM2) 192.168.136.4 192.168.136.99 centos7.6

2、关闭防火墙,修改nginx首页,启动nginx

  • 关闭防火墙
systemctl stop firewalld.service #临时关闭,重启失效
systemctl disable firewalld.service  #禁止开机启动
  • 简单起见,我们认为每个nginx都是代理一个服务,只用nginx默认带的静态页作为测试,分别修改页面内容为"Welcome to 192.168.136.4"和“Welcome to 192.168.136.2”
  • 启动nginx
systemctl start nginx

3、修改keepalived的配置文件

主配置如下(默认配置文件:/etc/keepalived/keepalived.conf):

! Configuration File for keepalivedglobal_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 30router_id LVS_DEVEL#  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 2weight -20
}
vrrp_instance VI_1 {state MASTER # 标识为主服务interface ens33 #绑定虚拟机的IPvirtual_router_id 51 # 虚拟路由id,和从机保持一致#mcast_src_ip 192.168.126.2  #本机ippriority 100 #权重,需要高于从机advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {chk_nginx ## 执行 Nginx 监控的服务}virtual_ipaddress {192.168.136.99 #/32 brd 255.255.255.0 dev ens33 label ens33:vip #虚拟IP地址
#        192.168.200.17
#        192.168.200.18}
}

从机配置(默认配置文件:/etc/keepalived/keepalived.conf)

! Configuration File for keepalivedglobal_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 30router_id dreamer1
#   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 ## 检测时间间隔weight -20 ## 如果条件成立,权重-20
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51#mcast_src_ip 192.168.136.4 ## 本机 IP 地址 priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {chk_nginx ## 执行 Nginx 监控的服务}virtual_ipaddress {192.168.136.99#192.168.200.17#192.168.200.18}
}

3、编写监测心跳脚本

上面配置中可以看到有一个脚本文件:/etc/keepalived/nginx_check.sh
查看nginx是否启动,如果没启动则启动,如果启动不起来,停掉keepalived服务,此时心跳断掉,服务转向另一个nginx。

#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then/usr/sbin/nginxsleep 2counter=$(ps -C nginx --no-heading|wc -l)if [ "${counter}" = "0" ]; then/etc/init.d/keepalived stopfi
fi

4、测试

  • 启动192.168.136.2上的nginx和keepalive
  • 启动192.168.136.4上的nginx和keepalive
  • 访问虚拟IP:http://192.168.136.99


     
    image.png
  • 停掉192.168.136.2上的keepalive


     
    image.png
  • 重新启动192.168.136.2上的keepalive,又会回到 Welcome to 192.168.136.2
  • 停掉192.168.136.2上的nginx,系统会自动调回Welcome to 192.168.136.4


     
    image.png

就是这样。

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

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

相关文章

红米Redmi Note 8 拆机进深度刷机模式短接图,刷机、解锁进高通9008模式

首先将手机关机,打开电池盖,用镊子短接下图中的两个触点然后通过数据线连接上电脑,计算机-管理-设备管理器中可以看到手机进入深度刷机模式的端口(高通9008)松开镊子。最后打开刷机工具,选好刷机包即可刷机,短接点位置如图所示

五种方案图文并茂教你使用DBeaver,SQL文件导入数据库,插入数据,备份恢复mysql,postgres数据

备份导出数据 方案一:支持可以整个库导出、部分表导出、多个库导出(可选格式较少) 使用连接数据库 鼠标右键选择需要导出备份的数据库-工具-备份 此步骤对于不同类型数据库来说,有的可以一次选择多个表,有的可以一次选择多个库,下面是两个截图案例勾选需要导出的表-点击下…

想分组聚合各省的条数、总额,及其平均数或者占比的话,Python方便还是slq方便?

大家好,我是Python进阶者。 一、前言 前几天在Python最强王者交流群【斌】问了一个数据处理的问题。问题如下: 求教大佬:我有全国的明细5000条,其中一个字段是省(直辖市), 如果我想分组聚合各省的条数、总额,及其平均数或者占比的话,Python方便还是sql方便? 二、实现…

linux安装/切换不同版本c/c++

查看ubuntu系统上g++的版本:ls /usr/bin/g++*安装指定版本gcc和g++# 以version == 4.9为例 sudo apt-get install gcc-4.9 g++-4.9切换不同版本 当ubuntu系统上安装了不同版本的gcc和g++,可以使用update-alternatives命令设置默认使用哪个版本,典型的如在Ubuntu 16.04里安装…

P5470 [NOI2019]序列 题解

P5470:NOI2019 序列题意:给定两个长度 \(n\) 的序列 \(a,b\)。 要求各选出 \(k\) 个数,使得这 \(2k\) 个数之和最大,且两个序列选出的数至少有 \(l\) 个位置相同。 \(n\le 2\times 10^5\)。command_block 的题解 但是这个貌似有一些小问题,后文有写。 算法:模拟费用流。 …

【MySQL系列】--基础知识1:事务与隔离

1、MySQL:基础知识之事务与隔离