《Tomcat權威指南》讀書筆記

2012.06.26 21:25

第一章 Tomcat的開幕式

1.Tomcat是以Java編寫的,這表示在能夠構建和測試它之前,必須安裝最新的、完整的JAVA運行環境(JRE,Java runtime)。

2.Catalina Tomcat的主要腳本,它會執行java命令以調用Tomcat的啓動與停止類。
   shutdown 運行catalina stop以停止Tomcat運行
   startup 運行catalina start以啓動Tomcat運行
   執行catalina時,必須附帶一個參數:最常用的是start、run及stop。當以start調用catalina(與調用startup一樣)時,它會啓動Tomcat,並將標準輸出與錯誤流導出到$TOMCAT_HOME/logs/catalina.out文件中。參數run會讓Tomcat保留當前的標準輸出與錯誤流(如控制檯窗口)(即在當前的控制檯顯示標準輸出與錯誤流。同時參數run也會將標準輸出與錯誤流導出到$TOMCAT_HOME/logs/catalina.out文件中。)。當您從終端機執行並想看到啓動時的輸出時,這會有幫助。如果使用catalina 及start選項,或調用startup腳本而非使用參數run,那麼您會在控制檯上看到前幾行Using...;其餘的輸出信息則被重定向到catalina.out的日誌文件中。shutdown腳本會調用stop參數的catalina,它會讓Tomcat連接於Server元素(element)中設定的默認端口,並輸出停止信息。

3.java -Xmx=256M MyProg 執行MyProg的類文件,並給整個Java運行時進程分配最大256M的內存。
set JAVA_OPTS="-Xmx256M" #MS-DOS


4.8080端口是Tomcat HTTP服務器的默認端口,8005端口是Tomcat停止服務器的默認端口


5.如果讓Tomcat在控制窗口中運行,則可以使用Ctrl+C中斷它,Tomcat會捕捉到中斷信號並停止運行。


6.不同的Tomcat實例(JVM)必須使用不同的HTTP端口,而且在server.xml文件中,server及connector元素中的每一個端口號也必須不同。

2012.06.27 20:45

第二章 配置Tomcat

1.Tomcat內嵌的Web服務器是一個高性能的HTTP1.1服務器。


2.重定向Web應用程序的目錄:情況一,更新安裝的Tomcat;情況二:運行一個以上的Tomcat實例

   爲了安裝一份Tomcat發行版,但同時運行兩個以上的不同配置的Tomcat實例,必須讓每個JVM實例的文件相互分開。一般在使用Tomcat時,服務器會從conf及webapps目錄中讀入配置文件,並將文件寫入logs、temp與work目錄,當然一些jar文件和class文件需要從服務器公共目錄樹中加載。這表示爲了讓多個實例都能運行,每一個Tomcat的實例都必須有自己的目錄集,且它們不能共享兩個不同的已配置的Tomcat JVM實例。


方法:將CATALINA_HOME環境變量設置爲已安裝Tomcat二進制發行版的路徑下,且必須將CATALINA_BASE的環境變量設置成與存儲JVM實例文件(由您自己生成)不相同的路徑。設置好這些變量後再啓動Tomcat,它就會使用您在CATALINA_BASE中定義的文件進行運行,隨後再使用CATALINA_HOME中的發行版。

設置環境變量CATALINA_BASE爲F:\working\tomcat\apache-tomcat-6.0.35-instance1(Tomcat的實例自己的目錄集,包含conf和webapps目錄)

CATALINA_HOME爲F:\working\tomcat\apache-tomcat-6.0.35(已安裝Tomcat二進制發行版的路徑)


Tomcat的這一內嵌特性允許您使Tomcat與您的文件分開。

注:Tomcat的環境變量 

CATALINA_BASE 設定Tomcat安裝樹定製或可寫部分的基本目錄,如logging文件、work目錄、Tomcat的conf目錄及webapp目錄。是CATALINA_HOME的別名。默認值是Tomcat安裝目錄

CATALINA_HOME 此爲Tomcat靜態(只讀)部分的基本目錄,如Tomcat庫文件和命令行腳本。默認值是Tomcat安裝目錄

當您將自己的文件與Tomcat發行版文件分開後管理後,升級Tomcat會變得十分容易,因爲您可以用新的目錄取代整個Tomcat發行版文件的目錄,而無須擔心會擾亂自己的任何文件。唯一的例外是新版的Tomcat與之前的Tomcat實例文件不兼容(這是非常罕見的情形)。當您在新的Tomcat版本上啓動Web應用程序時,一定要檢查日誌文件,以便了解是否有問題發生。


3.從8080改變端口號

在默認安裝過程中,Tomcat被配置爲監聽端口8080,而不是更常用的Web服務器端口號80。這是明智的選擇,因爲默認端口80通常已處於在用狀態,且在Linux、Solaris、BSD等非Windows等操作系統上,打開網絡服務包監聽默認端口80需要特殊的root權限。但在多數情況下,讓Tomcat運行在80端口上仍然有意義,而不是使用默認的8080端口。爲什麼?

4.Java VM配置

過度嚴格的內存設置要麼使Tomcat運行很慢,要麼報OutOfMemoryError的錯誤信息,使工作不正常。內存設置過大,要麼因不能平均分配如此大量的內存而無法啓動JVM,要麼能啓動正常,但卻耗用了超出所需的過量計算機內存。

以小的和大的啓動堆棧內存配置Tomcat JVM,都會引發網頁響應時間超過Java VM堆棧的最大值的某種問題(如果需要堆棧也跟着增長)。因爲Tomcat正在提供響應時會佔用大量的時間重新分配內存,所以如果您不希望性能出現類似的問題,一定要讓-Xms和-Xmx開關值就是所需內存的大小,從而保證JVM在操作過程中從不需要重新分配堆棧內存。

通過 JAVA_OPTS進行設置,以空格分開

如果您的操作系統沒有安裝圖形化軟件,您最好設置-Djava.awt.headless=true

5.管理領域、角色及用戶

不管哪種安全防護類型,都使用領域(real)的組來管理用戶和密碼。

在Tomcat的conf/server.xml文件中的領域配置,以及Web應用程序的WEB-INF/web.xml文件中的<security-constraint>,分別定義瞭如何存儲用戶與角色信息,及如何對webapp的用戶進行授權。

UserDatabaseRealm是從靜態文件加載到內存中的,且直到Tomcat停止後才從內存中清除。換句話說,權限文件只會在啓動時讀入一次。在UserDatabaseRealm中分配權限的默認文件爲$CATALINA_HOME/conf目錄中的tomcat-users.xml

6.容器管理的安全防護

Tomcat支持四種容器管理的安全防護:

基本驗證(web.xml文件中的auth-method元素設爲BASIC),通過HTTP驗證,需要提供base64編碼文本的用戶口令

摘要驗證(web.xml文件中的auth-method元素設爲DIGEST),通過HTTP驗證,需要提供摘要編碼字符串的用戶口令

表單驗證(web.xml文件中的auth-method元素設爲FORM),在網頁的表單上要求提供用戶密碼

Client-cert驗證(web.xml文件中的auth-method元素設爲CLIENT-CERT),以客戶端數字證書來確認用戶的身份

7.單次簽名(Single Sign-On)

Tomcat的“單次簽名”功能可以讓用戶只需證明身份一次,就可以訪問虛擬主機上加載的所有Web應用程序。如欲使用這個功能,您只需在主機層加入SingleSignOn value元素,在存儲的Tomcat的server.xml文件中。

8.Servlet自動重載

在默認情況下,當Tomcat發現servlet的類文件已被修改時,它會自動重載此servlet。爲了實現這一功能,Tomcat必須週期性地檢查每個servlet的修改時間。當已完成servlet的調試,並不再改變時,這會消耗許多不必要的文件系統資源。

如玉關閉此功能,只需在Web應用程序的Context元素(在web.xml中)中設定reloadable屬性,並重啓Tomcat就可以了。一旦完成此工作,您還可以使用Manager應用程序在Context中重新加載servlet類。

2012.06.28 16:11

第三章 在Tomcat中部署Servlet與JSP Web應用程序

1.Servlet背後的意義是不啓動新進程而使用Java簡單但功能強大的多線程以響應請求。(所有對CGI腳本的HTTP請求,意味着操作系統都必須產生及執行新的進程)

2.Tomcat的配置文件總是稱Web應用程序爲“context”。Tomcat的主配置文件server.xml有一個叫做Context的XML元素,代表了Web應用程序的配置。在5.0.x和更高的版本中,context XML片段文件必須駐留在CATALINA_HOME/conf/[EngineName]/[Hostname]/目錄樹中。

3.如果您希望進行熱部署,那麼除了熱部署本身外,您大概不希望Tomcat在啓動時部署Web應用程序,因此您還應該在Host上設置deployOnStartup="false"。如果不顯示的這樣設置,那麼您的Web應用程序將每次都被部署兩次:一次是“啓動部署”,第二次是熱部署。如果採用編輯server.xml文件的方法設置這些屬性,就需要重啓Tomcat,但是,如果使用Host Manager Web應用程序只在內存中設置這些屬性,那麼就不必重啓Tomcat了。

4.將Web應用程序部署到Tomcat中可以使用兩種方式:解包目錄或WAR文件。筆者建議您,在大部分情況下都用解包的webapp目錄進行部署,因爲您可以檢查、修改、移動單個資源。而對於工作於Web應用程序上的人而言,本地shell用戶的安全防護是一個大問題,您最好將Web應用程序部署爲一個WAR文件,從而對惡意篡改而言,只需監視一個文件就可以了。

5.Host Manager Web應用程序

Host Manager Web應用程序是Tomcat自帶的Tomcat專用Web應用程序,在Tomcat正運行的時候,該程序允許用戶動態創建主機。運行http://localhost:8080/host-manager/html以訪問Host Manager。要想登陸該管理器,必須像Admin Web應用程序那樣,在CATALINA_HOME/conf/tomcat-users.xml文件中增加一個admin角色。然後重啓Tomcat。注:當用Host Manager Web應用程序增加主機時,對主機配置所增加或修改的內容都不被存儲到磁盤上。在Tomcat保持運行狀態時,這些新增或修改的配置只存在於內存中。

6.部署Servlet

通過在WEB-INF/web.xml文件中提供servlet-mapping元素,可以設定Servlet所對應的URI。如果想要提供另一種對應方式,將任何初始化參數傳入servlet,設定在啓動時的加載順序等,則必須在描述文件中列出servlet。

<servlet>
  <servlet-name>InitParams</servlet-name>
  <servlet-class>InitParams</servlet-class>
  <init-param>
     <param-name>myParm</param-name>
     <param-value>A param</param-value>
  </init-param>
  <load-on-startup>25</load-on-startup>
</servlet>

7.創建歸檔文件(WAR)

cd c:\myhome\my-webapp

c:\myhome\my-webapp> jar cvf c:\temp\my-webapp.war .


2012.06.28 20:25

第四章 Tomcat的性能調校

建議一:將負載測試軟件的機器與運行Tomcat的機器分開。

建議二:讓負責測試的機器與運行Tomcat的機器之間通信隔離。在測試機器與模擬實際的在線服務器之間使用交換機或hub。

1.測試負載的工具,其主要的作法是按一定(大量)次數,請求Web服務器一種或多種資源,並計算出實際所佔用的時間或每秒可以訪問該網頁的次數。常用的工具有:Apache Benchmark(ad)、Siege、Apache Jakarta 的JMeter和Faban。

JMeter不能像ad和siege所做的那樣,每秒鐘請求並完成那麼多次HTTP請求。如果您不是爲了不設法找出您的Tomcat能每秒響應多少次請求,JMeter是最好不過的選擇了。

