插件窝 干货文章 keepalived结合nginx怎么实现高可用

keepalived结合nginx怎么实现高可用

Nginx 服务器 Keepalived 配置 169    来源:    2025-04-25

Keepalived结合Nginx实现高可用方案

Keepalived结合Nginx可以实现高可用的Web服务架构,确保在主服务器故障时自动切换到备用服务器。以下是详细实现方案:

一、方案概述

  1. 架构组成

    • 两台服务器(主/备)运行Nginx
    • 两台服务器安装Keepalived
    • 虚拟IP(VIP)作为服务入口
  2. 工作原理

    • Keepalived通过VRRP协议管理VIP
    • 主节点持有VIP,提供服务
    • 主节点故障时,备节点自动接管VIP
    • Nginx持续监控,确保服务健康

二、详细配置步骤

1. 安装必要软件

在两台服务器上执行:

# CentOS/RHEL
yum install -y nginx keepalived

# Ubuntu/Debian
apt-get install -y nginx keepalived

2. 配置Nginx

在两台服务器上配置相同的Nginx服务(内容根据实际需求调整):

# /etc/nginx/nginx.conf
http {
    server {
        listen 80;
        server_name your_domain.com;

        location / {
            root /usr/share/nginx/html;
            index index.html;
        }
    }
}

3. 配置Keepalived

主服务器配置 (/etc/keepalived/keepalived.conf)

global_defs {
    router_id LVS_MASTER  # 唯一标识,备机改为LVS_BACKUP
}

vrrp_script chk_nginx {
    script "/usr/bin/killall -0 nginx"  # 检测nginx进程是否存在
    interval 2  # 每2秒检测一次
    weight -20  # 检测失败则优先级减20
}

vrrp_instance VI_1 {
    state MASTER  # 主服务器设置为MASTER,备机设置为BACKUP
    interface eth0  # 修改为实际网卡名称
    virtual_router_id 51  # 虚拟路由ID,主备必须相同
    priority 100  # 主服务器优先级高于备机(如备机设为90)
    advert_int 1  # 主备同步检查间隔

    authentication {
        auth_type PASS
        auth_pass 1111  # 主备密码必须一致
    }

    virtual_ipaddress {
        192.168.1.100  # 虚拟IP(VIP),根据实际网络配置
    }

    track_script {
        chk_nginx  # 关联nginx检测脚本
    }
}

备服务器配置

只需修改以下参数:

router_id LVS_BACKUP
state BACKUP
priority 90  # 低于主服务器

4. 启动服务

在两台服务器上执行:

systemctl start nginx
systemctl enable nginx
systemctl start keepalived
systemctl enable keepalived

三、高可用测试

  1. 故障转移测试

    • 访问VIP(192.168.1.100)应看到主服务器内容
    • 停止主服务器Nginx:systemctl stop nginx
    • 观察VIP是否自动切换到备服务器(约3-5秒)
    • 恢复主服务器Nginx,VIP应切回主服务器
  2. 服务器宕机测试

    • 直接关闭主服务器电源
    • 验证备服务器是否接管VIP

四、高级配置选项

  1. 邮件通知
global_defs {
    notification_email {
        admin@example.com
    }
    notification_email_from keepalived@example.com
    smtp_server smtp.example.com
    smtp_connect_timeout 30
}
  1. 多VIP配置
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.1.101
    }
}
  1. Nginx健康检查增强: 创建更复杂的检查脚本/etc/keepalived/check_nginx.sh
#!/bin/bash
if [ "$(curl -s -o /dev/null -w '%{http_code}' http://localhost)" != "200" ]; then
    systemctl restart nginx
    sleep 2
    if [ "$(curl -s -o /dev/null -w '%{http_code}' http://localhost)" != "200" ]; then
        exit 1
    fi
fi
exit 0

然后更新vrrp_script部分:

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -20
}

五、常见问题解决

  1. VRRP协议问题

    • 确保防火墙允许VRRP协议通信(IP协议号112)
    iptables -A INPUT -p vrrp -j ACCEPT
    
  2. VIP无法切换

    • 检查virtual_router_id是否一致
    • 检查auth_pass是否一致
    • 检查网络是否互通
  3. 脑裂问题

    • 确保至少一台配置为BACKUP
    • 考虑使用多播地址(默认224.0.0.18)

通过以上配置,您已经建立了一个高可用的Nginx服务架构,能够自动处理单点故障,确保服务持续可用。