温馨提示×

Tomcat在Ubuntu中如何实现负载均衡

小樊
79
2025-11-29 08:09:53
栏目: 云计算

在 Ubuntu 上实现 Tomcat 负载均衡

方案一 Nginx 反向代理与负载均衡(推荐)

  • 安装组件
    • 安装 Nginx:sudo apt update && sudo apt install nginx
    • 安装 Tomcat(示例为 Tomcat 9):wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat-9.0.67.tar.gz && tar -xzvf apache-tomcat-9.0.67.tar.gz
  • 准备多个 Tomcat 实例
    • 解压出多个目录(如 /opt/tomcat1/opt/tomcat2),分别修改 conf/server.xml 中的 HTTP Connector 端口Server/Engine 端口,避免端口冲突(常见为 8080/80818005/80068009/8010 等)。
  • 配置 Nginx 负载均衡
    • 编辑配置文件(/etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default),在 http 块中添加:
      upstream tomcat_servers {
          server 192.168.1.101:8080;
          server 192.168.1.102:8081;
          # 可按需增加权重、健康检查等
      }
      
      server {
          listen 80;
          server_name example.com;
      
          location / {
              proxy_pass http://tomcat_servers;
              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_set_header X-Forwarded-Proto $scheme;
          }
      }
      
    • 使配置生效:sudo systemctl reload nginx(或 restart)
  • 验证
    • 访问 Nginx 地址,刷新页面应能在多个 Tomcat 实例间轮询;查看 /var/log/nginx/access.log 与 Tomcat 日志确认分发情况。

方案二 Apache HTTP Server 负载均衡(支持 HTTP 与 WebSocket)

  • 适用场景:需要同时负载均衡 HTTPWebSocket,或已有 Apache 统一接入。
  • 启用模块
    • sudo a2enmod proxy proxy_http proxy_wstunnel lbmethod_byrequests proxy_balancer xml2enc
  • 配置 VirtualHost(示例端口 82
    <VirtualHost *:82>
        ProxyRequests Off
    
        # WebSocket 集群
        <Proxy balancer://wscluster>
            BalancerMember ws://127.0.0.1:8080
            BalancerMember ws://127.0.0.1:8082
        </Proxy>
        ProxyPass /project/wsApi  balancer://wscluster/project/wsApi
        ProxyPassReverse /project/wsApi  balancer://wscluster/project/wsApi
    
        # HTTP 集群(AJP 示例)
        <Proxy balancer://tomcatcluster>
            BalancerMember ajp://127.0.0.1:8010 route=jvm8080
            BalancerMember ajp://127.0.0.1:8012 route=jvm8082
            ProxySet lbmethod=byrequests stickysession=JSESSIONID|jsessionid
        </Proxy>
        ProxyPass /  balancer://tomcatcluster/
        ProxyPassReverse /  balancer://tomcatcluster/
    
        # 可选:负载均衡管理页面
        <Location /balancer-manager>
            SetHandler balancer-manager
        </Location>
    </VirtualHost>
    
  • 说明
    • 两个 Tomcat 实例分别使用 HTTP 8080/8082AJP 8010/8012,并在 Engine 上设置 jvmRoute(如 jvm8080/jvm8082)以便会话粘滞。
    • 访问 http://ip:82/balancer-manager 可查看与调整集群状态。

会话保持与高可用

  • 会话保持
    • 基于 Cookie 的会话粘滞:在 Nginx 的 upstream 中使用 ip_hash; 或在 Apache 中使用 stickysession=JSESSIONID|jsessionid
    • 无状态与会话共享:将会话存入 Redis 等集中式缓存,避免单点依赖与粘滞带来的不均衡。
  • 健康检查与故障转移
    • Nginx 可结合 max_fails/fail_timeout 与主动健康检查(商业版或接入 nginx-plus)实现自动摘除异常实例;开源版可用被动健康检查配合监控告警。
  • 高可用(避免单点 Nginx)
    • 部署 Keepalived + Nginx 双机热备,配置 VIP,实现故障自动切换与对外统一入口。

可选优化 动静分离

  • 将静态资源由 Nginx 直接提供,动态请求反向代理到 Tomcat,降低应用服务器压力、提升吞吐。
  • 示例 Nginx 片段:
    location /static/ {
        alias /var/www/static/;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
    
    location / {
        proxy_pass http://tomcat_servers;
        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_set_header X-Forwarded-Proto $scheme;
    }
    
  • 将应用静态资源(如 /static、图片、JS、CSS)放置于 /var/www/static 等目录即可生效。

0