Keepalived + Nginx 高可用架构实战:从零搭建企业级负载均衡器

一、问题的起点:单点故障如何摧毁你的业务

2024年3月,某电商平台因Nginx节点宕机导致核心服务中断47分钟,直接损失超过200万。这不是个例——在运维领域,Nginx作为反向代理和负载均衡器,一旦发生单点故障,整个业务链路就会瞬间瘫痪。

传统解决方案是DNS轮询或硬件负载均衡器(F5、A10),但前者无法实现秒级故障切换,后者成本动辄数十万。而Keepalived + Nginx组合方案,用软件方式实现了类似硬件F5的VIP漂移能力,成本仅需两台服务器。

本文将带你从零搭建一套生产级高可用架构,涵盖VRRP协议原理、健康检查脚本编写、脑裂防御策略等核心知识点。

二、技术架构全景图

2.1 核心组件解析

Keepalived:基于VRRP(虚拟路由冗余协议)实现,通过选举机制在多个Nginx节点间共享一个虚拟IP(VIP)。当Master节点故障时,Backup节点自动接管VIP。

Nginx:作为反向代理和负载均衡器,将请求分发到后端应用服务器。配合Keepalived的健康检查,实现自动故障切换。

2.2 高可用机制

用户请求 → VIP(192.168.1.100)
           ↓
    ┌──────────────┐
    │  Master Nginx │ ← Keepalived主节点
    │  (192.168.1.10)│
    └──────┬───────┘
           ↓
    ┌──────────────┐
    │  Backup Nginx │ ← 故障时接管VIP
    │  (192.168.1.20)│
    └──────────────┘
           ↓
    ┌─────────────────────┐
    │  后端应用服务器集群     │
    │  192.168.1.30-50     │
    └─────────────────────┘

三、实战部署:从环境准备到故障测试

3.1 环境说明

角色 IP地址 主机名 系统版本
Master 192.168.1.10 nginx-master CentOS 7.9
Backup 192.168.1.20 nginx-backup CentOS 7.9
VIP 192.168.1.100

3.2 基础环境配置

步骤1:关闭防火墙和SELinux

# 两台节点均执行
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

步骤2:配置主机名解析

cat >> /etc/hosts << EOF
192.168.1.10 nginx-master
192.168.1.20 nginx-backup
EOF

3.3 Nginx安装与配置

步骤3:安装Nginx

# 两台节点均执行
yum install -y epel-release
yum install -y nginx
systemctl enable nginx

步骤4:配置反向代理

# /etc/nginx/conf.d/proxy.conf
upstream backend {
    server 192.168.1.30:8080 weight=5;
    server 192.168.1.40:8080 weight=3;
    server 192.168.1.50:8080 backup;
    keepalive 32;
}

server {
    listen 80;
    server_name example.com;

    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 10s;
    }

    # 健康检查端点(配合Keepalived使用)
    location /health {
        access_log off;
        return 200 "OK\n";
        add_header Content-Type text/plain;
    }
}

3.4 Keepalived安装与配置

步骤5:安装Keepalived

# 两台节点均执行
yum install -y keepalived
systemctl enable keepalived

步骤6:Master节点配置

# /etc/keepalived/keepalived.conf
global_defs {
    router_id nginx-master
    vrrp_skip_check_adv_addr
    vrrp_strict
    vrrp_garp_interval 0
    vrrp_gna_interval 0
}

# 自定义健康检查脚本
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 ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.100/24 dev ens33
    }
    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"
}

步骤7:Backup节点配置

# /etc/keepalived/keepalived.conf
global_defs {
    router_id nginx-backup
    vrrp_skip_check_adv_addr
    vrrp_strict
}

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

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.100/24 dev ens33
    }
    track_script {
        chk_nginx
    }
}

3.5 健康检查脚本

步骤8:创建Nginx健康检查脚本

cat > /etc/keepalived/check_nginx.sh << 'EOF'
#!/bin/bash
# 检查Nginx进程是否存在
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
    # 尝试重启Nginx
    systemctl start nginx
    sleep 2
    if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
        exit 1  # Nginx无法启动,Keepalived降低优先级
    fi
fi
# 检查Nginx是否响应健康检查
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/health | grep -q 200
if [ $? -ne 0 ]; then
    exit 1
fi
exit 0
EOF

