Nginx+Keepalived实现Nginx高可用离线安装教程

下文假定192.168.1.100、192.168.1.101为两台keepalived+Nginx服务器,192.168.1.102为虚拟IP(即VIP)。

在架构设计中,可以利用Nginx反向代理和负载均衡实现后端应用的高可用性,同时我们还需要考虑Nginx的单点故障。因此可改成多Nginx服务,每台Nginx服务器上用keepalived监测Nginx是否正常,不正常会重新启动Nginx,启动不成功会自己杀掉自己由另一台keepalived服务器接管,真正做到架构高可用性。

其实并非两台机器100、101都绑定了VIP,两台keepalived配置有主备优先级配置,优先级高的会拿到VIP,例如100拿到VIP后,那访问102就是实际访问的是100上的Nginx,当把100上Keepalived进程关闭,101会得到VIP,这是访问VIP就是访问101上的Nginx了。

安装keepalived依赖的包

若在步骤二编译安装keepalived时候提示缺libnl/libnl3 dev,需上传依赖至文件夹/opt/rpm:libnl-1.1.4-3.el7.x86_64.rpm、libnl-devel-1.1.4-3.el7.x86_64.rpm

cd /opt/rpm
rpm -ivh *.rpm --nodeps --force

执行上述命令进行安装依赖。

对于安装过程中出现的undefined reference to OPENSSL_init_ssl报错需升级openssl依赖

上传新版本依赖openssl-devel-1.0.2k-19.el7.x86_64.rpm至服务器,并执行安装:

rpm -Uvh openssl-devel-1.0.2k-19.el7.x86_64.rpm #安装新版本依赖
rpm -qa|grep openssl #查看依赖,确认已安装新版依赖

亦可使用rpm -e卸载旧依赖再用rpm -ivh安装新版依赖。

编译安装keepalived

将keepalived的安装包 上传到/usr/local/software 目录下

cd /usr/local/software
tar -zxvf keepalived-2.2.0.tar.gz
cd keepalived-2.2.0
./configure --prefix=/usr/local/keepalived
make && make install

将 keepalived 安装成 Linux 系统服务

安装完成之后, 需要做一些工作复制默认配置文件到 默认路径

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cd /usr/local/software/keepalived-2.2.0
cp ./keepalived/etc/init.d/keepalived /etc/init.d/
chmod 755 /etc/init.d/keepalived

编写nginx检测脚本

新建脚本文件

vi /etc/keepalived/nginx_check.sh

内容如下:

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

赋予执行权限

chmod +x /etc/keepalived/nginx_check.sh

修改keepalived的Master配置文件

vi /etc/keepalived/keepalived.conf

内容如下:

# 全局配置,配置收件人  
global_defs {
   notification_email {           ##通知机制,收件人  
     10000@qq.com  
   }  
   notification_email_from keepalived@domain.com ####发件人  
   smtp_server 192.168.1.100                     ##发件服务器  
   smtp_connect_timeout 30                       ##服务器连接超时时间  
   router_id LVS_DEVEL                           ##路由器标志  
}  
# 集群资源监控,组合track_script进行  
vrrp_script check_haproxy {
    script "/etc/keepalived/nginx_check.sh"  #检测 nginx 状态的脚本路径
    interval 2  #检测时间间隔
    weight -20  #条件成立 权重减20
}  
vrrp_instance HAPROXY_HA {
    # 设置当前主机为主节点,如果是备用节点,则设置为BACKUP 
    state MASTER  
    # 指定HA监测网络接口,可以用ifconfig查看来决定设置哪一个  
    interface eth0  
    # 虚拟路由标识,同一个VRRP实例要使用同一个标识,主备机  
    virtual_router_id 80  
    # 因为当前环境中VRRP组播有问题,改为使用单播发送VRRP报文  如果VRRP组播没问题,以下这块的内容可以注释掉。
    # 这个地方需要关注,之前未做此设置,结果主备节点互相不能发现,因此主备节点都升级成了MASTER,并且绑定了VIP  
    # 主节点时,内容为:  
    #unicast_src_ip 192.168.1.100 
    # unicast_peer {
    # 192.168.1.101 
    #}  
    # 设置优先级,确保主节点的优先级高过备用节点
    priority 100  
    # 用于设定主备节点间同步检查时间间隔  
    advert_int 2  
    # 设置高可用集群中不抢占功能,在主机down后,从机接管,当主机重新恢复后,设置此功能,备机将继续提供服务,从而避免因切换导致的隐患  
    #nopreempt  
    # 设置主备节点间的通信验证类型及密码,同一个VRRP实例中需一致  
    authentication {
        auth_type PASS  
        auth_pass 1234  
    }  
    # 集群资源监控,组合vrrp_script进行  
    track_script {
        check_haproxy  
    }  
    # 设置虚拟IP地址,当keepalived状态切换为MASTER时,此IP会自动添加到系统中  
    # 当状态切换到BACKUP时,此IP会自动从系统中删除  
    # 可以通过命令ip add查看切换后的状态  
    virtual_ipaddress {
        192.168.1.102  #虚拟ip配置完之后就用它访问  
    }  
}

