Nginx反向代理高可用架构搭建:Keepalived双机热切换实战配置

Nginx作为反向代理服务器承载着大量线上流量,单节点部署存在单点故障风险。通过Keepalived实现VIP(虚拟IP)双机热切换,是服务器高可用集群的经典方案。本文演示从零搭建Nginx + Keepalived高可用架构的完整流程,包含主备模式、健康检查、故障切换测试和脑裂防范。

高可用架构设计原理

Keepalived基于VRRP(虚拟路由冗余协议)实现多台服务器间的IP漂移。主节点持有VIP对外提供服务,备节点持续监听主节点状态。主节点故障时,备节点在秒级时间内接管VIP,对外部用户透明。Nginx负责实际流量转发,Keepalived负责VIP管理,两者配合实现应用层高可用。

典型的双机架构:Server A(Master)和Server B(Backup)各运行Nginx,Keepalived通过vrrp_script检测Nginx进程存活状态。VIP初始绑定在Master节点,当Nginx进程异常或服务器宕机时,VIP自动漂移到Backup节点。

环境准备与Nginx配置

两台服务器环境:Server A 192.168.1.10(Master),Server B 192.168.1.11(Backup),VIP 192.168.1.100。操作系统以CentOS 7为例。

# 两台服务器均安装Nginx
yum install -y epel-release
yum install -y nginx

# 配置Nginx反向代理(两台配置相同)
cat > /etc/nginx/conf.d/proxy.conf << 'EOF'
upstream backend {
    server 192.168.1.20:8080 weight=1;
    server 192.168.1.21:8080 weight=1;
    keepalive 32;
}

server {
    listen 80;
    server_name 192.168.1.100;
    
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 5s;
        proxy_read_timeout 30s;
    }
    
    location /health {
        access_log off;
        return 200 "ok";
    }
}
EOF

systemctl start nginx
systemctl enable nginx

Keepalived安装与Master节点配置

# 安装Keepalived
yum install -y keepalived

# Master节点配置
cat > /etc/keepalived/keepalived.conf << 'EOF'
global_defs {
    router_id NGINX_MASTER
    vrrp_skip_check_adv_addr
    vrrp_strict
    vrrp_garp_interval 0
    vrrp_gna_interval 0
}

# Nginx健康检查脚本
vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -20
    fall 3
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass MySecurePass123
    }

    virtual_ipaddress {
        192.168.1.100/24 dev eth0
    }

    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"
}
EOF

Nginx健康检查脚本与Backup节点配置

健康检查脚本是实现自动故障切换的关键。Keepalived定期执行该脚本,根据返回值调整节点优先级。

# Nginx健康检查脚本
cat > /etc/keepalived/check_nginx.sh << 'EOF'
#!/bin/bash
if [ -z "$(pgrep nginx)" ]; then
    systemctl restart nginx
    sleep 2
    if [ -z "$(pgrep nginx)" ]; then
        echo "Nginx is down"
        exit 1
    fi
fi
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/health | grep -q 200
EOF
chmod +x /etc/keepalived/check_nginx.sh

# Backup节点配置(与Master的差异部分)
cat > /etc/keepalived/keepalived.conf << 'EOF'
global_defs {
    router_id NGINX_BACKUP
}

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

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass MySecurePass123
    }

    virtual_ipaddress {
        192.168.1.100/24 dev eth0
    }

    track_script {
        chk_nginx
    }
}
EOF

systemctl start keepalived
systemctl enable keepalived

故障切换测试与验证

配置完成后需要验证高可用是否生效。通过模拟故障场景测试VIP漂移行为。

# 1. 检查VIP当前所在节点
ip addr | grep 192.168.1.100
# 输出应显示VIP在Master节点

# 2. 停止Master节点Nginx,观察VIP漂移
systemctl stop nginx

# 3. 在Backup节点检查VIP是否接管
ip addr | grep 192.168.1.100
# VIP应出现在Backup节点

# 4. 恢复Master节点Nginx(优先级更高,VIP回切)
systemctl start nginx
# 等待几秒后VIP应回到Master节点

# 5. 模拟服务器宕机(极端测试)
# 在Master执行: init 0
# Backup应在约3秒内接管VIP

漂移延迟取决于interval、fall、rise参数配置。interval 2秒 + fall 3次 = 最快6秒检测到故障。rise 2次确保恢复后稳定2个周期才回切,避免频繁切换。

脑裂问题防范与日志监控

脑裂(Split-Brain)是高可用集群中最危险的状态:两台服务器同时持有VIP,导致流量混乱。触发原因是Keepalived间心跳通信中断但双方Nginx正常运行。

防范措施:配置独立心跳网络或使用串口通信作为备用通道;在脚本中加入ARP检测确认VIP是否被其他节点持有;监控层面设置告警,同时检测到两台服务器VIP存在时立即告警。

# 脑裂检测脚本(加入crontab每分钟执行)
cat > /etc/keepalived/split_brain_check.sh << 'EOF'
#!/bin/bash
VIP="192.168.1.100"

vip_mac=$(arping -c 1 $VIP 2>/dev/null | grep "from" | awk '{print $4}' | head -1)
master_mac=$(cat /sys/class/net/eth0/address)

if [ "$vip_mac" = "$master_mac" ]; then
    echo "$(date) VIP在本机, 状态正常"
else
    echo "$(date) WARNING: VIP MAC($vip_mac)与本机不一致, 可能脑裂"
    curl -s -X POST "https://alert.example.com/api"         -d "msg=Keepalived脑裂告警: $HOSTNAME"
fi
EOF
chmod +x /etc/keepalived/split_brain_check.sh
echo "* * * * * root /etc/keepalived/split_brain_check.sh" >> /etc/crontab

服务器安全加固与生产环境注意事项

高可用架构上线前需做几项安全加固:修改Keepalived认证密码为高强度字符串;限制VRRP协议通信仅在服务器内网网卡;配置防火墙只允许VRRP协议(协议号112)在指定网卡通信。

# iptables规则:仅允许指定IP的VRRP通信
iptables -A INPUT -i eth0 -p 112 -s 192.168.1.11 -j ACCEPT
iptables -A INPUT -i eth0 -p 112 -j DROP

# 关闭非必要端口,仅开放80和SSH(限制来源)
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port=22 protocol=tcp accept'
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

生产环境还需注意:配置文件同步使用rsync或Ansible保证两台节点配置一致;日志集中收集到ELK或Loki便于分析;定期执行故障演练验证切换有效性,不能等真实故障才发现配置问题。Keepalived + Nginx的高可用方案成熟稳定,合理配置后故障切换时间可控制在10秒以内,满足大部分业务场景的可用性要求。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/nginx-fan-xiang-dai-li-gao-ke-yong-jia-gou-da-jian/

(0)
小编小编
上一篇 23小时前
下一篇 23小时前

相关推荐