首页主机资讯Ubuntu下Tomcat如何实现负载均衡

Ubuntu下Tomcat如何实现负载均衡

时间2025-12-01 11:12:03发布访客分类主机资讯浏览228
导读:Ubuntu下实现Tomcat负载均衡的实用方案 一、方案总览与选择 常见做法是在前端部署反向代理/负载均衡器,将请求分发到多个 Tomcat 实例。主流选择包括: Nginx:配置简洁、性能稳定,适合 HTTP 场景。 Apache...

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

一、方案总览与选择

  • 常见做法是在前端部署反向代理/负载均衡器,将请求分发到多个 Tomcat 实例。主流选择包括:
    • Nginx:配置简洁、性能稳定,适合 HTTP 场景。
    • Apache HTTP Server + mod_proxy/mod_proxy_ajp 或 mod_jk:生态成熟,支持 HTTP/AJP 与更细粒度控制。
    • HAProxy:专业负载均衡,适合高并发与复杂路由策略。
  • 会话一致性可选方案:
    • Sticky Session(会话粘滞):同一会话固定到一台后端,配置简单,容错性一般。
    • Tomcat 集群会话复制:节点间同步 Session,可用性更高,节点多时开销增大。
    • 外置 Session 存储(如 Redis):解耦应用与容器,扩展性强,推荐在微服务/容器化场景使用。

二、方案一 Nginx HTTP 反向代理负载均衡(最简实践)

  • 安装与启动
    • 安装 Nginx:sudo apt update & & sudo apt install nginx
    • 启动与开机自启:sudo systemctl start nginx & & sudo systemctl enable nginx
  • 准备多个 Tomcat 实例
    • 解压两份 Tomcat 到不同目录(如 /opt/tomcat1/opt/tomcat2)。
    • 修改 conf/server.xml 中的 HTTP Connector 端口,使实例分别监听 80808081(或不同主机不同端口)。
  • 配置 Nginx 负载均衡
    • 编辑 /etc/nginx/sites-available/loadbalancer(或 /etc/nginx/nginx.conf 的 http 块内):
      upstream tomcat_servers {
          
          server 192.168.1.101:8080;
          
          server 192.168.1.102:8081;
          
          # 可选:开启被动健康检查
          # server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;
          
          # server 192.168.1.102:8081 max_fails=3 fail_timeout=30s;
      
      }
      
      
      server {
          
          listen 80;
          
          server_name your.domain.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 ln -s /etc/nginx/sites-available/loadbalancer /etc/nginx/sites-enabled/ & & sudo systemctl reload nginx
  • 验证
    • 多次访问应用,观察不同 Tomcat 实例日志或返回页面标识,确认分发生效。

三、方案二 Apache HTTP Server 负载均衡(mod_proxy 与 mod_jk)

  • 启用模块
    • sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests
    • 如需 AJP:sudo a2enmod proxy_ajp
  • 配置 VirtualHost(HTTP 代理示例)
    <
        VirtualHost *:80>
        
        ServerName your.domain.com
    
        ProxyRequests Off
        ProxyPass        /  balancer://cluster/
        ProxyPassReverse /  balancer://cluster/
    
        <
        Proxy balancer://cluster>
        
            BalancerMember http://192.168.1.101:8080 route=node1
            BalancerMember http://192.168.1.102:8081 route=node2
            ProxySet lbmethod=byrequests
            # 可选:开启粘性会话
            # ProxySet stickysession=JSESSIONID
        <
        /Proxy>
        
    <
        /VirtualHost>
        
    
    • 保存至 /etc/apache2/sites-available/loadbalancer 并启用:sudo a2ensite loadbalancer & & sudo systemctl reload apache2
  • 使用 mod_jk(AJP,可选)
    • 安装 tomcat-connectors 并启用 mod_jk,配置 workers.properties
      worker.list=loadbalancer,status
      worker.tomcat1.type=ajp13
      worker.tomcat1.host=192.168.1.101
      worker.tomcat1.port=8009
      worker.tomcat2.type=ajp13
      worker.tomcat2.host=192.168.1.102
      worker.tomcat2.port=8009
      worker.loadbalancer.type=lb
      worker.loadbalancer.balance_workers=tomcat1,tomcat2
      worker.status.type=status
      worker.loadbalancer.sticky_session=1
      
    • 在 Apache 中加载模块与 JkWorkersFile,并通过 JkMount 挂载应用。

四、会话保持与集群

  • Sticky Session(会话粘滞)
    • Nginx 可用 ip_hash 或在商业版启用主动健康检查与会话保持;Apache 使用 stickysession=JSESSIONID
    • 需在 Tomcat 的 Engine 上设置 jvmRoute(与负载均衡器路由标识一致):
      <
          Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
          
      
  • Tomcat 集群会话复制(DeltaManager 示例)
    • server.xmlEngine 内加入:
      <
          Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
               channelSendOptions="8">
          
        <
          Manager className="org.apache.catalina.ha.session.DeltaManager"
                 expireSessionsOnShutdown="false"
                 notifyListenersOnReplication="true"/>
          
        <
          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" autoBind="100"
                     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.MessageDispatchInterceptor"/>
          
        <
          /Channel>
          
        <
          Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
          
        <
          ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
          
      <
          /Cluster>
          
      
    • 部署的应用 WEB-INF/web.xml 中加入 < distributable/> ,告知容器支持分布式会话。

五、健康检查、安全与监控

  • 健康检查与故障转移
    • Nginx 可结合 max_fails/fail_timeout 做被动健康检查;Apache 可通过 nofailover 与 BalancerMember 参数控制故障处理策略。
  • 安全加固
    • 对外仅暴露 80/443,限制管理端口访问;为 Nginx/Apache 配置 HTTPS/TLS;在云环境配合 安全组/防火墙 仅放行必要来源。
  • 监控与调优
    • 建议接入 Prometheus + Grafana 监控请求量、5xx 错误、后端响应时间、连接池等指标;结合业务调整 worker 进程/连接数 与 Tomcat 线程池/连接器 参数。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Ubuntu下Tomcat如何实现负载均衡
本文地址: https://pptw.com/jishu/759904.html
Tomcat在Ubuntu中的日志轮转如何设置 Debian中Go语言如何保障安全性

游客 回复需填写必要信息