基于Keepalived的nginx高可用架构

本文详细描述了一个项目,通过nginx反向代理、Keepalived的负载均衡和双VIP机制,以及NFS技术实现多台服务器间的高可用和数据共享。文中介绍了安装配置步骤,包括Keepalived配置、NFS挂载和nginx代理设置等。
摘要由CSDN通过智能技术生成

一、项目描述

用户使用域名访问两台nginx反向代理机的虚拟IP,并通过Keepalived进行负债均衡处理来实现高可用,再由代理机将用户的访问均衡地传到后端真实服务器

二、项目所用核心技术

nginx服务、Keepalived负载均衡、nfs挂载

三、项目环境准备

五台centOS7.9虚拟机,其中两台作为nginx(版本1.25.2)反向代理机,三台作为真实服务器

四、项目实现过程

1、规划网络拓扑图,分配用户、反向代理机、服务器
在这里插入图片描述
2、所有机器关闭selinux和防火墙

setenforce 0
service firewalld stop

3、在反向代理机上安装并配置nginx,采用默认的轮询算法

#yum安装		yum配置文件 --》 /etc/nginx:
yum install  epel-release -y
yum install  nginx -y
#检查是否安装成功
rpm -qa |grep nginx

默认的轮询算法:当有请求过来的时候,如果请求刚到被代理到down掉的后端真实机,会重新转发一次,转发到可以正常提供服务的真实服务器。这种检查被动,不能提前发现后端真实服务器的状态,而且可能会产生多一次转发,影响效率。

4、对两台代理机安装并配置Keepalived,开启Keepalived进行测试;同时使用Keepalived对代理机部署双vip高可用集群,解决单点问题,并利用双vip做负载均衡

#安装keepalived
yum  install keepalived -y
#keepalived的配置文件目录: /etc/keepalived/keepalived.conf
#主服务器:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_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 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
#   vrrp_strict  #严格遵守vrrp协议
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.250
    }

}

#备服务器:
 vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_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 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
#   vrrp_strict  #严格遵守vrrp协议
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP   #设置为备
    interface ens33  #虚拟ip绑定到哪个网卡
    virtual_router_id 51   #0-255#虚拟路由id  在同一个局域网内 来区分不同的keepalive集群 ,
                                      #如果在同一个keepalive集群中,那每台主机的router id都是一样的  
    priority 50                 #0-255优先级, 优先越高拿到虚拟ip的概率就会越大
    advert_int 1              #隔1s钟发送一次存活检测
    authentication {       #认证方式
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {   #设置虚拟ip
        192.168.10.250
    }

}
#启动服务
systemctl start keepalived
#查看是否启动成功
ps -ef |grep keepalived
#查看vip是否在主服务器上
ip add
#关闭主服务器上的keepalived,查看vip是否在备服务器上
systemctl stop keepalived
#再启动主服务器上的keepalived,查看vip是否回到主服务器上
systemctl start keepalived

开启keepalived后,vip在权重较大的主服务器上
在这里插入图片描述
关闭keepalived后,vip离开主服务器,转移到备服务器
在这里插入图片描述
在这里插入图片描述

重新启动keepalived,vip又回到主服务器
在这里插入图片描述

keepalived已配置完成且可以正常运行,接下来修改配置形成双vip环境

#修改192.168.10.250为主的服务器配置:
! Configuration File for keepalived

global_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 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
#   vrrp_strict  #严格遵守vrrp协议
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_http_port {
    script "/opt/check_nginx.sh"
    interval 2
    weight -60
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 60
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_http_port
    }
    virtual_ipaddress {
        192.168.10.250
    }

}


