温馨提示×

Ubuntu Tomcat如何负载均衡

小樊
36
2025-12-12 00:26:46
栏目: 云计算

Ubuntu 上实现 Tomcat 负载均衡的实用方案

方案一 Nginx 反向代理与负载均衡

  • 安装与准备
    • 安装 Nginx:sudo apt update && sudo apt install nginx
    • 准备多实例 Tomcat,分别监听不同端口(如:8080、8081),确保应用可独立访问
  • Nginx 负载均衡配置示例(/etc/nginx/sites-available/loadbalance 或 /etc/nginx/nginx.conf 的 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;
          }
      }
      
    • 会话粘性(基于客户端 IP):在 upstream 首行加入 ip_hash;
    • 健康检查与权重:
      upstream tomcat_servers {
          server 192.168.1.101:8080 weight=1 max_fails=3 fail_timeout=20s;
          server 192.168.1.102:8081 weight=1 max_fails=3 fail_timeout=20s;
      }
      
  • 使配置生效:sudo nginx -t && sudo systemctl reload nginx
  • 说明:Nginx 作为反向代理与负载均衡器,配置简单、性能稳定,适合大多数 HTTP 场景。

方案二 Apache HTTP Server 负载均衡 mod_proxy 与 mod_proxy_ajp

  • 安装与启用模块
    • sudo apt install apache2
    • sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests
  • HTTP 代理示例(/etc/apache2/sites-available/000-default.conf)
    <VirtualHost *:80>
        ServerName example.com
        ProxyPreserveHost On
        ProxyPass / balancer://tomcatcluster/
        ProxyPassReverse / balancer://tomcatcluster/
        <Proxy balancer://tomcatcluster>
            BalancerMember http://192.168.1.101:8080 route=node1
            BalancerMember http://192.168.1.102:8081 route=node2
            ProxySet lbmethod=byrequests
            ProxySet stickysession=JSESSIONID|jsessionid
        </Proxy>
    </VirtualHost>
    
  • AJP 代理示例(可选,使用 AJP 端口如 8009/8010
    <Proxy balancer://tomcatcluster-ajp>
        BalancerMember ajp://192.168.1.101:8009 route=node1
        BalancerMember ajp://192.168.1.102:8010 route=node2
        ProxySet lbmethod=byrequests stickysession=JSESSIONID
    </Proxy>
    ProxyPass / balancer://tomcatcluster-ajp/
    ProxyPassReverse / balancer://tomcatcluster-ajp/
    
  • 使配置生效:sudo a2ensite 000-default.conf && sudo systemctl reload apache2
  • 说明:Apache 通过 mod_proxy/mod_proxy_ajp 实现负载均衡,支持权重、会话粘性与故障转移。

会话保持与集群方案

  • 会话粘性
    • Nginx:在 upstream 使用 ip_hash; 实现基于客户端 IP 的粘性
    • Apache:在 balancer 上使用 stickysession=JSESSIONID|jsessionid 实现粘性
  • Tomcat 集群与会话复制(跨实例共享会话)
    • 在 server.xml 的 Engine 或 Host 内加入:
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
              <Membership className="org.apache.catalina.tribes.membership.McastService"
                          address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
              <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                        address="auto" port="4000" selectorTimeout="5000" maxThreads="6"/>
              <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
                  <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
              </Sender>
              <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
              <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
          </Channel>
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.jsp|.*\.do"/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>
      
    • 在应用的 WEB-INF/web.xml 中加入 ,告知容器支持分布式会话
  • 共享会话存储(无状态/跨机房优选)
    • 将会话存入 Redis 等外部缓存,实现高可用与弹性扩展
  • 说明:粘性适合快速落地;集群复制适合无共享存储场景;共享缓存更利于水平扩展与容灾。

高可用与验证

  • 高可用架构
    • 前置两台 Nginx 做负载均衡,配合 Keepalived 提供 VIP,实现故障自动切换与高可用(主备或集群)
  • 快速验证
    • 部署测试页输出 SessionID 或服务器 IP,多次刷新与多端访问观察分发与粘性
    • 查看负载均衡器与后端日志:tail -f /var/log/nginx/access.log /var/log/nginx/error.log 或 Apache 对应日志
    • 执行 curl -I http://yourdomain/ 检查响应头与后端命中情况
  • 说明:Keepalived+Nginx 可消除单点故障;日志与探针是定位分发与会话问题的首要手段。

0