温馨提示×

CentOS Tomcat如何实现负载均衡配置

小樊
33
2025-12-21 11:57:01
栏目: 云计算

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


一 架构与准备

  • 架构选型
    • 方案A:Nginx + 多实例 Tomcat(HTTP 反向代理,配置简单、性能稳定,适合大多数 Web 场景)。
    • 方案B:Apache HTTP Server + mod_jk + Tomcat(基于 AJP 1.3,适合传统企业集成与细粒度控制)。
  • 环境准备
    • 至少准备2 台 Tomcat(建议同版本、同应用),分别部署在相同或不同主机;如在同一台主机,需确保 HTTP/AJP/Server/Shutdown 等端口不冲突。
    • 选择1 台 Nginx/Apache 作为负载均衡器,开放 80/443(Nginx)或 80(Apache)对外访问。
    • 开放防火墙端口(示例):Tomcat 的 8080,Nginx/Apache 的 80/443;如使用 firewalld:firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload。如使用 SELinux,遇到 502 可临时放行网络访问:setsebool -P httpd_can_network_connect 1。以上为常见做法,便于快速打通网络通路。

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

  • 安装 Nginx(CentOS 7/8 常见做法)
    • 安装 EPEL 源:sudo yum install -y epel-release
    • 安装 Nginx:sudo yum install -y nginx
    • 启动与开机自启:sudo systemctl enable --now nginx
  • 配置 upstream 与反向代理
    • 新建配置:/etc/nginx/conf.d/tomcat_lb.conf
    • 示例(轮询,可按需改为权重/最少连接/一致性哈希):
      upstream tomcat_cluster {
          # 示例:两台 Tomcat
          server 192.168.10.11:8080 weight=1 max_fails=3 fail_timeout=30s;
          server 192.168.10.12:8080 weight=1 max_fails=3 fail_timeout=30s;
          # 可选:ip_hash;  # 会话保持(基于客户端 IP)
      }
      
      server {
          listen 80;
          server_name your.domain.com;
      
          location / {
              proxy_pass http://tomcat_cluster;
              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;
              proxy_connect_timeout 5s;
              proxy_send_timeout 10s;
              proxy_read_timeout 10s;
          }
      
          # 可选:简单动静分离
          location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
              root /opt/static-resources;
              expires 7d;
          }
      }
      
    • 检查并重载:sudo nginx -t && sudo systemctl reload nginx
  • 验证
    • 访问 http://your.domain.com/,在两台 Tomcat 的 /webapps/ROOT/index.jsp 中加入实例标识(如 IP/端口),刷新应能在实例间切换(轮询)。

三 方案二 Apache HTTP Server + mod_jk 负载均衡

  • 安装与模块
    • 安装 Apache:sudo yum install -y httpd
    • 安装编译工具与依赖:sudo yum groupinstall -y "Development Tools"sudo yum install -y httpd-devel apr-devel apr-util-devel
    • 下载并编译 tomcat-connectors(mod_jk):
      cd /usr/local/src
      wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
      tar xf tomcat-connectors-1.2.48-src.tar.gz
      cd tomcat-connectors-1.2.48-src/native
      ./configure --with-apxs=/usr/bin/apxs
      make && sudo make install
      
  • 配置 Apache 加载 mod_jk
    • /etc/httpd/conf/httpd.conf 末尾加入:
      LoadModule jk_module modules/mod_jk.so
      JkWorkersFile /etc/httpd/conf/workers.properties
      JkMount /* controller
      
  • 配置 workers.properties
    worker.list=controller
    worker.controller.type=lb
    worker.controller.balanced_workers=tomcat1,tomcat2
    worker.controller.sticky_session=1
    
    worker.tomcat1.type=ajp13
    worker.tomcat1.host=192.168.10.11
    worker.tomcat1.port=8009
    worker.tomcat1.lbfactor=1
    
    worker.tomcat2.type=ajp13
    worker.tomcat2.host=192.168.10.12
    worker.tomcat2.port=8009
    worker.tomcat2.lbfactor=1
    
  • 配置 Tomcat(两台均配,注意端口与 jvmRoute 唯一)
    • server.xml
      • 修改 Server port(如 8005/9005)、HTTP Connector(如 8080/8081)、AJP Connector(如 8009/8010),并给 Engine 设置唯一 jvmRoute
        <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
        
      • 启用集群(打开注释或新增):
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
        
    • context.xml(在 内或同级加入)
      <Manager className="org.apache.catalina.ha.session.DeltaManager"
               expireSessionsOnShutdown="false"
               notifyListenersOnReplication="true"/>
      <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
      
  • 启动与验证
    • 启动 Apache:sudo systemctl enable --now httpd
    • 启动 Tomcat:在各实例 bin/ 下执行 ./startup.sh
    • 访问 http://your.domain.com/,并通过日志/页面标识验证分发与会话复制。

四 会话保持与高可用要点

  • 会话保持
    • Nginx:使用 ip_hash(会话粘滞)或结合应用层 JSESSIONID 路由;如需会话共享,使用 Tomcat 集群会话复制(见下)。
    • Apache/mod_jk:设置 worker.controller.sticky_session=1 实现粘滞会话。
  • Tomcat 集群与会话复制
    • server.xml 启用
    • context.xml 配置 DeltaManager 与会话监听,实现实例间会话复制,提升故障切换体验。
  • 健康检查与故障转移
    • Nginx:在 upstream 中使用 max_failsfail_timeout 实现被动健康检查与摘除;必要时结合主动健康检查模块或外部探活脚本。
    • Apache/mod_jk:由 lb worker 分发请求,结合 Tomcat 生命周期与网络可达性实现故障转移。

五 常见问题与快速排查

  • 502 Bad Gateway
    • 检查 Tomcat 是否存活(端口 8080/AJP 8009)、负载均衡器是否能连通后端;查看 /var/log/nginx/error.log/var/log/httpd/error_log
    • 若启用 SELinux,放行网络访问:setsebool -P httpd_can_network_connect 1
  • 端口或实例冲突
    • 多实例需确保 Server port、HTTP、AJP、Redirect 等端口唯一;AJP 端口需与 workers.properties 一致。
  • 会话不共享/登录状态丢失
    • 确认已启用 ClusterDeltaManager,并确保应用已部署到集群各节点;使用浏览器禁用缓存后测试登录/登出流程。
  • 静态资源慢
    • 启用 Nginx 动静分离,将 js/css/jpg/png 等由 Nginx 直接服务,提升性能与可扩展性。

0