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

Ubuntu Tomcat如何负载均衡

时间2025-12-12 13:54:06发布访客分类主机资讯浏览836
导读:Ubuntu 上实现 Tomcat 负载均衡的实用方案 方案一 Nginx 反向代理与负载均衡 安装与准备 安装 Nginx:sudo apt update && sudo apt install nginx 准备多实例...

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 可消除单点故障;日志与探针是定位分发与会话问题的首要手段。

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


若转载请注明出处: Ubuntu Tomcat如何负载均衡
本文地址: https://pptw.com/jishu/770483.html
Telnet连接Linux失败怎么办 如何解决Ubuntu Tomcat 500错误

游客 回复需填写必要信息