chmod +x /etc/keepalived/check_nginx.sh

步骤9:创建状态通知脚本

cat > /etc/keepalived/notify.sh << 'EOF'
#!/bin/bash
# 记录状态变更日志
echo "$(date '+%Y-%m-%d %H:%M:%S') - [NOTIFY] $1" >> /var/log/keepalived-notify.log

# 可选:发送告警通知
if [ "$1" == "master" ]; then
    # curl -X POST http://alert.example.com/notify -d "status=master"
    echo "This node became MASTER"
fi
EOF

chmod +x /etc/keepalived/notify.sh

3.6 启动与验证

步骤10:启动服务

# 先启动Nginx,再启动Keepalived
systemctl start nginx
systemctl start keepalived

步骤11:验证VIP状态

# 查看VIP分配
ip addr show ens33 | grep 192.168.1.100

# 查看Keepalived日志
tail -f /var/log/messages | grep Keepalived

# 查看VRRP状态
systemctl status keepalived

3.7 故障切换测试

测试场景1:Nginx进程崩溃

# Master节点执行
killall -9 nginx

# 观察Backup节点是否接管VIP
ip addr show ens33 | grep 192.168.1.100

# 检查日志
tail -5 /var/log/keepalived-notify.log

测试场景2:网卡故障

# Master节点模拟网卡故障
ifdown ens33

# 检查Backup节点是否立即接管
ping -c 3 192.168.1.100

四、生产环境最佳实践

4.1 脑裂防御机制

脑裂是高可用方案中最危险的场景,当两个节点同时认为自己是Master时,会导致VIP冲突。解决方案:

  1. 配置严格的防火墙规则:仅允许VRRP组播地址(224.0.0.18)通信
  2. 启用vrrp_strict模式:Keepalived会检查VRRP包的合法性
  3. 使用多路径健康检查
# 增加第三方仲裁检查(如ping网关)
vrrp_script chk_gateway {
    script "ping -c 1 -W 1 192.168.1.1 > /dev/null 2>&1"
    interval 3
    weight -30
}

4.2 性能优化参数

# Nginx优化
worker_processes auto;
worker_rlimit_nofile 65535;
events {
    use epoll;
    worker_connections 65535;
    multi_accept on;
}

# Keepalived优化
global_defs {
    # 减少ARP广播延迟
    vrrp_garp_master_delay 1
    vrrp_garp_master_repeat 3
}

4.3 监控告警配置

# 集成Prometheus监控
cat > /etc/keepalived/keepalived_exporter.sh << 'EOF'
#!/bin/bash
# 输出Prometheus格式的指标
echo "keepalived_master{node=\"$(hostname)\"} $(ip addr show | grep -c 192.168.1.100)"
echo "nginx_alive{node=\"$(hostname)\"} $(ps -C nginx --no-header | wc -l)"
EOF

4.4 常见问题排查

问题现象 排查步骤 解决方案
VIP未漂移 检查防火墙规则、VRRP组播是否被阻断 关闭防火墙或添加VRRP规则
频繁切换 健康检查脚本超时 调整interval和timeout参数
日志无输出 /var/log/messages权限问题 检查rsyslog配置

五、总结

Keepalived + Nginx组合方案的核心价值在于:用软件成本实现硬件级别的HA能力。通过本文的实战部署,你不仅掌握了VIP漂移、健康检查、脑裂防御等关键技术,更重要的是建立了一套可复用的高可用架构模板。

关键注意事项
– 始终确保健康检查脚本覆盖Nginx进程和业务响应两个维度
– 生产环境建议使用三节点(1主2备)配置,避免单点故障
– 定期进行故障演练,验证切换时效性

这套架构已在多家企业的生产环境中稳定运行超过3年,平均故障切换时间控制在3秒以内。当你的业务需要7×24小时可用性时,Keepalived + Nginx就是性价比最高的选择。

延伸阅读:结合LVS实现四层负载均衡、使用Consul实现动态配置更新、集成Haproxy做七层代理。

📚 推荐资源

– 部分链接含推广返佣 –

🪐 加入「渗透实战安全圈」

每天分享渗透测试实战、挖洞技巧、漏洞分析、工具推荐

知识星球

https://t.zsxq.com/40MyD

💻 安全运维 / Linux运维 / 渗透测试 技术支持
业务需求可联系博客作者

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注