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

nginx怎么结合keepalived实现高可用

服务器 Nginx Keepalived 配置 983    来源:    2025-04-27

Nginx结合Keepalived实现高可用方案

Keepalived是一个基于VRRP协议实现的高可用解决方案,结合Nginx可以实现Web服务的高可用性。以下是详细实现步骤:

一、架构原理

  1. VRRP协议:虚拟路由冗余协议,允许多台服务器共享一个虚拟IP(VIP)
  2. 主备模式:一台主服务器(Master)和一台或多台备份服务器(Backup)
  3. 故障转移:当主服务器故障时,VIP会自动漂移到备份服务器

二、环境准备

假设有两台服务器: - 主服务器:192.168.1.101 (主机名: nginx-master) - 备服务器:192.168.1.102 (主机名: nginx-backup) - 虚拟IP(VIP):192.168.1.100

三、安装配置步骤

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

# CentOS/RHEL
yum install -y nginx keepalived

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

2. 配置Nginx(两台服务器相同配置)

vim /etc/nginx/nginx.conf

确保Nginx正常运行并监听80端口

3. 配置Keepalived

主服务器配置 (nginx-master)

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                       # 关联健康检查脚本
    }
}

备服务器配置 (nginx-backup)

vim /etc/keepalived/keepalived.conf

内容与主服务器类似,主要修改以下参数:

vrrp_instance VI_1 {
    state BACKUP                        # 备服务器
    priority 90                         # 优先级低于主服务器
    # 其他配置与主服务器相同
}

4. 启动服务

在两台服务器上执行:

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

四、验证高可用

  1. 检查VIP分配

    ip addr show eth0
    

    应该可以看到VIP在主服务器上

  2. 测试故障转移

    • 在主服务器上停止Nginx:systemctl stop nginx
    • 观察VIP是否自动漂移到备服务器
    • 恢复主服务器Nginx:systemctl start nginx,VIP应该会回到主服务器
  3. 测试主服务器宕机

    • 直接关闭主服务器
    • 检查备服务器是否接管VIP

五、高级配置选项

  1. 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
    }
    
  2. 邮件通知: 配置Keepalived在状态变化时发送邮件通知

  3. 多备份服务器: 可以添加多个备份服务器,设置不同的优先级

六、常见问题解决

  1. VRRP协议无法通信

    • 检查防火墙是否放行VRRP协议(IP协议号112)
    • 命令:iptables -I INPUT -p 112 -j ACCEPT
  2. VIP无法绑定

    • 检查网卡名称是否正确
    • 检查网络是否支持多播
  3. 脑裂问题

    • 确保主备服务器能互相通信
    • 可以配置unicast_specific_ip进行单播通信

通过以上配置,Nginx服务就具备了高可用能力,当主服务器出现故障时,服务可以自动切换到备份服务器,保证业务连续性。