nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Keepalived搭建nginx高可用

Keepalived搭建nginx高可用的实现

作者:matrixlzp

这篇文章主要介绍了Keepalived搭建nginx高可用的实现,通过VIP实现主备切换,检测进程状态确保服务可用,具有一定的参考价值,感兴趣的可以了解一下

一、环境准备

两台装有 nginx 的 CentOS 虚拟机。

[root@nginx1 ~]# echo "192.168.40.81 say Hello" > /usr/local/nginx/html/index.html
[root@nginx2 ~]# echo "192.168.40.82 say Hello" > /usr/local/nginx/html/index.html

二、原理

Keepalived 为我们后端服务器组虚拟出一组 VIP,该 VIP 只能由优先级最高的一台服务器持有。客户端访问,就只访问 VIP。

当主服务器挂掉之后,Keepalived 自动帮我们把 VIP 漂移到 BACKUP 服务器。以此来保证服务的高可用。

Keepalived 通过检测服务器上的 Keepalived 进程的存活状态,来判断服务器是否存活。

三、安装

1)安装 keepalived

# 在 nginx1 安装 keepalived
[root@nginx1 ~]# yum install -y keepalived
# 在 nginx2 安装 keepalived
[root@nginx2 ~]# yum install -y keepalived

2)配置

使用 yum 安装后配置文件在 /etc/keepalived/keepalived.conf

# 备份 nginx1 keepalived 配置文件
[root@nginx1 keepalived]# cp keepalived.conf keepalived.conf.bak
# 备份 nginx2 keepalived 配置文件
[root@nginx2 keepalived]# cp keepalived.conf keepalived.conf.bak
! Configuration File for keepalived

global_defs {
   router_id lb1
}

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.40.80
    }
}

! Configuration File for keepalived

global_defs {
   router_id lb2
}

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.40.80
    }
}

3)启动

# 启动 MASTER 服务器 keepalived 并设置为开机自启动
[root@nginx1 keepalived]# systemctl enable keepalived --now
[root@nginx1 keepalived]# systemctl status keepalived
[root@nginx1 keepalived]# ip a

会发现 MASTER 服务器多出了 192.168.40.80 这个IP。

# 启动 BACKUP 服务器 keepalived 并设置为开机自启动
[root@nginx2 keepalived]# systemctl enable keepalived --now
[root@nginx2 keepalived]# systemctl status keepalived
[root@nginx2 keepalived]# ip a

备份服务器并不持有 VIP。

4)访问

此时访问 VIP,请求都是被打到 MASTER 上的 nginx。

5)故障测试

# 停掉 MASTER
[root@nginx1 ~]# init 0

 此时 VIP 飘移到 BACKUP。

6)重启 MASTER

 此时 VIP 又漂移回来了。

四、定制脚本

Keepalived 通过检测服务器上的 Keepalived 进程的存活状态,来判断服务器是否存活。

但如果此时,我们的服务器没有挂,但是我们希望 Keepalived 保活的服务(比如 nginx)挂了,由于 Keepalived 进程没有挂,这个时候,Keepalived 是不会帮我们主备切换的。

# 停掉 MASTER
[root@nginx1 ~]# systemctl stop nginx

 这个时候 VIP 并没有迁移走。这个时候,我们就得自己写一个脚本,去检测 nginx 存活状态,如果 nginx 挂了,人为杀死 keepalived 进程,让 keepalived 帮我们主备切换。

先重新启动 nginx

[root@nginx1 ~]# systemctl start nginx

1)修改 keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id lb1
}

vrrp_script check_nginx {
    script "pgrep nginx"
    interval 2
    weight 50  # 当检查失败时,优先级会减去这个值
    fall 2
    rise 2
}

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.40.80
    }
    track_script {
        check_nginx
    } 
}
! Configuration File for keepalived

global_defs {
   router_id lb2
}

vrrp_script check_nginx {
    script "pgrep nginx"
    interval 2
    weight 50  # 当检查失败时,优先级会减去这个值
    fall 2
    rise 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.40.80
    }
    track_script {
        check_nginx
    } 
}

2)重启 keepalived

[root@nginx1 keepalived]# sudo systemctl restart keepalived

[root@nginx2 keepalived]# sudo systemctl restart keepalived

3)停掉 MASTER 

# 停掉 MASTER
[root@nginx1 ~]# systemctl stop nginx

 VIP 这次终于被迁移到 BACKUP。

五、应用场景

Keepalived + Nginx 的组合有很多应用场景:

到此这篇关于Keepalived搭建nginx高可用的实现的文章就介绍到这了,更多相关Keepalived搭建nginx高可用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文