使用Keepalived 实现Nginx 双机热备

使用Keepalived 实现Nginx 双机热备 #

2021-12-01 20:05

Nginx 安装 #

首先准备两台服务器,上面均部署Nginx。

参考这里 Linux 的 Nginx 安装【转】

Keepalived 安装 #

yum install -y keepalived

Keepalived 配置 #

简单模式 #

目录 /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   #路由id,全局唯一,表示当前keepalived节点的唯一性
   router_id keep_15
}

vrrp_instance VI_1 {
    #设置当前实例状态为MASTER。MASTER代表是主实例,BACKUP代表是备用实例
    state BACKUP
    #当前实例绑定的网卡
    interface eth0
    #当前实例的虚拟路由id,一组主备的实例的路由id是相同的
    virtual_router_id 101
    #当前实例的优先级
    priority 100
    #主备之间同步检查时间间隔
    advert_int 1
    #一组主备实例的认证密码,方式非法节点进入路由组
    authentication {
        auth_type PASS
        auth_pass 123456Qw
    }
    #设置当前实例的虚拟IP
    virtual_ipaddress {
        192.168.137.101 dev eth0
    }
}

主备的Nginx 服务器上,均使用该配置,调整router_id即可。网卡名eth0记得跟改为服务器上的网卡名。

重启Keepalived:systemctl restart keepalived。轮流关闭Keepalived,可以发现虚拟IP192.168.137.101在两台主机上进行漂移。

应对主备机某些情况下单机不可用的情况,Keepalived 这样已经够用了。任意机器挂掉,都能保障192.168.137.101是可用的。

有时候,我们还想使用脚本做一些更高阶的操作。比如说,Keepalived 定时检查业务进程,如果进程挂掉尝试重启,重启失败则主动kill 自身,让虚拟IP 飘逸到另外一台机器上。可以参考如下配置。

增加check 操作的模式 #

首先,我们增加在/data/sh下增加一个脚本文件:check_nginx.sh

#!/bin/bash
status=$(ps -C nginx --no-heading|wc -l)
if [ "${status}" = "0" ]; then
    /usr/sbin/nginx
    status2=$(ps -C nginx --no-heading|wc -l)
    if [ "${status2}" = "0"  ]; then
        systemctl stop keepalived
    fi
fi

该脚本的工作就是检查Nginx 进程是否存在,不存在则尝试重启,重启失败则停止Keepalived。

然后,我们调整/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
    # 路由id,全局唯一,表示当前keepalived节点的唯一性
    router_id keep_14
    # 执行script 的用户
    script_user root
}

vrrp_script chk_nginx {
    script "/data/sh/check_nginx.sh"
    # 5秒检查一次
    interval 5
    # 每次操作可以增减权重,这里我们置为0,先不使用
    weight 0
}

vrrp_instance VI_1 {
    #设置当前实例状态为MASTER。MASTER代表是主实例,BACKUP代表是备用实例
    state BACKUP
    #当前实例绑定的网卡
    interface eth0
    #当前实例的虚拟路由id,一组主备的实例的路由id是相同的
    virtual_router_id 101
    #当前实例的优先级
    priority 100
    #主备之间同步检查时间间隔
    advert_int 5
    #一组主备实例的认证密码,方式非法节点进入路由组
    authentication {
        auth_type PASS
        auth_pass 123456Qw
    }
    #设置当前实例的虚拟IP
    virtual_ipaddress {
        192.168.137.101 dev eth0
    }

    track_script {
        chk_nginx
    }
}

这个配置有两个地方要注意的。

  1. script_user:执行脚本的用户,这里简单设置为了root。为了安全起见,可以专门增加一个别的用户来执行脚本。
  2. 关闭selinux,如不关闭,查看/var/log/messages会看到这么一个错误:Unable to access script
    1. 手动关闭setlinux:setenforce 0
    2. 永久关闭,修改文件/etc/sysconfig/selinux:SELINUX=disabled

好了,重启Keepalived,即可看到效果了:关闭Nginx,几秒后,Nginx 就被重启起来了。

SELinux(Security-Enhanced Linux) 是 美国国家安全局(NSA)对于 强制访问控制的实现,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。

SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。