首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Apache 2.4 + Tomcat 8 負載均衡集群方案:Windows x64 環境下 mod_jk 實戰部署

     編輯:Java 綜合教學

核心概念速覽

術語定義
負載均衡按策略將請求分發到集群多台服務器,提升吞吐量與可用性
集群N 台服務器通過網絡協作,對外表現為單一服務入口
高可用 (HA)主節點故障時備份自動接管,實現服務不中斷
Session 複製/共享解決集群環境下用戶登錄態在節點間同步問題

軟件版本矩陣(關鍵:全部 64 位)

  • JDK: jdk1.7.0_80 x64(Tomcat 8 需 JDK 7+)
  • Apache HTTP Server: 2.4.12 x64
  • Tomcat: apache-tomcat-8.0.32 x64 × 2 實例
  • mod_jk: tomcat-connectors-1.2.40-windows-x86_64-httpd-2.4.x → 重命名為 mod_jk.so 放入 Apache2.4/modules/

網絡環境:Win7 x64,8GB RAM,單機模擬 Apache + 雙 Tomcat

部署步驟

1. 基礎安裝驗證

  • 安裝 JDK,配置 JAVA_HOME、PATH
  • 解壓兩份 Tomcat 至 D:\tomcat81、D:\tomcat82,分別修改 server.xml 端口(8081/8082、8006/8007、8010/8011),**單獨啟動驗證無誤**
  • 安裝 Apache 至 D:\Apache24,啟動驗證默認 80 端口可訪問

2. Apache 載入 mod_jk

編輯 conf/httpd.conf,末尾添加:

# 載入 mod_jk 模塊
LoadModule jk_module modules/mod_jk.so
# 指定 worker 配置文件
JkWorkersFile conf/workers.properties
# 日誌配置
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
# 掛載路徑:所有 /examples/* 請求轉發到負載均衡器
JkMount /examples/* loadbalancer
JkMount /examples loadbalancer

3. 定義 Worker 配置:conf/workers.properties

# 定義兩個 Tomcat 實例 worker
worker.list=loadbalancer,tomcat81,tomcat82

worker.tomcat81.type=ajp13
worker.tomcat81.host=localhost
worker.tomcat81.port=8010
worker.tomcat81.lbfactor=1
worker.tomcat81.cachesize=10

worker.tomcat82.type=ajp13
worker.tomcat82.host=localhost
worker.tomcat82.port=8011
worker.tomcat82.lbfactor=1
worker.tomcat82.cachesize=10

# 負載均衡器 worker
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=tomcat81,tomcat82
worker.loadbalancer.sticky_session=1  # 開啟黏性會話,配合 Session 複製使用

4. Tomcat 端配置 AJP 連接器與集群

編輯兩個 Tomcat 的 conf/server.xml:

<!-- 確保 AJP 連接器啟用,端口對應 workers.properties -->
<Connector protocol="AJP/1.3" port="8010" redirectPort="8443" />  <!-- tomcat81 -->
<Connector protocol="AJP/1.3" port="8011" redirectPort="8443" />  <!-- tomcat82 -->

<!-- Engine 級別配置集群,關鍵屬性 jvmRoute 必須與 worker 名一致 -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat81">  <!-- tomcat82 改為 tomcat82 -->
    <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.MessageDispatch15Interceptor"/>
        </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.ClusterSessionListener"/>
    </Cluster>
</Engine>

5. Web 應用聲明可分布式

在需 Session 複製的 Web 應用 web.xml 添加:

<distributable/>

常見故障排查清單

  1. mod_jk.so 載入失敗:90% 是版本不匹配(x86/x64、httpd 版本),檢查 error.log 確認。
  2. 路徑錯誤:JkWorkersFile、JkLogFile 路徑相對 ServerRoot 或使用絕對路徑。
  3. Session 不共享:檢查 jvmRoute 與 worker 名一致、<distributable/>、防火牆允許組播/單播端口(45564、4000 等)。
  4. 跨網段部署:組播不通時改用靜態 membership(StaticMembershipService)配置具體 IP 列表。

驗證測試

  1. 啟動 Apache,再啟動兩個 Tomcat。
  2. 瀏覽器訪問 https://localhost/examples/,刷新觀察請求輪詢分發到兩個 Tomcat(可在各 Tomcat 日誌或頁面顯示當前端口驗證)。
  3. 登錄應用,殺掉一個 Tomcat,驗證另一節點無感繼續服務(Session 複製生效)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved