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的支持
- 使⽤ JDK 中的 keytool⼯具⽣成免費的祕鑰庫⽂件(證書)
keytool -genkey -alias lagou -keyalg RSA -keystore lagou.keystore
- 配置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>
- 訪問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默認改變了雙親委派機制
- 首先從Bootstrap ClassLoader加載指定的類
- 如果未加載到,從/WEB-INF/classes加載
- 如果未加載到,從/WEB-INF/lib/*.jar 加載
- 如果未加載到,則依次從AppClassLoader、Common、Shared加載
Tomcat性能優化
Tomcat的優化主要從兩個方面:
- JVM虛擬機優化
- Tomcat自身的配置優化
對於JVM的虛擬機優化,這裏不做過多贅述,主要關注Tomcat配置的優化
Tomcat配置優化
- 調整tomcat線程池
- 調整tomcat連接器設置
參數 | 說明 |
---|---|
maxConnections | 最⼤連接數,當到達該值後,服務器接收但不會處理更多的請求, 額外的請求將會阻塞.可通過ulimit -a 查看服務器限制。對於CPU要求更⾼(計算密集型)時,建議不要配置過⼤ ; 對於CPU要求不是特別⾼時,建議配置在2000左右(受服務器性能影響)。 當然這個需要服務器硬件的⽀持 |
maxThreads | 最大線程數 |
acceptCount | 最大排隊等待數,當服務器接收的請求數量到達maxConnections,此時tomcat會將後面的請求放入隊列中等待,acceptCount指的就是隊列的大小。 |
- 禁用AJP連接器
- 調整IO模式
Tomcat8之前的版本默認是BIO,Tomcat8之後的版本默認使用的是NIO模式
- 動靜分離
可以使用Nginx + Tomcat 相結合的部署方案,Nginx負責靜態資源訪問,Tomcat負責Jsp等動態資源訪問。(因爲Tomcat不擅長處理靜態資源)