一、引言:单点故障------你网站最大的"阿喀琉斯之踵"
在 Web 架构中,Nginx 通常扮演着流量入口的角色。然而,如果只部署一台 Nginx 服务器,它就成为了整个系统的单点故障(SPOF)。一旦这台服务器宕机、网络中断或遭遇硬件故障,你的所有服务都将对外不可用,造成严重的业务损失和用户体验灾难。
高可用(High Availability, HA) 的目标就是消除单点故障,确保即使某个组件失效,服务依然能够持续运行。
本文将详细介绍如何利用 Keepalived + Nginx 这一经典组合,构建一个稳定、可靠的高可用集群,并对比分析主从模式 与双主模式两种主流架构。
💡 核心价值 :
掌握 Nginx 高可用配置,是保障线上业务连续性的基石,也是迈向高级架构师的必经之路!
二、核心原理:Keepalived 与 VRRP 协议
Keepalived 是什么?
Keepalived 是一个基于 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 实现的高可用软件。它的核心作用是在多台服务器之间协调,共同维护一个虚拟 IP 地址(VIP)。
- 正常情况下:VIP 只会在一台"主"服务器上激活。
- 主服务器故障时:Keepalived 会通过 VRRP 心跳检测机制,快速(通常在秒级)将 VIP "漂移"到备用服务器上。
- 对客户端而言:它们始终通过同一个 VIP 访问服务,完全无感知后端服务器的切换。
架构图解
+---------------------+
| Client |
+----------+----------+
|
| (访问 VIP: 192.168.1.100)
v
+---------------------+----------------------+
| Virtual IP (VIP) 192.168.1.100 |
+---------------------+----------------------+
| |
| (Active) | (Standby)
v v
+-------------+-------------+ +-------------+-------------+
| Nginx Master (192.168.1.10)| | Nginx Backup (192.168.1.11)|
| Keepalived Priority: 100 | | Keepalived Priority: 90 |
+----------------------------+ +----------------------------+
| |
+----------+------------+
|
+-------v--------+
| Backend Servers|
| (Your App/DB) |
+----------------+
三、实战配置:主从(主备)模式
这是最简单、最常用的高可用模式。一主一备,主服务器承担全部流量,备服务器处于待命状态。
环境准备
- Nginx-Master :
192.168.1.10 - Nginx-Backup :
192.168.1.11 - 虚拟IP (VIP) :
192.168.1.100
步骤 1:在两台服务器上安装 Nginx 和 Keepalived
bash
# 安装 Nginx (以 CentOS 为例)
sudo yum install -y nginx
# 安装 Keepalived
sudo yum install -y keepalived
步骤 2:配置 Keepalived
主服务器 (192.168.1.10) 配置 /etc/keepalived/keepalived.conf
global_defs {
notification_email {
admin@yourcompany.com
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
}
# 检测 Nginx 进程的脚本
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2 # 每2秒检查一次
weight -5 # 如果失败,优先级降低5
fall 2 # 失败2次才认为是真失败
rise 1 # 成功1次就认为恢复
}
vrrp_instance VI_1 {
state MASTER # 角色为主
interface eth0 # 绑定的网卡
virtual_router_id 51 # 虚拟路由ID,主备必须一致
priority 100 # 优先级,主必须高于备
advert_int 1 # VRRP通告间隔(秒)
authentication { # 认证
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 虚拟IP
192.168.1.100/24
}
track_script { # 跟踪脚本
chk_nginx
}
}
备服务器 (192.168.1.11) 配置 /etc/keepalived/keepalived.conf
只需将 state 改为 BACKUP,priority 改为 90,其余保持一致。
...
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90 # 低于主
...
}
...
步骤 3:创建 Nginx 健康检查脚本
在两台服务器上都创建 /etc/keepalived/check_nginx.sh:
bash
#!/bin/bash
# 检查 Nginx 进程是否存在
if killall -0 nginx; then
exit 0
else
exit 1
fi
并赋予执行权限:
bash
chmod +x /etc/keepalived/check_nginx.sh
步骤 4:启动服务
bash
# 启动 Nginx
sudo systemctl start nginx
# 启动 Keepalived
sudo systemctl start keepalived
sudo systemctl enable keepalived # 开机自启
效果验证
- 在客户端
ping 192.168.1.100,应该能通。 - 通过
ip addr show命令,在主服务器上能看到192.168.1.100这个 VIP。 - 故障转移测试 :手动停止主服务器上的 Nginx (
sudo systemctl stop nginx),几秒钟后,VIP 会自动漂移到备服务器上。
四、进阶方案:双主(互为主备)模式
主从模式的缺点是备机常年闲置,资源利用率低。双主模式通过配置两个 VIP,让两台服务器同时对外提供服务,互为备份,极大地提升了资源利用率。
架构设计
- VIP1 :
192.168.1.100-> 默认由 Server A 提供服务 - VIP2 :
192.168.1.101-> 默认由 Server B 提供服务
当 Server A 宕机,VIP1 会漂移到 Server B;当 Server B 宕机,VIP2 会漂移到 Server A。
配置要点
你需要在每台服务器上定义两个 vrrp_instance,分别对应两个 VIP,并设置不同的 virtual_router_id 和优先级。
例如,在 Server A 上:
VI_1(VIP1):state MASTER,priority 100VI_2(VIP2):state BACKUP,priority 90
在 Server B 上则相反。
注意:双主模式需要你的 DNS 或上游负载均衡器能同时解析到两个 VIP。
五、生产环境最佳实践与注意事项
- 健康检查是关键:仅靠 Keepalived 的心跳检测是不够的。必须像上面那样,加入对 Nginx 服务本身的健康检查脚本,防止 Nginx 进程僵死但 Keepalived 仍在运行的情况。
- 防火墙配置 :确保两台服务器之间的 VRRP 通信(协议号 112) 不被防火墙阻止。
- 脑裂(Split-Brain)问题:在网络分区的情况下,主备服务器可能都认为对方已宕机,从而同时持有 VIP。可以通过配置仲裁脚本或使用第三方仲裁节点来缓解。
- 监控告警:务必对 VIP 的状态、Keepalived 的运行状态以及主备切换事件进行监控和告警。
- 云环境适配 :在 AWS、阿里云等公有云上,由于安全组限制,直接使用 Keepalived 可能会遇到问题。此时应优先考虑使用云服务商提供的负载均衡器(如 ALB/SLB) 作为高可用入口,它们本身就是高可用的。
六、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!