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冲突。解决方案:
- 配置严格的防火墙规则:仅允许VRRP组播地址(224.0.0.18)通信
- 启用vrrp_strict模式:Keepalived会检查VRRP包的合法性
- 使用多路径健康检查:
# 增加第三方仲裁检查(如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做七层代理。
💻 安全运维 / Linux运维 / 渗透测试 技术支持
业务需求可联系博客作者
