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,后端容错靠健康检查。

相关推荐
志栋智能2 小时前
AI超自动化运维,让IT运维自动化门槛更低
运维·网络·人工智能·安全·自动化
_李小白2 小时前
【OSG学习笔记】Day 3: OSG 实用工具
笔记·图形渲染
我去流水了2 小时前
【独家免费】【亲测】在linux下嵌入式linux的web http服务【Get、Post】,移植mongoose,post上传文件
linux·运维·前端
**蓝桉**2 小时前
Keepalived+Nginx+Tomcat 高可用负载均衡
nginx·tomcat·负载均衡
DARLING Zero two♡2 小时前
CentOS 部署 Teemii:打造专属私人漫画阅读库
linux·运维·centos
工頁光軍2 小时前
Nginx 核心场景配置示例(负载均衡/反向代理/重定向+扩展场景)
运维·nginx·负载均衡
咸鱼梦想家π2 小时前
Linux权限
linux·运维·服务器
云计算老刘2 小时前
6.Nginx 服务器技术手册(CentOS 7 版)
服务器·nginx·centos
小橙子学AI2 小时前
OpenClaw 定时任务与提醒:打造你的 AI 自动化工作流
运维·人工智能·自动化