Nginx高可用配置

一、引言:单点故障------你网站最大的"阿喀琉斯之踵"

在 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 改为 BACKUPpriority 改为 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 # 开机自启

效果验证

  1. 在客户端 ping 192.168.1.100,应该能通。
  2. 通过 ip addr show 命令,在主服务器上能看到 192.168.1.100 这个 VIP。
  3. 故障转移测试 :手动停止主服务器上的 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 100
  • VI_2 (VIP2): state BACKUP, priority 90

在 Server B 上则相反。

注意:双主模式需要你的 DNS 或上游负载均衡器能同时解析到两个 VIP。


五、生产环境最佳实践与注意事项

  1. 健康检查是关键:仅靠 Keepalived 的心跳检测是不够的。必须像上面那样,加入对 Nginx 服务本身的健康检查脚本,防止 Nginx 进程僵死但 Keepalived 仍在运行的情况。
  2. 防火墙配置 :确保两台服务器之间的 VRRP 通信(协议号 112) 不被防火墙阻止。
  3. 脑裂(Split-Brain)问题:在网络分区的情况下,主备服务器可能都认为对方已宕机,从而同时持有 VIP。可以通过配置仲裁脚本或使用第三方仲裁节点来缓解。
  4. 监控告警:务必对 VIP 的状态、Keepalived 的运行状态以及主备切换事件进行监控和告警。
  5. 云环境适配 :在 AWS、阿里云等公有云上,由于安全组限制,直接使用 Keepalived 可能会遇到问题。此时应优先考虑使用云服务商提供的负载均衡器(如 ALB/SLB) 作为高可用入口,它们本身就是高可用的。

六、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
IMPYLH1 小时前
Linux 的 yes 命令
linux·运维·服务器·数据库·bash
东城绝神1 小时前
《Linux运维实战:使用脚本模拟服务器CPU内存磁盘使用率》
linux·运维·服务器
染翰1 小时前
Linux root用户安装配置Git
linux·git·后端
Cat_Rocky1 小时前
k8s-Prometheus的manifests 清单部署
linux·kubernetes·prometheus
Realdagongzai1 小时前
Linux 6.19.10 内核调度器算法详解
linux·学习·算法·spring·kernel
|_⊙1 小时前
进程间通信(管道)
linux·运维·服务器
hweiyu002 小时前
Linux命令:iftop
linux·运维·服务器
charlie1145141912 小时前
嵌入式Linux驱动开发——设备树中的 GPIO 配置实战
linux·运维·驱动开发
Hani_972 小时前
Code Coverage系列(七)Code Coverage 原理详细说明
linux·代码覆盖率