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

keepalived+nginx高可用怎么实现

Keepalived Nginx 服务器 notify 544    来源:    2025-04-27

Keepalived + Nginx 高可用实现方案

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

一、架构概述

  1. 主备模式:一个主节点(MASTER),一个或多个备用节点(BACKUP)
  2. 虚拟IP(VIP):客户端访问的浮动IP地址
  3. 健康检测:Keepalived监控Nginx服务状态

二、环境准备

  • 至少两台服务器(主备)
  • 相同配置的Nginx服务
  • 确保服务器间网络互通

三、安装与配置步骤

1. 在两台服务器上安装Nginx

# CentOS/RHEL
yum install -y nginx
systemctl enable nginx
systemctl start nginx

# Ubuntu/Debian
apt-get install -y nginx
systemctl enable nginx
systemctl start nginx

2. 在两台服务器上安装Keepalived

# CentOS/RHEL
yum install -y keepalived

# Ubuntu/Debian
apt-get install -y keepalived

3. 配置Keepalived

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

global_defs {
   router_id nginx_master  # 标识,建议每台不同
}

vrrp_script chk_nginx {
    script "/usr/bin/killall -0 nginx"  # 检测nginx进程是否存在
    interval 2  # 每2秒检测一次
    weight -5   # 检测失败权重减少5
    fall 2      # 连续2次检测失败才认为失败
    rise 1      # 检测1次成功就认为成功
}

vrrp_instance VI_1 {
    state MASTER          # 主服务器
    interface eth0        # 网卡名称,根据实际情况修改
    virtual_router_id 51  # 虚拟路由ID,主备必须相同
    priority 100          # 优先级,主服务器要高

    advert_int 1          # 检查间隔1秒

    authentication {
        auth_type PASS
        auth_pass 1111    # 密码,主备必须相同
    }

    virtual_ipaddress {
        192.168.1.100/24  # 虚拟IP地址,根据实际情况修改
    }

    track_script {
        chk_nginx         # 调用上面定义的nginx检测脚本
    }

    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

备用服务器配置

global_defs {
   router_id nginx_backup
}

vrrp_script chk_nginx {
    script "/usr/bin/killall -0 nginx"
    interval 2
    weight -5
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state BACKUP           # 备用服务器
    interface eth0
    virtual_router_id 51  # 必须与主服务器相同
    priority 90           # 优先级低于主服务器

    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.1.100/24
    }

    track_script {
        chk_nginx
    }

    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

4. 创建通知脚本(可选)

#!/bin/bash
# /etc/keepalived/notify.sh

TYPE=$1
NAME=$2
NOW=$(date +"%F %T")

case $TYPE in
    "master")
        echo "$NOW - 切换为MASTER" >> /var/log/keepalived-status.log
        # 可以在这里添加成为主节点后要执行的命令
        ;;
    "backup")
        echo "$NOW - 切换为BACKUP" >> /var/log/keepalived-status.log
        # 可以在这里添加成为备节点后要执行的命令
        ;;
    "fault")
        echo "$NOW - 切换为FAULT" >> /var/log/keepalived-status.log
        # 可以在这里添加故障时要执行的命令
        ;;
    *)
        echo "$NOW - 未知状态: $TYPE" >> /var/log/keepalived-status.log
        ;;
esac

给脚本执行权限:

chmod +x /etc/keepalived/notify.sh

5. 启动Keepalived服务

systemctl enable keepalived
systemctl start keepalived

四、测试高可用性

  1. VIP漂移测试:在主服务器上停止keepalived或nginx服务,观察VIP是否自动切换到备用服务器

    systemctl stop nginx  # 在主服务器上执行
    

    然后检查备用服务器是否接管了VIP:

    ip addr show eth0 | grep "192.168.1.100"
    
  2. 恢复测试:恢复主服务器的服务,观察VIP是否自动切回

    systemctl start nginx
    systemctl start keepalived
    

五、高级配置选项

  1. 多节点负载均衡:可以配置多个BACKUP节点,设置不同的优先级
  2. 邮件通知:在global_defs中添加通知邮箱配置
  3. 更复杂的健康检查:可以编写自定义脚本检查Nginx的实际响应

六、常见问题解决

  1. VIP无法绑定:检查网络配置,确保没有其他服务占用该VIP
  2. 主备同时绑定VIP:检查防火墙是否阻止了VRRP协议(IP协议号112)
  3. 切换不灵敏:调整advert_int和检测间隔参数

通过以上配置,您就实现了一个高可用的Nginx服务架构,能够自动在主服务器故障时切换到备用服务器,确保服务持续可用。