Tomcat 作為輕量級 Servlet 容器,預設配置僅適合開發測試。生產環境需從作業系統、JVM、Web 伺服器整合、集群架構多維度調優。本文整理完整調優清單與集群部署實施步驟,支撐高併發業務場景。
ulimit -n 65535 (永久生效寫入 /etc/security/limits.conf)/etc/sysctl.conf):net.core.somaxconn = 65535net.ipv4.tcp_max_syn_backlog = 65535net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_fin_timeout = 15vm.swappiness = 1noatime,nodiratime 減少 I/O# 基礎堆內存 (視實體記憶體 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
mod_jk.so (對應 httpd 版本)mod_jk.so 至 modules/httpd.conf 載入模組並引入 mod_jk.confmod_jk.conf 定義 mount 規則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 + 3 Tomcat > Apache + 2 Tomcat > Apache + 1 Tomcat > 單獨 Tomcat
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
<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" />
<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" /> <!-- 禁止解析主機名 -->
StandardManagerDeltaManager (全量複製,節點少) 或 BackupManager (備份到指定節點)Tomcat-Redis-Session-Manager)| 關鍵動作 | 驗證方式 | |
|---|---|---|
| OS | ulimit、sysctl、swap | ulimit -a, sysctl -p |
| JVM | 堆、GC、Metaspace、GC日誌 | jstat -gcutil <pid>, 分析 GC 日誌 |
| Apache | mod_jk、MPM、KeepAlive、模組精簡 | ab -n 10000 -c 200, mod_jk.log |
| Tomcat | Connector、enableLookups、Session、Valves | JMeter 壓測, 監控 CPU/MEM/GC/Thread |
| 集群 | Session 外部化、健康檢查、Sticky Session | 單節點下線測試、Session 不丟失驗證 |
GCViewer, GCEasy) 調整堆/新生代大小系統效能調優是持續迭代過程,沒有銀彈。從基礎設施到應用層層疊加優化,配合完善監控體系,才能穩定支撐業務增長。