插件窝 干货文章 如何用Keepalived+Nginx+Tomcat实现高可用Web集群

如何用Keepalived+Nginx+Tomcat实现高可用Web集群

节点 配置 Nginx Tomcat 195    来源:    2025-04-23

Keepalived + Nginx + Tomcat 高可用Web集群实现方案

一、架构概述

该方案通过以下组件实现高可用Web集群: - Keepalived:提供虚拟IP(VIP)和故障转移能力 - Nginx:作为负载均衡器和反向代理 - Tomcat:作为应用服务器运行Web应用 - 至少两台服务器实现主备模式

二、环境准备

硬件需求

  • 至少2台服务器(主备模式)
  • 共享存储(可选,用于会话共享)

软件需求

  • Linux操作系统(CentOS/Ubuntu等)
  • Keepalived
  • Nginx
  • Tomcat
  • Java环境

三、详细配置步骤

1. 安装必要软件

在所有节点上执行:

# CentOS/RHEL
yum install -y keepalived nginx java tomcat

# Ubuntu/Debian
apt-get install -y keepalived nginx default-jdk tomcat9

2. Tomcat配置

在所有应用节点上配置Tomcat:

# 修改server.xml配置
vi /etc/tomcat/server.xml

# 确保以下配置正确(根据实际情况调整端口)
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

3. Nginx配置

在所有节点上配置Nginx负载均衡:

http {
    upstream tomcat_cluster {
        # 配置Tomcat节点,weight表示权重
        server 192.168.1.101:8080 weight=1;
        server 192.168.1.102:8080 weight=1;
        # 可添加更多节点

        # 会话保持配置(可选)
        ip_hash;
    }

    server {
        listen 80;
        server_name yourdomain.com;

        location / {
            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;
        }
    }
}

4. Keepalived配置

在主节点(192.168.1.100)上配置:

vrrp_script chk_nginx {
    script "/usr/bin/killall -0 nginx" # 检查nginx进程是否存在
    interval 2                         # 每2秒检查一次
    weight 2                           # 优先级变化值
}

vrrp_instance VI_1 {
    state MASTER                       # 主节点
    interface eth0                     # 网卡名称
    virtual_router_id 51               # 虚拟路由ID,主备必须相同
    priority 101                       # 优先级(主高于备)
    advert_int 1                       # 检查间隔

    authentication {
        auth_type PASS
        auth_pass 1111                 # 认证密码
    }

    virtual_ipaddress {
        192.168.1.200/24 dev eth0      # 虚拟IP(VIP)
    }

    track_script {
        chk_nginx                     # 关联健康检查脚本
    }
}

在备用节点上配置(192.168.1.101):

vrrp_instance VI_1 {
    state BACKUP                      # 备节点
    interface eth0
    virtual_router_id 51
    priority 100                      # 优先级低于主节点
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.1.200/24 dev eth0
    }

    track_script {
        chk_nginx
    }
}

5. 启动服务

在所有节点上执行:

systemctl start tomcat
systemctl start nginx
systemctl start keepalived

# 设置开机自启
systemctl enable tomcat nginx keepalived

四、测试与验证

  1. VIP切换测试

    • 访问虚拟IP(192.168.1.200)应能正常访问
    • 停止主节点的keepalived或nginx服务,VIP应自动切换到备用节点
  2. 负载均衡测试

    • 访问VIP时,请求应被均匀分配到各Tomcat节点
    • 如果配置了ip_hash,同一客户端的请求应始终指向同一Tomcat
  3. 健康检查测试

    • 停止某台Tomcat服务,Nginx应自动将其从负载均衡池中移除

五、高级配置建议

  1. 会话共享

    • 使用Redis或Memcached实现Tomcat会话共享
    • 配置Tomcat的context.xml添加会话管理器
  2. Nginx高可用

    • 可以配置多台Nginx+Keepalived实现Nginx层的高可用
  3. 监控告警

    • 配置Zabbix/Prometheus监控各组件状态
    • 设置邮件/SMS告警
  4. 日志集中

    • 使用ELK(Elasticsearch+Logstash+Kibana)集中管理日志

六、常见问题解决

  1. VIP无法访问

    • 检查防火墙是否放行VRRP协议(通常使用IP协议号112)
    • 确认主备节点的virtual_router_id一致
  2. Nginx负载不均衡

    • 检查upstream配置是否正确
    • 确认各Tomcat节点网络连通性
  3. 会话丢失

    • 实现会话共享方案
    • 或确保使用ip_hash策略时客户端IP不变

通过以上配置,您可以建立一个高可用的Web集群,能够自动处理节点故障并提供不间断的服务。