Nginx+Keepalived 高可用集群实战笔记

##(主备模式・前端部署・3 台 Tomcat 负载均衡・标准生产方案・无 LVS 版)

二、适用场景与架构说明

1. 适用需求

  • 部署前后端分离项目,Nginx 托管前端静态资源
  • 后端3 台 Tomcat / 应用服务,需要负载均衡 + 故障自愈
  • 两台 Nginx 服务器:一主一备,实现入口高可用
  • 主 Nginx 宕机,备机自动接管 VIP,业务无感知
  • 拒绝 LVS/ipvsadm,追求简单、稳定、易维护

2. 最终架构(一层负载)

复制代码
客户端请求
    ↓
VIP:192.168.1.100(Keepalived负责漂移)
    ↓
Nginx主(192.168.1.10)  ←心跳→  Nginx备(192.168.1.11)
    ↓(同一时间仅一台工作)
Nginx upstream负载均衡
    ↓
Tomcat1(192.168.1.20:8080) Tomcat2(192.168.1.21:8080) Tomcat3备用(192.168.1.22:8080)

3. 核心结论

  • 无需 LVS、无需 ipvsadm
  • Keepalived 仅做VIP 漂移高可用
  • Nginx 自带 7 层负载均衡,完全满足 Web 业务
  • 生产环境中小项目标准最优方案

三、环境规划(示例 IP,你可直接替换)

表格

角色 IP 地址 作用
VIP 虚拟 IP 192.168.1.100 统一入口,自动漂移
Nginx 主节点 192.168.1.10 主入口服务器
Nginx 备节点 192.168.1.11 备用接管服务器
后端 Tomcat1 192.168.1.20:8080 后端应用节点 1
后端 Tomcat2 192.168.1.21:8080 后端应用节点 2
后端 Tomcat3 192.168.1.22:8080 备用应用节点

四、完整操作步骤(两台 Nginx 都执行,标主 / 备的单独执行)

步骤 1:安装 Nginx(主、备 Nginx 都执行)

复制代码
# CentOS/RHEL
yum install -y nginx

# 设置开机自启
systemctl enable nginx

步骤 2:安装 Keepalived(主、备 Nginx 都执行)

复制代码
yum install -y keepalived
systemctl enable keepalived

步骤 3:编写 Nginx 存活检测脚本(主、备都执行)

复制代码
vi /etc/keepalived/check_nginx.sh

#!/bin/bash
# 检测Nginx是否运行,挂掉则尝试重启,仍失败则让出VIP
nginx_num=$(ps -ef | grep nginx | grep -v grep | wc -l)
if [ $nginx_num -eq 0 ]; then
    systemctl start nginx
    sleep 2
    nginx_num=$(ps -ef | grep nginx | grep -v grep | wc -l)
    if [ $nginx_num -eq 0 ]; then
        systemctl stop keepalived
        exit 1
    fi
fi
exit 0

赋予执行权限:

复制代码
chmod +x /etc/keepalived/check_nginx.sh

步骤 4:配置 Nginx 主配置文件(主、备 Nginx 配置完全一致)

复制代码
vi /etc/nginx/nginx.conf

五、完整配置文件示例(直接复制可用)

1. Nginx 完整配置(nginx.conf)

复制代码
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
    use epoll;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$upstream_addr"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    keepalive_timeout  65;
    gzip on;

    # 后端3台Tomcat负载均衡集群
    upstream tomcat_cluster {
        server 192.168.1.20:8080 weight=5;
        server 192.168.1.21:8080 weight=5;
        server 192.168.1.22:8080 backup;  # 备用节点
    }

    server {
        listen 80;
        server_name 192.168.1.100; # 绑定VIP

        # 前端部署路径:访问 http://VIP/WEB/
        location /WEB/ {
            root /data/frontend/;
            index index.html;
            try_files $uri $uri/ /WEB/index.html; # Vue/React路由适配
        }

        # 后端API代理
        location /api/ {
            proxy_pass http://tomcat_cluster/;
            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 10s;
            proxy_read_timeout 30s;
            client_max_body_size 100m;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
        }
    }
}

2. 前端目录创建(主、备都执行)

复制代码
mkdir -p /data/frontend/WEB
# 将前端打包文件放入 /data/frontend/WEB
chown -R nginx:nginx /data/frontend

3. Keepalived 主节点配置(192.168.1.10)

复制代码
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vi /etc/keepalived/keepalived.conf

global_defs {
   router_id NGINX_MASTER
}

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

vrrp_instance VI_1 {
    state MASTER
    interface eth0  # 改为你的实际网卡名(ens33等)
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    track_script {
        check_nginx
    }
}

4. Keepalived 备节点配置(192.168.1.11)

复制代码
global_defs {
   router_id NGINX_BACKUP
}

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

vrrp_instance VI_1 {
    state BACKUP
    interface eth0  # 同主节点网卡
    virtual_router_id 51
    priority 80     # 优先级低于主
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    track_script {
        check_nginx
    }
}

六、启动服务与验证

1. 检查 Nginx 配置并启动

复制代码
nginx -t
systemctl start nginx

2. 启动 Keepalived

复制代码
systemctl start keepalived

3. 高可用验证

  1. 查看 VIP 绑定:ip addr(正常在主节点)
  2. 访问测试:http://192.168.1.100/WEB/
  3. 主 Nginx 宕机测试:systemctl stop nginx
  4. 观察 VIP 自动漂移到备机,业务正常访问
  5. 后端 Tomcat 停机,Nginx 自动剔除故障节点

七、核心知识点总结(你所有疑问的答案)

  1. VIP 漂移(Keepalived)
    • 只负责入口高可用,主备机器间切换
    • 不负责后端负载分发
  2. LVS/ipvsadm
    • 4 层负载工具,Web 场景完全不需要
    • 仅用于 MySQL、Redis 等纯 TCP 服务
  3. 一层负载 vs 两层负载
    • 你的架构:Nginx 一层负载,简单稳定
    • LVS 架构:两层负载,大厂超大流量用
  4. 关键口诀

VIP 漂移管高可用,解决入口单点故障;LVS 是 4 层负载器,Web 项目无需使用;Nginx 自带负载均衡,前端后端都能管;主备切换靠 Keepalived,后端容错靠健康检查。

相关推荐
青山是哪个青山4 小时前
LangChain 学习笔记(四):Message 与提示词模板
笔记·学习·langchain
jerryinwuhan4 小时前
《系统部署与运维》开篇 课程介绍
运维
我是谁??7 小时前
Ubuntu22.04更换清华源
linux·运维·服务器
Shell运维手记7 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
朴马丁7 小时前
国际与国产PLM在精细化工赛道的布局:2026年主要厂商技术特色
大数据·运维·人工智能·流程行业plm·化工新材料
Kendra9198 小时前
从 0 到上线:单文件网页 App 部署到阿里云 ECS 全流程(Nginx+Node+PM2+PostgreSQL)
nginx·阿里云·云计算·部署·个人开发·今天吃什么
FakeOccupational8 小时前
【电路笔记 STM32】Cortex-M7 内核上的数据缓存(D-Cache)结构+MPU+DMA&Cache+STM32CubeMX配置
笔记·stm32·缓存
动词ing8 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习
Elastic 中国社区官方博客9 小时前
Elasticsearch:使用 AI Agent 来创建 workflow
大数据·运维·人工智能·elasticsearch·搜索引擎·自动化·全文检索
测试运维日常笔记9 小时前
Linux系统安装配置TigerVNC服务器完整指南
linux·运维·服务器