本篇是《Tomcat權威指南》第二版學習筆記,Jason Brittain著,英文名是:Tomcat:The Definitive Guide,中國電力出版社,2009.9出版。
在工作中經常使用Tomcat、JBoss、Jetty等Java容器,但都不曾系統的學習總結過,本次拿出一個周末的時間,通過本書,較為系統的學習一下Tomcat,并結合互聯網的參考資料,寫下這篇學習總結,感覺還是受益良多。
關于《Tomcat權威指南》第二版這本書,是基于Tomcat 6的,翻譯不是很專業,一些計算機技術術語翻譯的不夠準確,印刷中也有一些錯別字,所以對于沒有基礎的初學者,容易被誤導,如果有一定基礎,把這本書系統看一遍,作為工具書,還是不錯的。
關于本書的原作者,是spigit.com的軟件架構師,對Tomcat作為Web服務器的性能估計較為樂觀,這個樂觀的估計沒有得到大數據量高并發系統的驗證;相反,僅僅把Tomcat作為Java容器,甚至僅僅作為開發過程Java容器,生產過程使用JBoss的案例貌似更多。
關于選擇這本書的原因,是市場上系統的講解Tomcat的書實在是少,相對來說,從系統化講解來說,這本書還不錯
# Tomcat權威指南
### Tomcat目錄結構
| bin | 存放啟動、停止服務器的腳本文件 |
|-----|-----|
| conf | 存放服務器的配置文件、最重要的是server.xml文件 |
| lib | 存放jar文件,服務器和所有的web應用程序都可以訪問 |
| logs | 存放服務器的日志文件 |
| temp | 存放Tomcat運行時的臨時文件 |
| webapps | 缺省的web應用的發布目錄,在server.xml中的“Host appBase="webapps"...”節點定義 |
| work | Tomcat的工作目錄,默認情況下把編譯JSP文件生成的servlet類文件放于此目錄下 |
### Tomcat conf目錄下的配置文件
| server.xml | Tomcat主配置文件 |
|-----|-----|
| web.xml | servlet與其他適用于整個Web應用程序的配置,必須符合servlet規范 |
| tomcat-users.xml | Tomcat的UserDatabaseRealm用于認證的默認角色、用戶及密碼清單 |
| catalina.policy | Tomcat的Java安全防護策略文件 |
| context.xml | 默認的context設置,應用于安裝了Tomcat的所有主機的所有部署內容 |
| catalina.properties | ? |
| logging.properties | ? |
### Tomcat lib目錄下的jar包作用
| **jar** | **作用** | **Tomcat6** | **Tomcat7** | **Tomcat8** |
|-----|-----|-----|-----|-----|
| annotation-api.jar | JavaEE annotations classes | √ | √ | √ |
| catalina.jar | Implementation of the Catalina servlet container portion of Tomcat | √ | √ | √ |
| catalina-ant.jar | Tomcat Catalina Ant tasks | √ | √ | √ |
| catalina-ha.jar | 高可用package | √ | √ | √ |
| catalina-storeconfig.jar | ? | **×** | **×** | √ |
| catalina-tribes.jar | 組通信package | √ | √ | √ |
| ecj-4.3.1.jar | Eclipse JDT Java compiler,即Eclipse開發的Jsp編譯器,Tomcat5.5開始,開始默認使用這個編譯器編譯Jsp頁 | √ | √ | √ |
| el-api.jar | expression language | √ | √ | √ |
| jasper.jar | Tomcat Jasper JSP Compiler and Runtime,Jasper 2 JSP Engine to implement the JavaServer Pages 2.1 specification | √ | √ | √ |
| jasper-el.jar | Tomcat Jasper EL implementation | √ | √ | √ |
| jsp-api.jar | 在Tomcat6/7/8中,版本分別是2.1/2.2/2.3 | √ | √ | √ |
| servlet-api.jar | 在Tomcat6/7/8中,版本分別是2.5/3.0/3.1 | √ | √ | √ |
| tomcat-api.jar | Several interfaces defined by Tomcat | **×** | √ | √ |
| tomcat-coyote.jar | Tomcat connectors and utility classes | √ | √ | √ |
| tomcat-dbcp.jar | Database connection pool implementation,based on package-renamed copy of Apache Commons Pool and Apache Commons DBCP | √ | √ | √ |
| tomcat-i18n-es.jar | Optional JARs containing resource bundles for other languages。As default bundles are also included in each individual JAR,they can be safely removed if no internationalization of messages is needed | √ | √ | √ |
| tomcat-i18n-fr.jar | ? | √ | √ | √ |
| tomcat-i18n-fa.jar | ? | √ | √ | √ |
| tomcat-jdbc.jar | An alternative database connection pool implementation,known as Tomcat JDBC pool。See documentation for more details | **×** | √ | √ |
| tomcat-jni.jar | ? | **×** | **×** | √ |
| tomcat-spdy.jar | ? | **×** | **×** | √ |
| tomcat-util.jar | Common classes used by various components of Apache Tomcat | **×** | √ | √ |
| tomcat-util-scan.jar | ? | **×** | **×** | √ |
| tomcat-websocket.jar | 在Tomcat7中這個包叫tomcat7-websocket.jar | **×** | √ | √ |
| websocket-api.jar | ? | **×** | √ | √ |
### Tomcat部署的兩種方法
(1)server.xml Context部署:在server.xml文件中增加一個Context元素
(2)Context XML片段文件部署:在Tomcat的CATALINA_HOME/conf/[EngineName]/[Hostname]目錄中增加一個新的Context XML片段文件
### Tomcat性能優化
### 性能指標:吞吐量
Responsetime、CpuLoad、MemoryUsage
### 壓力測試工具
a、Apache Benchmark(ab,內含在Apache httpd Web服務器的發行版中,網址為:http://httpd.apache.org) ? ?ab -k -n 100000 -c 149 http://ip:8080
b、Siege(http://www.joedog.org/JoeDog/Siege) siege -b -r 671 -c 149 tomcathost:8080
c、Apache Jakarta的JMeter(http://jakarta.apache.org/jmeter),據說易用、靈活、圖形化、報表性強、但是單純測試“每秒鐘請求并完成非常大量HTTP請求”方面,不如以上兩種
### Tomcat連接器
Tomcat提供了3種不同的服務器設計實現方法,JIO(java.io):這是Tomcat默認的連接器實現辦法,也成為“Coyote”,是使用java.io核心網絡類的純Java TCP實現;APR(Apache Portable Runtime),使用了libtcnative庫(c語言編寫的),適用于HTTPS鏈接;NIO(java.nio),非阻塞的方式,更少的線程
### Apache連接器
mod_jk、mod_proxy_ajp、mod_proxy_http
### JVM優化
所有的Java相關應用的JVM調優,其原理都是一致的,請參考這里:http://blog.csdn.net/puma_dong/article/details/12529905#t4
### Tomcat優化
a、禁用DNS查詢,在Connection節點中,增加enableLookups="false",這個設置會導致getRemoteHost()只能獲取到IP地址;
b、調整線程數,maxThreads默認是200,示例:
<Connector port="80" protocol="HTTP/1.1" maxThreads="1000" minSpareThreads="200" maxSpareThreads="800" acceptCount="800" connectionTimeout="20000" enableLookups="false" redirectPort="8443"/>
**maxThrads和acceptCount,這兩個值如何起作用,請看下面三種場景:**
a、接受一個請求,此時tomcat啟動的線程數沒有到達maxThreads,tomcat會啟動一個線程來處理此請求;
b、接受一個請求,此時tomcat啟動的線程數已經到達maxThreads,tomcat會把此請求放入等待隊列,等待空閑線程;
c、接受一個請求,此時tomcat啟動的線程數已經到達maxThreads,等待隊列中得請求個數也達到了acceptCount,此時tomcat會直接拒絕此次請求,返回connection refused
**maxThreads如何配置:**
一般的服務器操作都包含量方面:1計算(主要消耗cpu),2等待(io、數據庫等);
第一種極端情況,如果我們的操作是純粹的計算,那么系統響應時間的主要限制就是cpu的運算能力,此時maxThreads應該盡量設的小,降低同一時間內爭搶cpu的線程個數,可以提高計算效率,提高系統的整體處理能力;
第二種極端情況,如果我們的操作純粹是IO或者數據庫,那么響應時間的主要限制就變為等待外部資源,此時maxThreads應該盡量設的大,這樣才能提高同時處理請求的個數,從而提高系統整體的處理能力。此情況因為tomcat同時處理的請求量會比較大,所以需要關注一下tomcat的虛擬機內存設置和linux的open file限制;
如果maxThreads設置過大,比如5000,由于cpu就需要在多個線程之間來回切換,以保證每個線程都會獲得cpu時間,即通常我們說的并發執行,反而降低了cpu效率,直接導致響應時間急劇增加,所以maxThreads的配置絕對不是越大越好;
現實應用中,我們的操作都會包含以上兩種類型(計算、等待),所以maxThreads的配置并沒有一個最優值,一定要根據具體情況來配置;
最好的做法是:在不斷測試的基礎上,不斷調整、優化,才能得到最合理的配置。
**acceptCount如何配置:**
可以設置跟maxThreads一樣大,這個值應該是主要根據應用的訪問峰值與平均值來權衡配置的;
如果設的較小,可以保證接受的請求較快響應,但是超出的請求可能就直接被拒絕;
如果設的較大,可能就出現大量的請求超時的情況,因為我們系統的處理能力是一定的。
### Tomcat和Apache的區別
(1)apache:是Web服務器,本身只支持靜態網頁,但可以通過插件擴展支持PHP、Java等
(2)tomcat:是應用服務器,它只是一個servlet容器,是Apache的擴展,較少直接用作Web服務器
### Tomcat雞肋功能
(1)Tomcat支持多實例部署,即在一個Tomcat安裝的基礎上,通過配置多個實例,達到bin/lib等目錄共享,及版本統一的目的,實際如果想多實例,直接在生產中拷貝兩套Tomcat反而更簡單快捷
(2)Tomcat Admin管理Web界面,實際的生產中,不會用這個功能,并且應該是把這些功能從生產部署中刪除的,達到安全的目的
(3)熱部署,實際的生產中,更多的是冷卻部署
### 總結
### 原書作者觀點
原書作者的觀點是Tomcat處理靜態頁面和圖片的性能也是優于Apache的,他是通過一個不完全的測試案例:150個線程內(Tomcat默認運行的線程數),對小文件和小圖片進行壓力測試得出這個結論,所以他推崇“既把Tomcat作為Java容器,也直接用作Web服務器”,在中小應用中,這可能沒有問題,但是在大型/超大型互聯網應用中,Apache/Nginx的性能是被廣泛證明了的,Apache/Nginx+Tomcat的組合依然是更優的選擇。
### 關于本書
關于Ant的內容,沒有去看,我用的是Maven;
關于Apache的內容,沒有去看,我用的是Nginx;
關于權限相關,沒有去看,應用場景很少,權限還是整體交給運維的好;
關于集群,沒有去看,個人不覺得Tomcat本身的集群有什么用。
### 學習總結
在工作中經常使用Tomcat、JBoss、Jetty等Java容器,但都不曾系統的學習總結過,本次拿出一個周末兩天的時間,通過本書,較為系統的學習一下Tomcat,并結合互聯網的參考資料,寫下這篇學習總結,感覺還是受益良多。
關于《Tomcat權威指南》第二版這本書,是基于Tomcat6的,翻譯不是很專業,一些計算機技術術語翻譯的不夠準確,印刷中也有一些錯別字,所以對于沒有基礎的初學者,容易被誤導,如果有一定基礎,把這本書系統看一遍,作為工具書,還是不錯的。
關于本書的原作者,是spigit.com的軟件架構師,對于Tomcat作為Web服務器的性能評估較為樂觀,這個樂觀的估計沒有得到大數據量高并發系統的驗證;相反,僅僅把Tomcat作為Java容器,似乎更為妥當。
# Tomcat日志
Tomcat日志,默認情況下,在啟動的時候,會產生當天的文件,比如,catalina.2014-08-14.log,但是啟動完畢后,之后的控制臺日志就只往catalina.out文件里面寫了,為了每天產生一個日志,有多種方式:
1、官方網站:http://tomcat.apache.org/tomcat-7.0-doc/logging.html
2、網上多有介紹使用cronolog進行切割的方式
3、下面介紹配置Solr時,使用的Log4j的配置方式
把jcl-over-slf4j-1.6.6.jar、jul-to-slf4j-1.6.6.jar、log4j-1.2.16.jar、slf4j-api-1.6.6.jar、slf4j-log4j12-1.6.6.jar、log4j.properties 6個文件放在Tomcat安裝目錄/lib下面即可產生每天一個的cata.yyyy-mm-dd.log日志文件,log4j.properties內容如下(這個文件實際是在:\solr-4.9.0\example\resources 目錄下面的):
~~~
# Logging level
log4j.rootLogger=INFO, file, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n
#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9
#- File to log to and log format
log4j.appender.file.File=logs/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n
~~~
- 前言
- Java之旅--如何從草根成為技術專家
- 《深入理解Java虛擬機》學習筆記
- 《Spring3.X企業應用開發實戰》學習筆記--IoC和AOP
- 《Tomcat權威指南》第二版學習筆記
- Java之旅--多線程進階
- Java之旅--Web.xml解析
- 《Spring3.X企業應用開發實戰》學習筆記--DAO和事務
- 《Spring3.X企業應用開發實戰》學習筆記--SpringMVC
- Java之旅--定時任務(Timer、Quartz、Spring、LinuxCron)
- Spring實用功能--Profile、WebService、緩存、消息、ORM
- JDK框架簡析--java.lang包中的基礎類庫、基礎數據類型
- JDK框架簡析--java.util包中的工具類庫
- JDK框架簡析--java.io包中的輸入輸出類庫
- Java之旅--通訊
- Java之旅--XML/JSON
- Java之旅--Linux&amp;java進階(看清操作系統層面的事)
- Java之旅--硬件和Java并發(神之本源)
- Java之旅--設計模式
- jetty