在相同的硬件、Tomcat版本和相同的基準調校下,JMeter報告的每秒請求數明顯低於ab和siege。這證實了JMeter的HTTP客戶端比ab和siege的客戶端要慢。您可以使用JMeter查明Web應用程序、Tomcat安裝或JVM是否發生了變化,Web網頁響應耳朵時間是快了還是慢了,但不能是JMeter決定服務器能成功服務的最大請求數,因爲JMeter的HTTP客戶端顯得比Tomcat的服務器模式要慢。

如果您正在尋找基於命令行的基準調校工具,那麼採用ab就很不錯。(Apache httpd)

ab -k -n 100000 -c 149 http://tomcathost:8080

     最多149個併發進程,要求該程序提取URL 100,000次。在基準調校測試的時候,測試客戶端請求HTTP的數量越少,測試客戶端提供的測試結果就可能越不精確,因爲在基準調校過程中,Java VM的資源回收暫停(garbage collector pauses)佔用了整個測試時間的較高比重。運行HTTP請求的總數量越多,資源回收暫停變得意義更小,而且基準調校測試結果將更能顯示Tomcat的整體性能。在默認情況下線程數是150,所以不要超過這個數。

     如果在 ab命令行中刪除-k,那麼ab與Tomcat將不使用保持聯機(keep-alive)連接,這樣處理效率更低,因爲它必須連接一個新的TCP包到Tomcat上,以執行每個HTTP請求。結果是每秒要處理的請求數更少了。而且Tomcat到客戶端的吞吐量(throughput)更小了。

Siege是一個很好的命令行Web負載測試工具。

siege -b -r 671 -c 149 tomcathost:8080

必須提供每個線程要執行的請求數(671x149=100000)。給siege提供-b開關,以告訴siege正執行基準調校測試。就像ab一樣,這使得siege的客戶端線程在請求之間不存在等待的問題。在默認情況下,siege在請求之間會等待一段可配置的時間,但在基準調校模式下並不等待。siege不能測試已打開的持續聯機(keep-alive)連接的數量。

siege每秒完成的事物(transaction)數明顯低於ab,這表明siege的基準調校結果不如ab的精確。

siege報告的吞吐量明顯低於ab報告的吞吐量。

ab完成基準調校的時間明顯超過siege完成調校時間的一半。

要獲得最優的調校結果,推薦ab。但要近似仿真實際操作員的用戶產生的Web流量進行測試時用siege。

Faban,一個新的基準調校軟件包。

20120702 16:10

2.作爲JVM品牌的主流版本之間改進性能的一般列子,主要版本的更新能給您帶來10%的性能增長。也就是說,從Java1.5JVM更新到Java1.6JVM,無需修改任何代碼,就能使您的Web運行程序提速10%。
3.最佳實踐:設置最小heap大小與最大heap大小相等。JVM提供商默認選擇分配少量內存(在Sun JVM中是32M)以啓動JVM,且如果Java應用程序需要更多內存,那麼在應用程序暫停時,JVM的heap會被重新分配爲更大。在達到heap內存大小的最高限度之前,JVM會在小內存增長過程中多次執行前面的重新分配。因爲應用程序每次都要暫停,heap大小纔會增長,那麼性能也會受到影響。如果在Tomcat正提供Web應用程序網頁時發生了這樣的事情,那麼對所有此時正在請求這一網頁的Web客戶端而言,暫停發生了,網頁響應時間將顯得比正常情況要長。爲避免這種暫停,可以設置最小heap大小與最大heap大小相等。這樣,JVM將不會在運行的時候嘗試擴展heap大小。
4.內部調校
停用DNS查詢
當Web應用程序想要記錄客戶端的信息時,它可以記錄客戶端的IP地址,或在“域名服務器”(DNS)數據中查詢真正的主機名。DNS查詢需要耗費網絡資源,並涉及多部服務器的往返響應,而這些服務器可能位於遙遠的地方,也可能尚未運行,因此導致延遲。您可以關閉DNS查詢,以避免這些延遲。之後,每當Web應用程序調用在HTTP請求對象中的getRemoteHost()方法時,它只會得到IP地址。在Tomcat的server.xml文件中,您可以在應用程序的Connector對象中設定此功能。對於常用的“java.io”(HTTP 1.1)連接器,則請使用enableLookups屬性改爲“false”,然後重啓Tomcat。關閉DNS查詢不僅可以網絡帶寬、查詢時間及內存,而且在因高網絡流量而產生大量日誌數據的網站中,還可以節省相當可觀的硬盤空間。

