Keepalived是一个基于VRRP协议实现的高可用解决方案,结合Nginx可以实现Web服务的高可用性。以下是详细实现步骤:
假设有两台服务器: - 主服务器:192.168.1.101 (主机名: nginx-master) - 备服务器:192.168.1.102 (主机名: nginx-backup) - 虚拟IP(VIP):192.168.1.100
# CentOS/RHEL
yum install -y nginx keepalived
# Ubuntu/Debian
apt-get install -y nginx keepalived
vim /etc/nginx/nginx.conf
确保Nginx正常运行并监听80端口
vim /etc/keepalived/keepalived.conf
内容如下:
! Configuration File for keepalived
global_defs {
notification_email {
admin@example.com
}
notification_email_from keepalived@example.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx" # 检查nginx进程是否存在
interval 2 # 每2秒检查一次
weight 2 # 权重
}
vrrp_instance VI_1 {
state MASTER # 主服务器
interface eth0 # 网卡名称,根据实际情况修改
virtual_router_id 51 # 虚拟路由ID,主备必须相同
priority 100 # 优先级(主高于备)
advert_int 1 # 检查间隔
authentication {
auth_type PASS
auth_pass 1111 # 认证密码,主备必须相同
}
virtual_ipaddress {
192.168.1.100/24 dev eth0 # VIP
}
track_script {
chk_nginx # 关联健康检查脚本
}
}
vim /etc/keepalived/keepalived.conf
内容与主服务器类似,主要修改以下参数:
vrrp_instance VI_1 {
state BACKUP # 备服务器
priority 90 # 优先级低于主服务器
# 其他配置与主服务器相同
}
在两台服务器上执行:
systemctl start keepalived
systemctl enable keepalived
systemctl start nginx
systemctl enable nginx
检查VIP分配:
ip addr show eth0
应该可以看到VIP在主服务器上
测试故障转移:
systemctl stop nginx
systemctl start nginx
,VIP应该会回到主服务器测试主服务器宕机:
Nginx健康检查脚本增强版:
创建更健壮的健康检查脚本 /etc/keepalived/check_nginx.sh
:
#!/bin/bash
if [ "$(ps -ef | grep "nginx: master" | grep -v grep)" == "" ]; then
systemctl start nginx
sleep 2
if [ "$(ps -ef | grep "nginx: master" | grep -v grep)" == "" ]; then
exit 1
else
exit 0
fi
else
exit 0
fi
然后修改vrrp_script部分:
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight 2
}
邮件通知: 配置Keepalived在状态变化时发送邮件通知
多备份服务器: 可以添加多个备份服务器,设置不同的优先级
VRRP协议无法通信:
iptables -I INPUT -p 112 -j ACCEPT
VIP无法绑定:
脑裂问题:
通过以上配置,Nginx服务就具备了高可用能力,当主服务器出现故障时,服务可以自动切换到备份服务器,保证业务连续性。