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

Tomcat 調優與集群部署完整方案(OS、JVM、Apache 整合、負載均衡)

     編輯:Java 相關知識

Tomcat 作為輕量級 Servlet 容器,預設配置僅適合開發測試。生產環境需從作業系統、JVM、Web 伺服器整合、集群架構多維度調優。本文整理完整調優清單與集群部署實施步驟,支撐高併發業務場景。

一、作業系統層面調優

  • 檔案描述符限制:ulimit -n 65535 (永久生效寫入 /etc/security/limits.conf)
  • TCP 參數優化 (/etc/sysctl.conf):
    net.core.somaxconn = 65535
    net.ipv4.tcp_max_syn_backlog = 65535
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_fin_timeout = 15
  • 關閉 Swap 或降低 swappiness:vm.swappiness = 1
  • 掛載選項:資料盤掛載 noatime,nodiratime 減少 I/O

二、JVM 參數調優 (catalina.sh / setenv.sh)

# 基礎堆內存 (視實體記憶體 60-80%)
-Xms4g -Xmx4g

# 新生代/老年代比例
-XX:NewRatio=2
-XX:SurvivorRatio=8

# GC 策略 (JDK 8+ 推薦 G1)
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m

# GC 日誌 (重要!)
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps
-Xloggc:/var/log/tomcat/gc-%t.log
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M

# 避免顯式 GC
-XX:+DisableExplicitGC

# 類元空間
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m

# 其他
-Djava.security.egd=file:/dev/./urandom
-Dfile.encoding=UTF-8
-Duser.timezone=Asia/Taipei

三、Apache httpd 整合 Tomcat (mod_jk 方案)

架構優勢

  • Apache 處理靜態資源 (HTML、CSS、JS、圖片) 效能遠優於 Tomcat
  • Tomcat 專注動態請求 (JSP、Servlet、API)
  • Apache 提供成熟的負載均衡、SSL 終結、WAF、壓縮、快取模組

部署步驟

  1. 安裝 Apache httpd 2.4+
  2. 編譯或安裝 mod_jk.so (對應 httpd 版本)
  3. 複製 mod_jk.so 至 modules/
  4. 配置 httpd.conf 載入模組並引入 mod_jk.conf
  5. 編寫 mod_jk.conf 定義 mount 規則
  6. 編寫 workers.properties 定義 Tomcat 節點

關鍵配置範例

httpd.conf

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkMount /* loadbalancer
JkMount /static/*  static-files  # 靜態資源直接由 Apache 服務

workers.properties

worker.list=loadbalancer,status

# Tomcat 節點 1
worker.tomcat1.port=8009
worker.tomcat1.host=192.168.1.101
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
worker.tomcat1.connection_pool_size=200

# Tomcat 節點 2
worker.tomcat2.port=8009
worker.tomcat2.host=192.168.1.102
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
worker.tomcat2.connection_pool_size=200

# 負載均衡 worker
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=tomcat1,tomcat2
worker.loadbalancer.sticky_session=1  # Session 親和性

# 狀態監控
worker.status.type=status

四、Apache + Tomcat 集群架構

擴展性驗證數據

經壓測驗證:
Apache + 3 Tomcat > Apache + 2 Tomcat > Apache + 1 Tomcat > 單獨 Tomcat

高可用特性

  • 單節點故障自動剔除,服務不中斷
  • Session 複製 (DeltaManager/BackupManager) 或外部化 (Redis/Memcached) 保障狀態
  • 健康檢查機制自動摘除/恢復節點

Apache MPM 參數調優 (Windows 使用 mpm_winnt,Linux 使用 event/worker)


    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         64
    MaxRequestWorkers      400
    MaxConnectionsPerChild 3000


# 通用優化
HostnameLookups Off
UseCanonicalName On
KeepAlive On
KeepAliveTimeout 15
MaxKeepAliveRequests 10000

# 關閉無用模組
# LoadModule include_module modules/mod_include.so
# LoadModule autoindex_module modules/mod_autoindex.so

五、Tomcat 自身配置優化 (server.xml)

連接器優化

<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
    maxThreads="500" minSpareThreads="50"
    acceptCount="1000"
    connectionTimeout="20000"
    compression="on"
    compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/json,application/javascript"
    compressionMinSize="1024"
    disableUploadTimeout="true"
    enableLookups="false"  <!-- 關鍵:關閉 DNS 反查 -->
    URIEncoding="UTF-8" />

<!-- AJP 連接器 (給 mod_jk 用) -->
<Connector port="8009" protocol="AJP/1.3"
    maxThreads="300" minSpareThreads="30"
    connectionTimeout="20000"
    enableLookups="false" />

關閉 DNS 反查 (關鍵效能點)

<Valve className="org.apache.catalina.valves.AccessLogValve"
    directory="logs" prefix="access_log" suffix=".txt"
    pattern="%h %l %u %t "%r" %s %b %D" 
    resolveHosts="false" />  <!-- 禁止解析主機名 -->

Session 管理

  • 單機:預設 StandardManager
  • 集群:DeltaManager (全量複製,節點少) 或 BackupManager (備份到指定節點)
  • 生產建議:外部化 Session 至 Redis (Tomcat-Redis-Session-Manager)

部署檢查清單

階段

關鍵動作驗證方式
OSulimit、sysctl、swapulimit -a, sysctl -p
JVM堆、GC、Metaspace、GC日誌jstat -gcutil <pid>, 分析 GC 日誌
Apachemod_jk、MPM、KeepAlive、模組精簡ab -n 10000 -c 200, mod_jk.log
TomcatConnector、enableLookups、Session、ValvesJMeter 壓測, 監控 CPU/MEM/GC/Thread
集群Session 外部化、健康檢查、Sticky Session單節點下線測試、Session 不丟失驗證

監控與持續優化

  • 部署 Prometheus + Grafana 監控 JVM、Tomcat、Apache 關鍵指標
  • 啟用 JMX Exporter 暴露 MBean 指標
  • 定期分析 GC 日誌 (GCViewer, GCEasy) 調整堆/新生代大小
  • 壓測驗證每次調優效果,建立基準線

系統效能調優是持續迭代過程,沒有銀彈。從基礎設施到應用層層疊加優化,配合完善監控體系,才能穩定支撐業務增長。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved