Tomcatl介紹
Tomcat是Apache 軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun 和其他一些公司及個人共同開發而成。由于有了Sun 的參與和支持,最新的Servlet 和JSP 規范總是能在Tomcat 中得到體現,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 規范。因為Tomcat 技術先進、性能穩定,而且免費,因而深受Java 愛好者的喜愛并得到了部分軟件開發商的認可,成為目前比較流行的Web 應用服務器。
Tomcat組件及其特點
tomcat組件
servlet(應用程序或者容器)是java提供的用于開發web服務器應用程序的一個組件,運行在服務器端,有servlet用于生成動態頁面內容,servlet是平臺立的java類,編寫一個servlet,實際上就是安裝servlet規范編寫一個java類
配置Tomcat虛擬主機和優化
案例需求
1)部署 Tomcat 服務。
2)配置虛擬主機。
3)Tomcat 優化。
4)常見錯誤分析及處理。
案例實現思路
1)安裝 Tomcat 需要的環境。
2)安裝 Tomcat 服務。
3)配置虛擬主機。
4)客戶端安裝壓測軟件進行壓測并調優。
5)常見錯誤說明。
實驗過程
1.下載并安裝 JDK,部署Tomcat服務
詳情可查看:https://blog.51cto.com/14557905/2464661
2.查看 Tomcat 安裝后目錄結構
1)bin
存放啟動和關閉 Tomcat 的腳本文件, 比較常用的是 catalina.sh、startup.sh、shutdown.sh 三個文件。
2)conf
存放 Tomcat 服務器的各種配置文件,比較常用的是 server.xml、context..xml、tomcat-users.xml、web.xml 四個文件。
3)lib
存放 Tomcat 服務器的 jar 包,一般不作任何改動,除非連接第三方服務,比如 redis, 那就需要添加相對應的 jar 包。
4)logs
存放 Tomcat 日志。
5)temp
存放 Tomcat 運行時產生的文件。
6)webapps
存放項目資源的目錄。
7)work
Tomcat 工作目錄,一般清除 Tomcat 緩存的時候會使用到。
二、虛擬主機配置
可能有時候公司會有多個項目需要運行,那么肯定不可能是一臺服務器上運行多個Tomcat 服務,這樣會消耗太多的系統資源。此時,就需要使用到 Tomcat 虛擬主機。例如現在新增兩個域名 www.test.com 和 bbs.test.com,希望通過這兩個域名訪問到不同的項目內容。
1.創建 www 和 bbs 項目目錄和文件
[root@localhost ~]# mkdir /usr/local/tomcat/webapps/www
[root@localhost ~]# echo "This is www page\!" > /usr/local/tomcat/webapps/www/index.jsp
[root@localhost ~]# mkdir /usr/local/tomcat/webapps/bbs
[root@localhost ~]# echo "This is bbs page\!" > /usr/local/tomcat/webapps/bbs/index.jsp
2.修改 Tomcat 主配置文件
修改 Tomcat 主配置文件/usr/local/tomcat/conf/server.xml,在</Host>下面增加如下內容:
//關于 www.test.com 的虛擬主機配置
<Hostname="www.test.com"appBase="/usr/local/tomcat/webapps"
unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/www"
path="" reloadable="true" />
</Host>
//關于 bbs.test.com 的虛擬主機配置
<Host name="bbs.test.com" appBase="/usr/local/tomcat/webapps"
unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/bbs"
path="" reloadable="true" />
</Host>
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh
3.測試
客戶端綁定兩個域名需要寫入本機 hosts,Tomcat 默認端口是 8080。
192.168.9.236 www.test.com
192.168.9.236 bbs.test.com
三、Tomcat 優化
Tomcat 的缺省配置并不適合生產環境,它會頻繁出現假死現象需要重啟,只有通過不斷壓測優化才能讓它最高效率穩定的運行。優化主要有三方面,分為操作系統優化(內核參數優化),Tomcat 配置文件參數優化,Java 虛擬機(JVM)調優。其中最難理解的就是 jvm調優。
1.Tomcat 配置文件參數優化
關于 Tomcat 主配置文件 server.xml 里面很多默認的配置項,但并不能滿足業務需求, 常用的優化相關參數如下。
如果已經對代碼進行了動靜分離,靜態頁面和圖片等數據就不需要 Tomcat 處理了,那么也就不需要在 Tomcat 中配置壓縮了。因為這里只有一臺 Tomcat 服務器,而且壓測的是Tomcat 首頁,會有圖片和靜態資源文件,所以這里啟用壓縮。
三、以上是一些常用的配置參數,還有好多其它的參數設置,還可以繼續深入的優化,HTTP Connector 與 AJP Connector 的參數屬性值,可以參考官方文檔的詳細說明進行學習。鏈接 地 址 http://tomcat.apache.org/tomcat-9.0-doc/config/http.html , 下 面 開 始 對Tomcat 配置文件優化進行前后的對比。
壓測腳本里設置的是 20 秒啟動 4000 個線程數,并發為 2000,超時時間是 50000 毫秒。也可以適當的根據自己的需求進行修改。為了不那么復雜,從壓測結果看只關注聚合報告, 聚合報告只關注 Average、90% Line、Error%這三列,因為壓測 Tomcat 首頁壓力不會太大, 所以 Error 都是為 0 屬于正常。先看一組優化前(默認的配置)壓測截圖
打開 Tomcat 主配置文件 server.xml,找到默認配置:
<Connector port="8080" protocol="HTTP/11.1" connectionTimeout="20000"
redirectPort="8443" />
將默認配置做修改:
<Connector port="8080" protocol="HTTP/11.1"
connectionTimeout="20000"
redirectPort="8443" minSpareThreads="50"
enableLookups="false" disableUploadTimeout="true" acceptCount="300" maxThreads="500" processorCache="500"
URIEncoding="UTF-8"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image
/jpg,image/png"/>
重新啟動 Tomcat 服務器,jmeter 還是繼續保持同樣的參數進行壓測,優化后壓測截圖
常見錯誤說明
1.java.lang.OutOfMemoryError: Java heap space——JVM Heap(堆)溢出
JVM 在啟動的時候會自動設置 JVM Heap 的值,其初始空間(即-Xms)是物理內存的 1/64,最大空間(-Xmx)不可超過物理內存??梢岳?JVM 提供的 -Xmn -Xms -Xmx 等選項可進行設置。Heap 的大小是 Young Generation 和 Tenured Generaion 之和。在 JVM 中如果 98% 的時間是用于 GC,且可用的 Heap size 不足 2%的時候將拋出此異常信息。
解決方法:手動設置 JVM Heap(堆)的大小。
2.java.lang.OutOfMemoryError: PermGen space——PermGen space 溢出
PermGen space 的全稱是 Permanent Generation space,是指內存的永久保存區域。為什么會內存溢出,這是由于這塊內存主要是被 JVM 存放 Class 和 Meta 信息的,Class 在被 Load 的時候被放入 PermGen space 區域,它和存放 Instance 的 Heap 區域不同,sun 的GC 不會在主程序運行期對 PermGen space 進行清理。所以,如果你的 APP 會載入很多 CLASS 的話,就很可能出現 PermGen space 溢出。
解決方法:手動設置 MaxPermSize 大小。
3.java.lang.StackOverflowError——棧溢出
JVM 依然是采用棧式的虛擬機,這個和 C 與 Pascal 都是一樣的。函數的調用過程都體現在堆棧和退棧上了。調用構造函數的“層”太多了,以致于把棧區溢出了。通常來講,一 般棧區遠遠小于堆區的,因為函數調用過程往往不會多于上千層,而即便每個函數調用需要 1K 的空間(這個大約相當于在一個 C 函數內聲明了 256 個 int 類型的變量),那么棧區也不過是需要 1MB 的空間。通常棧的大小是 1-2MB 的。
通常遞歸也不要遞歸的層次過多,很容易溢出。 解決方法:修改程序。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。