預設 Tomcat 參數無法滿足生產環境的高併發與穩定性需求。本文系統整理 JVM 內存設定、執行緒池配置、Connector 連接參數調優、JMX 遠程監控及 Web 應用部署等關鍵優化項目。
修改啟動腳本最前端,確保參數優先生效。
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=GMT+08
JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"
參數說明:
-Xms/-Xmx:堆初始/最大值,建議設為相同值避免動態擴縮容震盪。-XX:PermSize/MaxPermSize:永久代/元空間大小(JDK 8+ 改用 MetaspaceSize/MaxMetaspaceSize)。-Duser.timezone:修正伺服器時區偏移問題(Windows 用 GMT+08,Linux 用 Asia/Shanghai)。使用共享執行緒池以少量線程處理大量請求,提升吞吐量。
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="20" maxIdleTime="60000" />
maxThreads=500:最大線程數,一般伺服器足夠。minSpareThreads=20:啟動時預創建的核心線程數。maxIdleTime=60000:空閒線程存活時間(毫秒),超過則回收。<Connector executor="tomcatThreadPool"
port="80" protocol="HTTP/1.1"
connectionTimeout="60000"
keepAliveTimeout="15000"
maxKeepAliveRequests="1"
redirectPort="443"
... />
注意:多個 Connector 可共用同一個 Executor。
<Connector executor="tomcatThreadPool"
port="80" protocol="HTTP/1.1"
connectionTimeout="30000"
keepAliveTimeout="15000"
maxKeepAliveRequests="100"
redirectPort="443"
maxHttpHeaderSize="8192"
URIEncoding="UTF-8"
enableLookups="false"
acceptCount="100"
disableUploadTimeout="true" />
| 參數 | 建議值 | 作用 |
|---|---|---|
| connectionTimeout | 30000 | 網絡連接超時(ms),0 表永不超時(有風險) |
| keepAliveTimeout | 15000 | 長連接最大保持時間(ms) |
| maxKeepAliveRequests | 100~200 | 單連接最大請求數,1 表禁用,-1 表無限制 |
| maxHttpHeaderSize | 8192 | HTTP 請求頭最大字節數 |
| URIEncoding | UTF-8 | URL 編碼格式,防止中文亂碼 |
| acceptCount | 100 | 當所有線程忙碌時,請求排隊隊列長度 |
| disableUploadTimeout | true | 上傳時使用超時機制 |
| enableLookups | false | 禁用 DNS 反查,提升處理能力 |
| maxThreads | 200(預設) | 若未使用 Executor,此處限制最大處理線程數 |
| minSpareThreads | 4(預設) | 啟動時創建的最小空閒線程數 |
便於使用 JConsole、VisualVM 等工具監控 JVM 狀態。
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=10090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=10090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=%CATALINA_BASE%/conf/logging.properties"
前置條件:確保 JDK/jre/lib/management/management.properties 存在。重啟後使用 jconsole host:10090 連接。
在 server.xml 的 <Host> 標籤內添加:
<Context displayName="OA" docBase="/app/web-apps/GACWP" path="" />
path="" 表示部署為根路徑應用(即 https://host:port/ 直接訪問)。
Tomcat 6+ 支援分散式部署與 Session 複製,可透過 <Cluster> 元素配置,配合 Nginx/Apache 實現前端負載均衡,大幅提升可用性與擴展性。