調整線程數
另一種對應用程序之Connector性能控制的方法是控制其處理的進程數。Tomcat默認使用線程池以便對傳入的請求提供快速響應。Java線程是一直分散流控制,自己可以與操作系統及本地內存互動。minThreads的值應該大到能夠處理最小的負載量。爲了防止流量暴增(或黑客的Dos攻擊)讓系統超出JVM的最大內存限制,而使服務器癱瘓,因此一定要設定上限。(以仿真的網絡流量進行測試)
加快JSP的編譯速度
當第一次訪問JSP時,此JSP會轉換成Java servlet的源代碼,然後在編譯成Java的bytecode。(用請求預編譯JSP)
在Web應用程序啓動時預編譯JSP
例如,如果想讓index.jsp在Web應用程序啓動時就一直被預編譯,則在web.xml文件中對該文件增加一個<servlet>標籤,如下所示:
<servlet>
   <servlet-name>index.jsp</servlet-name>
   <jsp-file>/index.jsp</jsp-file>
   <load-on-startup>0</load-on-startup>
</servlet>
這種方法的缺陷在於Web應用程序啓動的時間總是較長,因爲在Web客戶端能訪問Web應用程序之前,必須預編譯所指定的每個網頁。
在編譯時使用JspC預編譯JSP
5.容量規劃(分爲經驗式的容量規劃和企業容量規劃)
調校Tomcat在線服務器性能的另一重要部分就是容量規劃。定義:通過研究及預測網站必須處理的總網絡流量,決定可接受的服務質量及尋找滿足或超越服務器軟件需求,來預測網站所需的計算機硬件、操作系統與帶寬的活動。JVM深入:《Java Performance Tuning》

第五章 與Apache Web服務器的整合
1.將Tomcat整合到其他的Web服務器的方法有多種:
以URL連接兩個獨立Web服務器
代理從Tomcat到Apache httpd的請求
通過mod_proxy代理從Apache httpd到Tomcat的請求
其他Apache httpd連接器模塊,包括mod_jk
2.整合的優缺點:(單獨運行Tomcat)
運行Tomcat而非其他產品的Web服務器具有下列優點:
與架設Apache httpd加獨立的Tomcat相比,只架設獨立的Tomcat更容易
無需擔心Web服務器的連接器模塊
獨立的Tomcat相比於Apache httpd代理,對Tomcat的請求速度快很多
獨立Tomcat具有潛在的更好的安全防護性
較易移植到其他計算機操作系統或架構
升級更加容易
缺點:
支持Tomcat的軟件比支持Apache httpd的軟件要少
比起Apache httpd,Tomcat的知名度較差
Tomcat的Web服務器的功能比Apache httpd少

增:

1.tomcat下的catalina:Tomcat的主要腳本,它會執行java命令以調用Tomcat的啓動和停止類。
catalina 是腳本名,腳本catalina用於啓動和關閉tomcat服務器,是最關鍵的腳本。
catalina 就是Tomcat服務器使用的 Apache實現的servlet容器的 名字。
Tomcat的核心分爲3個部分: 
Web容器---處理靜態頁面; 
catalina --- 一個servlet容器-----處理servlet; 
還有就是JSP容器,它就是把jsp頁面翻譯成一般的servlet。
2.Run java -X for the list of options your VM accepts.
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size
Sun HotSpot 1.4.1使用分代收集器,它把堆分爲三個主要的域:新域、舊域以及永久域。Jvm生成的所有新對象放在新域中。
一旦對象經歷了一定數量的垃圾收集循環後,便獲得使用期並進入舊域。在永久域中jvm則存儲class和method對象。
就配置而言,永久域是一個獨立域並且不認爲是堆的一部分。 
新域比率設置成3,即新域與舊域比例爲1:3
-XX:MaxNewSize=256m"的意思就是新域的最大值是256m
將最小heap的大小與最大heap的大小設置爲相等,會減少heap的重新分配。(如果Java應用程序需要更多的內存,那麼在應用程序暫停時,JVM
的heap會被重新分配爲更大。在達到heap內存大小的最高限度之前,JVM會在小內存增長過程中多次執行前面的重新分配)
3.JNIP(java網絡加載協議): JSR-56: The Java Network Launching Protocol & API (JNLP).A main feature of the Java Network Launching Protocol 
and API technology is the ability 
to automatically download and install Java Runtime Environments onto the users machine.


