Tomcat高階特性及效能調優

女友在高考發表於2021-12-25

Tomcat對Https的支援

HTTPS簡介

Https,是以安全為目標的Http通道,在Http的基礎上通過傳輸加密和身份認證保證了傳輸的安全性。HTTPS在HTTP的基礎上加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。

HTTPS和HTTP的主要區別

  • HTTPS協議使用時需要到電子商務認證授權機構申請SSL證照
  • HTTP預設是8080埠,HTTPS預設8443埠
  • HTTPS是具有SSL加密的安全性傳輸協議,對資料的傳輸加密
  • HTTP的連線是無狀態的,不安全的;HTTPS協議是SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比HTTP協議安全

Tomcat對HTTPS的支援

  1. 使⽤ JDK 中的 keytool⼯具⽣成免費的祕鑰庫⽂件(證照)

keytool -genkey -alias lagou -keyalg RSA -keystore lagou.keystore

  1. 配置conf/server.xml

certificateKeystoreFile 就是上一步生成的檔案的路徑,certificateKeystorePassword是上一步輸入的金鑰

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" schema="https" secure="true" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="d:/apache-tomcat-8.5.32/lagou.keystore"
                         type="RSA" certificateKeystorePassword="123456"/>
        </SSLHostConfig>
    </Connector>
  1. 訪問https://localhost:8443/測試

Tomcat類載入機制

我們先來回顧一下Java的雙親委派機制

如一個Hello.class檔案,不考慮自定義載入器,首先會在AppClassLoader中檢查是否已經載入過,如果載入過就不載入了。如果沒有載入過,就會拿到父載入器,那麼父載入器(ExtClassLoader)就會檢查是否載入過,如果沒有,就再往上,讓BootStrapClassLoader檢查是否載入過。

如果還是沒有,因為他的上面已經沒有父載入器了,那麼他就開始自己載入,如果能載入,他就自己載入。不能載入,就下沉到子載入器去載入,一直到最底層,如果沒有類載入器能載入就丟擲異常ClassNotFoundException。

而Tomcat為了實現同一個tomcat中,webapps下部署了兩個應用,要使這兩個應用隔離,就算兩個應用裡有相同全路徑的兩個類,也要分別都被載入,且互不能訪問。這樣它就違背了雙親委派機制。

Tomcat類載入器圖:

  • BootstrapClassLoader和ExtClassLoader的作用不變
  • AppClassLoader正常情況載入的是CLASSPATH下的類,但是Tomcat的啟動指令碼並未使用該變數,而是載入tomcat啟動的類,比如bootstrap.jar,通常在catalina.sh中指定,位於CATALINA_HOME/bin下面
  • Common類載入器載入Tomcat的一些通用的類,位於CATALINA_HOME/lib下,如servlet-api.jar
  • Catalina ClassLoader用於載入伺服器內部可見類,這些類應用程式不能訪問
  • Shard ClassLoader用於載入應用程式共享類
  • WebAppClassLoader,每個應用程式都有一個獨一無二的WebApp ClassLoader,用於載入應用程式/WEB-INF/classes和WEB-INF/lib下的類

tomcat8.5預設改變了雙親委派機制

  1. 首先從Bootstrap ClassLoader載入指定的類
  2. 如果未載入到,從/WEB-INF/classes載入
  3. 如果未載入到,從/WEB-INF/lib/*.jar 載入
  4. 如果未載入到,則依次從AppClassLoader、Common、Shared載入

Tomcat效能優化

Tomcat的優化主要從兩個方面:

  1. JVM虛擬機器優化
  2. Tomcat自身的配置優化

對於JVM的虛擬機器優化,這裡不做過多贅述,主要關注Tomcat配置的優化

Tomcat配置優化

  1. 調整tomcat執行緒池

  1. 調整tomcat聯結器設定
引數 說明
maxConnections 最⼤連線數,當到達該值後,伺服器接收但不會處理更多的請求, 額外的請求將會阻塞.可通過ulimit -a 檢視伺服器限制。對於CPU要求更⾼(計算密集型)時,建議不要配置過⼤ ; 對於CPU要求不是特別⾼時,建議配置在2000左右(受伺服器效能影響)。 當然這個需要伺服器硬體的⽀持
maxThreads 最大執行緒數
acceptCount 最大排隊等待數,當伺服器接收的請求數量到達maxConnections,此時tomcat會將後面的請求放入佇列中等待,acceptCount指的就是佇列的大小。
  1. 禁用AJP聯結器

  1. 調整IO模式

Tomcat8之前的版本預設是BIO,Tomcat8之後的版本預設使用的是NIO模式

  1. 動靜分離

可以使用Nginx + Tomcat 相結合的部署方案,Nginx負責靜態資源訪問,Tomcat負責Jsp等動態資源訪問。(因為Tomcat不擅長處理靜態資源)

相關文章