Nginx+Keepalive实现高可用

Posted 诺浅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx+Keepalive实现高可用相关的知识,希望对你有一定的参考价值。

前言

在项目中为了提高并发,一般会采用集群部署,集群部署之后前端就需要一个总的代理,简单的架构图如下

由于nginx的性能很高,一般中小型公司的流量使用单节点的Nginx,后面挂服务集群这种简单的架构都能扛得住。
当然也可以部署多个Nginx,每个Nginx使用一个公网IP,然后使用DNS轮询机制来做负载均衡,但这样会造成公网IP的浪费,且DNS的实时性不高。或者可以采用Nginx集群前面再挂一个统一的入口LVS。
不管你是使用统一的入口LVS还是采用Nginx,为了避免公网IP的浪费,你始终需要对外提供一个统一的入口,所以很多中小公司都会采用单节点的nginx来作为外网的统一入口,但很明显这样会存在单节点故障问题,那么就需要一套机制来保证系统的正常访问。

其主要思路是

使用主备Nginx,当主Nginx出现问题时,备Nginx能立马接替主Nginx,继续对外提供服务。这整套的恢复流程是自动化的,不需要人工参与的。

而keepalive就是实现这个自动化的一个工具

Nginx+Keepalive架构和思路

Nginx+Keepalive之后主备的架构图如下,以下简称Keepalive为KV

主备KV共享一个虚IP,或者叫VIP,我这里的例子这个VIP为:192.168.85.50,用户访问VIP时默认优先访问到主KV的机器,当主KV宕机时,备KV自动切换为主,用户访问VIP时又会访问这台备KV

安装配置Nginx+KV(基于centos8)

准备两台centos8的服务器,我这里的地址为(192.168.85.130(主),192.168.85.131(备)),执行以下步骤

1、关闭防火墙、关闭selinux

# 查看防火墙状态
firewall-cmd --state

# 关闭防火墙
systemctl stop firewalld.service

# 关闭开机自动启动
systemctl disable firewalld.service

关闭selinux参考:https://blog.csdn.net/J080624/article/details/79571986

2、安装keepalived,nginx

yum -y install keepalived
yum -y install nginx

3、编辑主keepalice配置文件

vi /etc/keepalived/keepalived.conf

为以下内容

global_defs 
   notification_email 
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.85.130 #这里修改为本机IP
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   script_user root
   enable_script_security

#添加检测脚本
vrrp_script chk_http_port 
        script "/usr/local/nginx/nginx_check.sh"
        interval 2
        weight 2

vrrp_instance VI_1 
    state MASTER   #主机这里是MASTER 从机是BACKUP
    interface ens33  #网卡
    virtual_router_id 51  # 主、从机的virtual_router_id必须相同
    priority 100   # 主备机取不同的优先级,主机优先级大
    advert_int 1  #心跳检测间隔时间
    authentication 
        auth_type PASS
        auth_pass 1111
    
    virtual_ipaddress 
        192.168.85.50
    
    track_script 
        chk_http_port
    

3、编辑备keepalice配置文件

bal_defs 
   notification_email   #指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱
     acassen@firewall.loc  #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
     failover@firewall.loc
     sysadmin@firewall.loc
   
   notification_email_from Alexandre.Cassen@firewall.loc   #keepalived在发生诸如切换操作时需要发送email通知地址
   smtp_server 192.168.85.131   #指定发送email的smtp服务器
   smtp_connect_timeout 30       #设置连接smtp server的超时时间
   router_id LVS_DEVEL            #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。

vrrp_script chk_http_port 
        script "/usr/local/nginx/nginx_check.sh"
        interval 2   #检测脚本执行间隔时间
        weight 2    #设置当前服务器权重增量

vrrp_instance VI_1 
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication 
        auth_type PASS
        auth_pass 1111
    
    virtual_ipaddress 
        192.168.85.50
    
    track_script 
        chk_http_port
    

5、在主和备上都创建nginx脚本文件

vi /usr/local/nginx/nginx_check.sh
counter=$(ps -C nginx --no-heading|wc -l)
if [ "$counter" = "0" ]; then
    	systemctl restart nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "$counter" = "0" ]; then
        systemctl stop keepalived
    fi
fi

设置脚本的权限

chmod 744 /usr/local/nginx/nginx_check.sh

其语义为每2秒检测一次nginx进程的存在状态,如果不存在就尝试重新启动nginx,然后睡眠2秒再次检测,如果nginx进程还是不存在说明没有启动成功,这个时候就终止keepalived服务,主kv终止后备kv就会上位,这时,流量就会被备机nginx接收。
6、修改备nginx的首页以便在访问主机和备机时能够加以区分

cd /usr/share/nginx/html
vi index.html

随便加一点东西

访问192.168.85.131看看效果

6、启动KV和nginx

systemctl restart nginx
systemctl restart keepalived

7、测试

  1. 访问192.168.85.50,可以看到nginx的主页,说明搭建成功。

  2. 停止主机上的KV,systemctl stop keepalived,继续访问192.168.85.50,显示备机页面,说明备机自动切换为主机了。

  3. 启动主机的KV,再次访问192.168.85.50又能看到主页,说明主机启动之后又成为了主机,备机自动下位(图就不放了,类似的)

  4. 停止主机的Nginx,systemctl stop nginx,会发现Nginx又会被重启。说明脚本执行成功了。

8、其他

查看kv的日志

tail -f /var/log/messages|grep Keepalived

查看VIP是否绑定成功

ip address

参考

https://blog.csdn.net/J080624/article/details/107024434

以上是关于Nginx+Keepalive实现高可用的主要内容,如果未能解决你的问题,请参考以下文章

nginx+keepalive 实现高可用负载均衡方案

keepalive高可用nginx(nginx动静分离)的实现

nginx+keepalive实现高可用热备负载均衡

nginx+keepalive实现高可用负载均衡

K8s 通过 keepalive+nginx 实现 nginx-ingress-controller 高可用

K8s 通过 keepalive+nginx 实现 nginx-ingress-controller 高可用