5.sakai OAE(Open Academic Environment)
6.查看環境變量的值:echo %JAVA_HOME%
7.後來較新版本的JDK(例如我使用的JDK1.6)安裝完不會自動登記環境變量JAVA_HOME,JRE_HOME。所以需要手動設置環境變量:
JDK環境變量配置:
變量名:JAVA_HOME  變量值:
變量名:classpath  變量值:.;%JAVA_HOME%\lib\dt.jar;
並在path里加入%JAVA_HOME%\bin
Tomcat環境變量配置:
變量名:CATALINE_BASE    變量值:tomcat的路徑
變量名:CATALINE_HOME    變量值:tomcat的路徑
變量名:classpath中加入%CATALINE_HOME%\lib\servlet-api.jar
在path中加入%CATALINE_HOME%\bin


1.中間件(middleware)現在是在與操作系統,數據庫並列的3大基礎軟件之一。
中間件處於操作系統軟件與用戶的應用軟件之間。中間件在操作系統、網絡和數據庫之上,
應用軟件的下層,總的作用是爲處於自己上層的應用軟件提供運行與開發環境,幫助用戶
靈活、高效地開發和集成複雜的應用軟件。
中間件的作用:
1.中間件屏蔽了底層操作系統的複雜性,使程序開發人員面對一個簡單而統一的開發環境,
減少程序設計的複雜性,將注意力集中在自己的業務上,不必再爲程序在不同系統軟件上
移植而重複工作,從而大大減少了技術上的負擔。
2.中間件帶給應用系統的,不只是開發的簡便、開發週期的縮短,也減少了系統的維護、運行和
管理的工作量。
中間件的分類:
消息中間件(Message Orient middleware:MOM)
交易中間件(Transaction Processing:TP)
對象中間件(Object Momitor)
應用服務器(Application Server)
企業級應用集成(Enterprise Application Intergration:EAI)
安全中間件(Security Middleware)
2.java -Xmx=256M MyProg 執行MyProg的類文件,並給整個Java運行時進程分配最大256M的內存。
set JAVA_OPTS="-Xmx256M" #MS-DOS
3.8080端口是Tomcat HTTP服務器的默認端口,8005端口是Tomcat停止服務器的默認端口
4.如果讓Tomcat在控制窗口中運行,則可以使用Ctrl+C中斷它,Tomcat會捕捉到中斷信號並停止運行。
5.不同的Tomcat實例(JVM)必須使用不同的HTTP端口,而且在server.xml文件中,server及connector元素中的每一個端口號也必須不同。

 

Tomcat問題解決:

1.啓動Tomcat出現:java.lang.OutOfMemoryError:PermGen space

原因:PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space中,它和存放類實例(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的應用中有很多CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web服務器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那麼就會產生此錯誤信息了。


解決方法1:

手動設置MaxPermSize大小,如果是linux系統,修改TOMCAT_HOME/bin/catalina.sh,如果是windows系統,修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
建議:將相同的第三方jar文件移置到tomcat/shared/lib目錄下,這樣可以達到減少jar 文檔重複佔用內存的目的。

解決方法2:修改eclipse.ini文件

-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m
-XX:PermSize=256M
-XX:MaxPermSize=512M

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章