vrrp_instance VI_2 {
    state  BACKUP  #设置为备 
    interface ens33  #虚拟ip绑定到哪个网卡
    virtual_router_id 61   #0-255#虚拟路由id  在同一个局域网内 来区分不同的keepalive集群 ,
                                      #如果在同一个keepalive集群中,那每台主机的router id都是一样的
    priority 50                 #0-255优先级, 优先越高拿到虚拟ip的概率就会越大
    advert_int 1              #隔1s钟发送一次存活检测
    authentication {       #认证方式
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {   #设置虚拟ip
        192.168.10.251
    }

}

#修改192.168.10.251为主的服务器配置:
! Configuration File for keepalived

global_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 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
#   vrrp_strict  #严格遵守vrrp协议
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP   #设置为备
    interface ens33  #虚拟ip绑定到哪个网卡
    virtual_router_id 60   #0-255#虚拟路由id  在同一个局域网内 来区分不同的keepalive集群 ,
                                      #如果在同一个keepalive集群中,那每台主机的router id都是一样的  
    priority 50                 #0-255优先级, 优先越高拿到虚拟ip的概率就会越大
    advert_int 1              #隔1s钟发送一次存活检测
    authentication {       #认证方式
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {   #设置虚拟ip
        192.168.10.250
    }

}

vrrp_instance VI_2 {
    state  MASTER  #设置为备
    interface ens33  #虚拟ip绑定到哪个网卡
    virtual_router_id 61   #0-255#虚拟路由id  在同一个局域网内 来区分不同的keepalive集群 ,
                                      #如果在同一个keepalive集群中,那每台主机的router id都是一样的
    priority 100                 #0-255优先级, 优先越高拿到虚拟ip的概率就会越大
    advert_int 1              #隔1s钟发送一次存活检测
    authentication {       #认证方式
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {   #设置虚拟ip
        192.168.10.251
    }
#重启keepalived服务,完成配置
systemctl restart keepalived

250的主服务器在ip为192.168.10.140的代理机上,备服务器在ip为192.168.10.129的代理机上
在这里插入图片描述
251的主服务器在ip为192.168.10.129的代理机上,备服务器在ip为192.168.10.140的代理机上
在这里插入图片描述

5、在nginx反向代理机上添加检测脚本,查看nginx是否能完成负债均衡,即只要192.168.10.250的主机器监控(通过脚本)到ngin服务停止,则主机器自己停止keepalived,将VIP交给备份机器处理web请求,直至主机器再次恢复正常,将VIP返还给主机器

#根据nginx服务检测
#添加检测脚本:
vim /opt/check_nginx.sh
/usr/sbin/pidof nginx &>/dev/null

#添加权限  
chmod +x  check_nginx.sh
#修改192.168.10.250为主的服务器配置:
! Configuration File for keepalived

global_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 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
#   vrrp_strict  #严格遵守vrrp协议
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_http_port {
    script "/opt/check_nginx.sh"  #检测脚本位置
    interval 2                    #检测间隔
    weight -60                    #当检测脚本返回非0,将优先级-60
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 60
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #添加检测脚本
    track_script {
        chk_http_port
    }
    virtual_ipaddress {
        192.168.10.250
    }

}

250的主机器监控到nginx服务停止,则主机器自己停止keepalived,将vip交给备机器处理web请求
在这里插入图片描述
在这里插入图片描述

6、在服务器上安装flask、nfs,并在其中一台服务器上配置好flask程序

#在所有后端服务器上,安装python3
yum install python3 -y
pip3 install flask
#在其中一台服务器上编辑flask测试程序:
vim flask-test.py 
from flask import Flask

app = Flask(__name__)
@app.route("/")
def index():
     return "this is flask index"

@app.route("/test")
def test():
    return "this is flask test"

app.run(host="0.0.0.0")
#运行flask web
nohup python3 flask-test.py &nohup: 	#忽略输入并把输出追加到"nohup.out"

7、使用nfs技术将没有flask代码程序的两台服务器挂载到有flask代码程序的服务器上,重启nfs,完成挂载

   #在三台服务器上都安装nfs: 
   yum  install  nfs-utils
   
   #在有flask代码的服务器上启动nfs
   systemctl  start nfs
   #在有flask代码的服务器上编辑/etc/exports文件
   vim /etc/exports
   /opt/flaskapp 192.168.10.140(ro,no_root_squash) 
   /opt/flaskapp 192.168.10.141(ro,no_root_squash)
   #生效
   exportfs
   systemctl restart nfs 

   #将没有flask程序的两台服务器挂载到有flask程序的服务器上
   mount -t nfs 192.168.10.129:/opt/flaskapp /opt/flaskapp
#三台后端真实服务器上都启动flask		注意要在/opt/flaskapp目录下执行:
gunicorn flask-test:app -b "0.0.0.0:5000" --access-logfile="./flask.log" &

注意:另外两台机器上的日志文件需要单独创建
8、在完成keepalived高可用和nfs配置之后对nginx机器进行反向代理配置

#反向代理,nginx配置文件修改
upstream test {
  server 192.168.10.140:5000;
  server 192.168.10.129:5000;
}

server {

    listen 80;
    server_name www.stest.com;

    location / {
        proxy_pass http://test;
    }

}

9、用户通过输入域名,经DNS域名解析访问到nginx代理机,然后前端的代理机将web请求代理到后端的真实服务器上
在这里插入图片描述

10、通过日志文件查看项目进展情况
在这里插入图片描述

五、项目成果:

实现nginx反向代理
实现多台nginx之间的负载均衡,利用keepalived提高了可用性
实现nfs挂载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值