修改keepalived的BACKUP配置文件

# 全局配置,配置收件人  
global_defs {
   notification_email {             ##通知机制,收件人  
     10000@qq.com  
   }  
   notification_email_from keepalived@domain.com ####发件人  
   smtp_server 192.168.1.100                     ##发件服务器  
   smtp_connect_timeout 30                       ##服务器连接超时时间  
   router_id LVS_DEVEL                           ##路由器标志  
}  
# 集群资源监控,组合track_script进行  
vrrp_script check_haproxy {
    script "/etc/keepalived/nginx_check.sh"  #检测 nginx 状态的脚本路径
    interval 2  #检测时间间隔
    weight -20  #条件成立 权重减20
}
vrrp_instance HAPROXY_HA {
    # 设置当前主机为主节点,如果是备用节点,则设置为BACKUP 
    state BACKUP  
    # 指定HA监测网络接口,可以用ifconfig查看来决定设置哪一个  
    interface eth0 
    # 虚拟路由标识,同一个VRRP实例要使用同一个标识,主备机  
    virtual_router_id 80  
    # 因为当前环境中VRRP组播有问题,改为使用单播发送VRRP报文  如果VRRP组播没问题,以下这块的内容可以注释掉。
    # 这个地方需要关注,之前未做此设置,结果主备节点互相不能发现,因此主备节点都升级成了MASTER,并且绑定了VIP  
    # 主节点时,内容为:  
    #unicast_src_ip 192.168.1.101  
    # unicast_peer {
    # 192.168.1.100 
    #}  
    # 设置优先级,确保主节点的优先级高过备用节点
    priority 90  
    # 用于设定主备节点间同步检查时间间隔  
    advert_int 2  
    # 设置高可用集群中不抢占功能,在主机down后,从机接管,当主机重新恢复后,设置此功能,备机将继续提供服务,从而避免因切换导致的隐患  
    nopreempt
    # 设置主备节点间的通信验证类型及密码,同一个VRRP实例中需一致  
    authentication {
        auth_type PASS  
        auth_pass 1234  
    }  
    # 集群资源监控,组合vrrp_script进行  
    track_script {
        check_haproxy  
    }  
    # 设置虚拟IP地址,当keepalived状态切换为MASTER时,此IP会自动添加到系统中  
    # 当状态切换到BACKUP时,此IP会自动从系统中删除  
    # 可以通过命令ip add查看切换后的状态  
    virtual_ipaddress {
        192.168.1.102  #虚拟ip配置完之后就用它访问  
    }  
}

测试高可用

第一步:启动nginx和keepalived服务

启动nginx:

#启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx
#停止
/usr/local/nginx/sbin/nginx -s stop
killall nginx
#重载
/usr/local/nginx/sbin/nginx -s reload

启动keepalived:

#启动
systemctl start keepalived
#停止
systemctl stop keepalived
killall keepalived
#重启
systemctl restart keepalived

启动之后,使用ip addr(centos6之前版本使用 ifconfig) 其中一台服务器会出现虚拟ip绑定到网卡

第二步:通过虚拟ip访问服务

通过虚拟ip访问服务,会跳转到nginx的服务上。

第三步:杀掉一台服务器上的keepalived再次访问服务

注意:杀掉nginx是不行的,因为上面的脚本 是检测到nginx宕机 会重启nginx的,例如这里杀死192.168.1.101上的keepalived进程。

第四步:再次访问服务

会发现虚拟ip 从192.168.1.101上取消了,重新绑定到192.168.1.100上了。

查看日志

tail -f /var/log/messages

查询安装位置

find / -name svnserve
whereis svnserve
目录导航
  • 安装keepalived依赖的包
  • 编译安装keepalived
  • 将 keepalived 安装成 Linux 系统服务
  • 编写nginx检测脚本
  • 修改keepalived的Master配置文件
  • 修改keepalived的BACKUP配置文件
  • 测试高可用
    • 第一步:启动nginx和keepalived服务
    • 第二步:通过虚拟ip访问服务
    • 第三步:杀掉一台服务器上的keepalived再次访问服务
    • 第四步:再次访问服务
    • 查看日志