温馨提示×

centos环境下tomcat如何进行负载均衡

小樊
51
2026-01-10 06:59:13
栏目: 云计算

CentOS 下 Tomcat 负载均衡实操指南

一、方案总览与准备

  • 常见做法是在前端部署反向代理/负载均衡器,将请求分发到多台后端 Tomcat 实例。生产环境常用:NginxApache HTTP Server(httpd),也可用 HAProxy。为便于演示,假设两台后端 Tomcat 分别运行在 192.168.1.11:8080192.168.1.12:8080,前端负载均衡器监听 80
  • 建议准备:
    • Tomcat 实例的应用与配置保持一致(同一 war 包、相同 context 路径)。
    • 开放防火墙端口(示例为 80/8080):firewall-cmd --add-port=80/tcp --permanent && firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload
    • 如部署在同一台机器,需确保各实例的 HTTP 连接器端口、Shutdown 端口、AJP 端口不冲突。

二、方案一 Nginx 作为负载均衡器

  • 安装(CentOS 7/8 常见方式):sudo yum install -y epel-release && sudo yum install -y nginx
  • 配置 /etc/nginx/nginx.conf/etc/nginx/conf.d/tomcat.conf
http {
  upstream tomcat_servers {
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
    # 可选:权重
    # server 192.168.1.11:8080 weight=3;
    # server 192.168.1.12:8080 weight=1;
  }

  server {
    listen 80;
    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 enable --now nginx,访问前端 IP/域名,刷新应能在两台 Tomcat 之间轮询。
  • 会话粘性(可选):将 upstream 改为 ip_hash;,同一客户端将固定到同一后端。
  • 健康检查(被动式):在 upstream 成员上设置 max_fails=3 fail_timeout=30s;,在故障节点超过阈值后自动摘除一段时间。

三、方案二 Apache HTTP Server 作为负载均衡器

  • 启用模块(httpd 2.4):在 /etc/httpd/conf/httpd.conf 或相应子配置中确保加载:mod_proxy、mod_proxy_http、mod_proxy_balancer
  • 配置示例(/etc/httpd/conf.d/tomcat_balancer.conf):
<Proxy balancer://tcsrvs>
  BalancerMember http://192.168.1.11:8080 route=node1
  BalancerMember http://192.168.1.12:8080 route=node2
  ProxySet lbmethod=byrequests
</Proxy>

<VirtualHost *:80>
  ServerName your.domain
  ProxyPreserveHost On
  ProxyPass / balancer://tcsrvs/
  ProxyPassReverse / balancer://tcsrvs/
  <Location />
    Require all granted
  </Location>
</VirtualHost>
  • 会话粘性:在 <Proxy balancer://tcsrvs> 上增加 ProxySet stickysession=JSESSIONID,并为成员设置 route=nodeX;Tomcat 端需设置 jvmRoute 与之对应(见第四部分)。
  • 启动与验证:sudo systemctl enable --now httpd,访问测试。

四、会话保持与会话复制

  • 会话粘性(简化方案):
    • Nginx:在 upstream 中使用 ip_hash;
    • Apache:使用 stickysession=JSESSIONID 并为 BalancerMember 设置 route=nodeX
  • Tomcat 集群会话复制(无状态/容错更强):
    • 在每台 Tomcatconf/server.xml<Engine> 上设置唯一 jvmRoute(如 jvmRoute="node1"jvmRoute="node2"),与负载均衡器的 route 保持一致。
    • conf/server.xml 中启用集群(在 <Engine> 或同级位置加入):
<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" 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.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>
  • 在应用的 META-INF/context.xml 或全局 conf/context.xml 中使用会话管理器(示例为 DeltaManager):
<Context>
  <Manager className="org.apache.catalina.ha.session.DeltaManager"
           expireSessionsOnShutdown="false"
           notifyListenersOnReplication="true"/>
</Context>
  • 提示:会话复制会带来一定网络与 CPU 开销;若应用已使用 Redis/JDBC 等外置会话存储,可不必启用内置集群复制。

五、验证与运维要点

  • 验证负载均衡:在两台 Tomcatwebapps/ROOT/index.jsp 写入不同标识(如 “Tomcat-A/B”),反复访问前端地址,观察页面在实例间切换;使用 curl -I 或浏览器开发者工具查看响应头与后端节点。
  • 日志排查:
    • Nginx/var/log/nginx/access.log/var/log/nginx/error.log
    • Apache/var/log/httpd/access_log/var/log/httpd/error_log
    • Tomcat$CATALINA_HOME/logs/catalina.outlocalhost_access_log.*.txt
  • 健康检查与故障转移:
    • Nginx 被动健康检查可用 max_fails/fail_timeout;如需主动健康检查,可结合 ngx_http_healthcheck_module 或外部探活脚本。
    • Apache httpd 可通过 mod_proxy_balancerstatus 页面查看与维护后端状态。
  • 端口与防火墙:确认负载均衡器与后端 Tomcat80/8080(及 AJP/8009 若使用)已放行;同机多实例需避免端口冲突。

0