记录一次全面的Keepalived与Nginx高可用集群实战过程
时间:2024-12-23 00:09 作者:Anglei 分类: Linux
实验介绍
通过Keepalived来实现Nginx的HA集群,当集群中的主服务器发生故障后,业务自动切换到备用主机上
组网介绍
如下图所示:由三台主机组成,Ngingx1和Nginx2上运行Nginx服务,并通过Keepalived虚拟出一台主机供客户端访问。Nginx1和Nginx2之间通过10网段进行心跳检测,通过IP192.168.1.20对外提供服务,如果其中一台Nginx进程出现故障,业务自动切换到另外一台主机上。
Nginx1:心跳地址10.0.0.2/24,业务地址192.168.1.14
Nginx2:心跳地址10.0.0.3/24,业务地址192.168.1.15
VIP:192.168.1.20
client:192.168.1.12
实验步骤
步骤1 安装keepalived
在两台nginx主机上安装keepalived
yum install -y keepalvied
步骤2 Nginx1和Nginx2网络配置
两台主机需要配置两个端口,其中ens33用于心跳网络,网段为10.0.0.0/24、ens36用于提供对外服务,网段为192.168.1.0/24
Nginx1主机的网卡设置:
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.0.0.2/24
nmcli connection modify ens36 ipv4.method manual ipv4.addresses 192.168.1.14/24
nmcli connection up ens33
nmcli connection up ens36
Nginx2主机的网卡设置:
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.0.0.3/24
nmcli connection modify ens36 ipv4.method manual ipv4.addresses 192.168.1.15/24
nmcli connection up ens33
nmcli connection up ens36
测试心跳网络和业务网络的连通性
步骤3 keepalived配置
本例将Nginx1设置为主节点,Nginx2设置为备节点,因此将Nginx1上的keepalived配置文件/etc/keepalived/keepalived.conf的内容修改为以下内容
[root@Nginx1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id Nginx1
}
vrrp_instance VI_1 {
state MASTER
interface ens36
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass Huawei@123
}
virtual_ipaddress {
192.168.1.20/24
}
}
将Nginx2的keepalived配置文件修改为以下内容、
! Configuration File for keepalived
global_defs {
router_id Nginx2
}
vrrp_instance VI_1 {
state BACKUP
interface ens36
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass Huawei@123
}
virtual_ipaddress {
192.168.1.20/24
}
}
配置完成后,分别在Nginx1和Nginx2上使用以下命令重启Keepalved服务
systemctl restart keepalived.service
检查Nginx1上是否生成浮动IP
步骤4 测试HA效果
在客户端使用浮动地址访问Nginx服务,会看到返回的都是Nginx1提供的页面,如下图所示:
手动将Nginx1关机,查看然后再用浮动地址访问Nginx服务,发现返回的都是Nginx2提供的页面:
[root@Nginx1 ~]# systemctl stop nginx.service
查看浮动IP是否漂移至Nginx2
步骤5 健康检查配置
目前的配置,Keepalived仅能通过主机是否宕机来进行业务切换,如果仅仅是Nginx业务出现故障是无法切换的,需要在keepalived中添加健康检查来达到检测Nginx是否可用的目的。
首先开启在步骤4中关机的Nginx1,并分别在Nginx1和Nginx2的keepalived配置文件中添加健康检查的相关配置,具体如下:
global_defs {
router_id Nginx1
}
vrrp_script nginx_check
{
script "/etc/keepalived/check.sh"
interval 1
weight -5 #如果脚本返回非零值,则优先级-5
#fail 3 #注意在某些版本的keepalived上该参数无效,不能配置
}
vrrp_instance VI_1 {
……
track_script {
nginx_check
}
}
注意:
- vrrp_script nginx_check后面的大括号要另起一行
- fail参数在某些版本的keepalived上不支持,配置后会导致脚本无法调用。笔者的版本号为Keepalived v2.0.20就不支持
- weight参数的配置:master节点的priority值+weight值(-5)后,要小于backup节点的priority值
- 分别在两台Nginx服务器的/etc/keepalived目录中创建用于检测Nginx服务是否正常启动的脚本check.sh,具体内容如下
vim /etc/keepalived/check.sh
#!/bin/bash
systemctl status nginx | grep "active (running)" > /dev/null
if [ $? -ne 0 ];then
systemctl restart nginx& > /dev/null
sleep 1
systemctl status nginx | grep "active (running)" > /dev/null
if [ $? -ne 0 ];then
systemctl stop keepalived
else
exit
fi
fi
注意:要给该脚本文件加上执行权限、
chmod +x /etc/keepalived/check.sh
步骤6 测试
配置完成后,重启keepalived服务,修改Nginx1上的nginx配置文件,使其不能正常启动,然后停止nginx服务,模拟故障场景
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak systemctl stop nginx systemctl status nginx
我们看到Nginx1上的nginx服务已经停止
我们查看VIP的漂移情况
Nginx1上已经没有VIP了
步骤7 验证
在客户端进行验证,这时候提供服务的是Nginx2了
总结:
以上就是笔者完成的一次完整的用Keepalived实现nginx高可用的实验,其中遇到的一些问题及其注意事项还是非常有参考价值的。如果您恰好有两台nginx服务器,那么就可以用这种方法来实现高可用,大大提高web服务的可靠性。

本文完结,相关标签: nginx 高可用 keepalived
推荐阅读:
![]() 路过(0) |
![]() 雷人(0) |
![]() 握手(0) |
![]() 鲜花(0) |
![]() 鸡蛋(0) |