温馨提示×

Debian如何实现Tomcat负载均衡

小樊
41
2025-12-13 22:59:18
栏目: 云计算

在 Debian 上实现 Tomcat 负载均衡

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

  • 安装组件
    • 执行:sudo apt update && sudo apt install -y nginx tomcat9
  • 配置负载均衡
    • 编辑 /etc/nginx/nginx.conf 的 http 段,添加 upstream 与反向代理:
      http {
        upstream tomcat_servers {
          server 127.0.0.1:8080;
          server 127.0.0.1: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 nginx -t
    • 重启:sudo systemctl restart nginx
  • 说明
    • 以上通过 HTTP 反向代理分发请求,配置简洁、性能与并发能力强,适合生产环境。若需更强控制,可在 upstream 中加入权重、备份等策略。

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

  • 安装与启用模块
    • 执行:sudo apt update && sudo apt install -y apache2 libapache2-mod-jk
    • 启用模块:sudo a2enmod proxy proxy_http proxy_ajp
  • 方式 A(HTTP 代理,简洁通用)
    • /etc/apache2/sites-available/000-default.conf 的 VirtualHost 中加入:
      <Proxy "balancer://mycluster">
        BalancerMember http://127.0.0.1:8080
        BalancerMember http://127.0.0.1:8081
      </Proxy>
      ProxyPass / balancer://mycluster
      ProxyPassReverse / balancer://mycluster
      
  • 方式 B(AJP 代理,贴近 Tomcat 内部协议)
    • 启用 AJP 连接器:在每个 Tomcat 的 server.xml 的 Service 中添加
      <Connector protocol="AJP/1.3" port="8009" redirectPort="8443" />
      
    • 创建 /etc/apache2/workers.properties
      worker.list=cluster
      worker.cluster.type=lb
      worker.cluster.balance_workers=tomcat1,tomcat2
      worker.tomcat1.type=ajp13
      worker.tomcat1.host=127.0.0.1
      worker.tomcat1.port=8009
      worker.tomcat2.type=ajp13
      worker.tomcat2.host=127.0.0.1
      worker.tomcat2.port=8010
      
    • VirtualHost 中使用 JkMount:
      JkMount /* cluster
      
  • 生效
    • 重启 Apache:sudo systemctl restart apache2
  • 说明
    • mod_proxy 配置直观;mod_jk 通过 AJP 13 与 Tomcat 集成,适合已有 AJP 体系或需更细粒度控制的场景。

会话保持与集群

  • 目标
    • 多实例下保持用户会话连续(避免登录状态丢失)。
  • 推荐做法
    • 使用 Tomcat 内置集群与会话复制(DeltaManager/集群 Valve),在 server.xml 的 Engine 或 Host 内加入:
      <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.catalator.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="60"/>
          <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=""/>
        <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
        <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      </Cluster>
      
    • 为参与集群的实例设置不同 Receiver port(如 4000/4001),并确保网络互通与组播可达。
    • 应用需启用可序列化会话属性,并尽量使用无状态或有状态会话外部化(如 Redis/JDBC Store)以获得更稳健的扩展性与容错。

健康检查与运维建议

  • 健康检查
    • Nginx 可在 upstream 中为实例添加参数实现主动健康检查与故障隔离,例如:
      upstream tomcat_servers {
        server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
        server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
      }
      
  • 日志与监控
    • 统一记录访问与错误日志,结合应用埋点与状态端点,监控后端实例可用性、响应时延与错误率。
  • 安全加固
    • 仅暴露负载均衡器到公网,后端 Tomcat 置于内网;启用防火墙与访问控制;为反向代理设置合适的超时与连接复用参数。

0