CentOS上Tomcat配置最佳實踐
調整內核參數以提升網絡并發處理能力和系統穩定性。編輯/etc/sysctl.conf
文件,添加以下關鍵參數:
net.core.somaxconn 65535
:增加TCP監聽隊列的最大長度,避免高并發時連接被拒絕;net.ipv4.tcp_tw_reuse 1
:允許復用處于TIME_WAIT
狀態的連接,減少連接建立開銷;net.ipv4.tcp_tw_recycle 1
:快速回收TIME_WAIT
連接(注意:在NAT環境下可能引發問題,需根據實際情況調整)。sysctl -p
使配置生效。Tomcat處理高并發時需要大量文件描述符,需提高用戶級限制。編輯/etc/security/limits.conf
文件,添加:
* soft nofile 65536
(軟限制,臨時生效)
* hard nofile 65536
(硬限制,永久生效)
同時修改/etc/pam.d/common-session
和/etc/pam.d/common-session-noninteractive
,添加session required pam_limits.so
,確保限制生效。
透明大頁會導致內存碎片和性能下降,需在系統啟動時禁用。編輯/etc/rc.local
文件,添加:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
賦予執行權限chmod +x /etc/rc.local
。
通過server.xml
中的Executor
定義全局線程池,再關聯到Connector
,避免每個Connector單獨創建線程池。示例配置:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" <!-- 最大線程數(根據CPU核心數調整,如8核建議200-500) -->
minSpareThreads="50" <!-- 最小空閑線程數(保持活躍線程,減少創建開銷) -->
maxQueueSize="100" <!-- 請求隊列長度(隊列滿則拒絕請求)" />
<Connector executor="tomcatThreadPool"
port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
keepAliveTimeout="15000"
maxKeepAliveRequests="100" <!-- 限制長連接請求數,避免閑置連接占用資源 -->
redirectPort="8443" />
說明:maxThreads
需結合服務器硬件(CPU、內存)和應用特性調整,建議通過壓力測試確定最優值。
Http11NioProtocol
(非阻塞I/O),替代傳統的BIO
(阻塞I/O),提升高并發下的吞吐量;compression="on"
、compressionMinSize="8192"
(8KB以上才壓縮)、compressableMimeType="text/html,text/xml,text/plain,application/json"
(指定壓縮的MIME類型);keepAliveTimeout
(如15秒)和maxKeepAliveRequests
(如100),平衡連接復用和資源占用。通過catalina.sh
(Linux)或catalina.bat
(Windows)設置JVM內存,避免內存溢出(OutOfMemoryError
)。關鍵參數:
JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xmn1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
說明:
-Xms
和-Xmx
設置為相同值,避免堆內存頻繁擴容;-Xmn
設置年輕代大?。ńㄗh為堆的1/2-1/3),提升Minor GC效率;-XX:+UseG1GC
使用G1垃圾回收器(適用于大內存、低延遲場景),-XX:MaxGCPauseMillis
設置最大GC停頓時間目標。避免中文亂碼,在Connector
中添加URIEncoding="UTF-8"
,確保URL中的中文參數正確解析。
server.xml
中Connector
的port
屬性(如改為8081);Host
標簽,設置name
為域名(如<Host name="www.example.com" appBase="webapps" unpackWARs="true" autoDeploy="false">
),并更新本地hosts
文件(127.0.0.1 www.example.com
)。修改server.xml
中的Server
標簽,添加server="Apache"
(或其他虛假信息),避免暴露Tomcat版本,減少針對性攻擊:
<Server port="8005" shutdown="SHUTDOWN" server="Apache">
server.xml
中的AJP Connector(<Connector protocol="AJP/1.3" .../>
);autoDeploy="false"
(Host
標簽中),避免未經授權的WAR包自動部署。tomcat
用戶(useradd -r -m -d /opt/tomcat -s /sbin/nologin tomcat
),并將Tomcat安裝目錄的所有權賦予該用戶(chown -R tomcat:tomcat /opt/tomcat
);tomcat
用戶僅具備運行Tomcat所需的權限,避免使用root
運行。推薦使用HikariCP(輕量、高性能),替代Tomcat自帶的DBCP。在context.xml
中配置示例:
<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
factory="com.zaxxer.hikari.HikariJNDIFactory"
jdbcUrl="jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC"
username="user" password="password"
maximumPoolSize="20" <!-- 最大活躍連接數 -->
minimumIdle="5" <!-- 最小空閑連接數 -->
connectionTimeout="30000" <!-- 連接超時時間(毫秒) -->
idleTimeout="600000" <!-- 空閑連接超時時間(毫秒) -->
maxLifetime="1800000" <!-- 連接最大生命周期(毫秒) -->
validationQuery="SELECT 1" <!-- 連接有效性驗證SQL -->
testWhileIdle="true" <!-- 空閑時檢查連接有效性 -->
testOnBorrow="false" <!-- 借用時不檢查(減少開銷) -->
testOnReturn="false" <!-- 歸還時不檢查 -->
poolPreparedStatements="true" <!-- 預編譯語句池化 -->
maxPoolPreparedStatementPerConnectionSize="20" />
通過Tomcat Manager應用或JMX接口監控連接池狀態(如活躍連接數、等待連接數),及時發現連接泄漏或配置不合理問題。
刪除webapps
目錄下的默認應用(如ROOT
、docs
、examples
、manager
),避免不必要的資源占用和安全風險。
定期檢查logs
目錄下的日志文件(catalina.out
、localhost_access_log.*.txt
),分析錯誤日志(如SEVERE
級別)和訪問日志,定位性能瓶頸或安全問題??赏ㄟ^logrotate
工具實現日志輪轉,避免日志文件過大。
及時更新Tomcat至最新穩定版本(修復已知漏洞),并同步更新Java環境和依賴庫(如數據庫驅動),提升系統安全性和穩定性。