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/