Nginx+keepalived高可用


机器

192.168.64.129 keepalived(主)  nginx  检测Nginx脚本
192.168.64.130 keepalived(从)  nginx  检测Nginx脚本
192.168.64.131 tomcat-8(8080)    tomcat-9(8090)
192.168.64.200 vip

安装

yum -y install Nginx

yum -y install keepalived

下载Tomcat安装包 jdk安装包 搭建环境

配置keepalived

keepalived主

vrrp_script chk_http_port {
    script "/etc/keepalived/nginx_check1.sh"
    interval 2
    weight -5
    fall 2
    rise 1
}

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.64.200 #vip


}


track_script {
        chk_http_port
    }

}

keepalived(从)

vrrp_script chk_http_port {
    script "/etc/keepalived/nginx_check1.sh"
    interval 2
    weight -5
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state BACKUP #从
    interface ens33 #网卡名称
    virtual_router_id 51 #主从必须一致
    priority 80 #优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.64.200 #vip


}


track_script {
        chk_http_port
    }

}

在默认的keepalive.conf里面还有 virtual_server,real_server,这样的配置,我们这用不到,它是为lvs准备的。。

在默认的keepalive.conf里面还有 virtual_server,real_server,这样的配置,我们这用不到,它是为lvs准备的。。

在默认的keepalive.conf里面还有 virtual_server,real_server,这样的配置,我们这用不到,它是为lvs准备的。。

Nginx配置文件

vim /etc/nginx/conf.d/tff.conf 

upstream webserver {
#负载均衡
           server 192.168.64.131:8080 weight=1; #权重轮询
           server 192.168.64.131:8090 weight=2;
}
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        #反向代理
        proxy_pass http://webserver;
        
        index  index.html index.htm;
    }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }


}

Tomcat

确保两个端口可以访问

重启服务

keepalived  Nginx Tomcat 确保都是正常运行的状态

查看网络

发现只有主keepalived  节点有vip地址   当我们停止主keepalived 节点 发现从 keepalived 节点有vip地址

这就是vip漂移

这就是vip漂移

测试一下是否可以访问

当我们停掉主keepalived节点上Nginx服务会发生什么呢?

肯定报错啦 但是另一个Nginx服务是好的 但是没有起作用 明显不符合高可用

这个时候就可以让keepalived去检测Nginx服务状态 预处理重启Nginx进程 如果重启失败 就停掉Nginx进程服务异常的机器的keepalived服务

这个时候就可以让keepalived去检测Nginx服务状态 预处理重启Nginx进程 如果重启失败 就停掉Nginx进程服务异常的机器的keepalived服务

Nginx检测脚本

192.168.64.129 keepalived(主)  nginx  检测Nginx脚本
192.168.64.130 keepalived(从)  nginx  检测Nginx脚本
192.168.64.131 tomcat-8(8080)    tomcat-9(8090)
192.168.64.200 vip

vim /etc/keepalived/nginx_check1.sh 

#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)

echo "$counter"

if [ "${counter}" = "0" ]; then

    /usr/sbin/service nginx start
    sleep 3

    counter=$(ps -C nginx --no-heading|wc -l)
echo "$counter"

    if [ "${counter}" = "0" ]; then
        echo "开始停止"
     /usr/sbin/service keepalived stop
    fi
fi

停掉Nginx服务 使用这个脚本启动Nginx服务 成功了就往下走 (我的Nginx是用yum安装的)

停掉Nginx服务 使用这个脚本启动Nginx服务 成功了就往下走 (我的Nginx是用yum安装的)

为了测试能看到明显效果我们把主从keepalived机器配置文件参数interval改成30秒检测

重启主从keepalived机器服务 停止主keepalived机器节点上的Nginx服务 等待30秒发现Nginx服务启动成功了 

再一次测试 我们把主keepalived机器节点上的Nginx服务停掉后启动httpd服务(端口号80) 把Nginx服务端口号80占领了

这样Nginx服务就不会起来了(确保Nginx服务启动失败)根据脚本它会去停掉主keepalived机器服务 从keepalived机器服务(接管)也就成了主似的 vip就进行漂移了

当我们发现主keepalived服务停止了 我们去启动 顺带也会发现Nginx服务异常 再去解决 等下一次检测的时候vip就回到主keepalived机器上了

这样才是我们想要的结果