第一章 Tomcat的開幕式html
1.Tomcat是以Java編寫的,這表示在可以構建和測試它以前,必須安裝最新的、完整的JAVA運行環境(JRE,Java runtime)。java
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)中設定的默認端口,並輸出中止信息。linux
3.java -Xmx=256M MyProg 執行MyProg的類文件,並給整個Java運行時進程分配最大256M的內存。
set JAVA_OPTS="-Xmx256M" #MS-DOSweb
4.8080端口是Tomcat HTTP服務器的默認端口,8005端口是Tomcat中止服務器的默認端口shell
5.若是讓Tomcat在控制窗口中運行,則可使用Ctrl+C中斷它,Tomcat會捕捉到中斷信號並中止運行。數據庫
6.不一樣的Tomcat實例(JVM)必須使用不一樣的HTTP端口,並且在server.xml文件中,server及connector元素中的每個端口號也必須不一樣。apache
2012.06.27 20:45windows
第二章 配置Tomcatapi
1.Tomcat內嵌的Web服務器是一個高性能的HTTP1.1服務器。tomcat
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