WEB請求處理四:Tomcat配置實踐

#0 系列目錄#html

上篇文章《WEB請求處理三:Servlet容器請求處理》講述了Servlet容器Tomcat工做原理及請求處理過程,本章將繼續講解Tomcat配置實踐。前端

#1 Tomcat目錄結構# 要部署使用tomcat,則必須瞭解tomcat的目錄結構以及各目錄的做用。這裏以tomcat7爲例,進入tomcat安裝目錄下:java

|-- bin 執行腳本目錄;
|   |-- bootstrap.jar tomcat啓動時所依賴的一個類,在啓動tomcat時會發現Using CLASSPATH: 是加載的這個類;
|   |-- catalina-tasks.xml 定義tomcat載入的庫文件,類文件;
|   |-- catalina.bat
|   |-- catalina.sh tomcat單個實例在Linux平臺上的啓動/關閉腳本;
|   |-- commons-daemon-native.tar.gz jsvc工具,可使tomcat以守護進程方式運行,需單獨編譯安裝;
|   |-- commons-daemon.jar jsvc工具所依賴的java類;
|   |-- configtest.bat
|   |-- configtest.sh tomcat檢查配置文件語法是否正確的Linux平臺腳本;
|   |-- cpappend.bat
|   |-- daemon.sh tomcat已守護進程方式運行時的,啓動,中止腳本;
|   |-- digest.bat
|   |-- digest.sh
|   |-- setclasspath.bat
|   |-- setclasspath.sh
|   |-- shutdown.bat
|   |-- shutdown.sh tomcat服務在Linux平臺下關閉腳本;
|   |-- startup.bat
|   |-- startup.sh tomcat服務在Linux平臺下啓動腳本;
|   |-- tomcat-juli.jar
|   |-- tomcat-native.tar.gz 使tomcat可使用apache的apr運行庫,以加強tomcat的性能需單獨編譯安裝;
|   |-- tool-wrapper.bat
|   |-- tool-wrapper.sh
|   |-- version.bat
|   |-- version.sh 查看tomcat以及JVM的版本信息;
|-- conf 顧名思義,配置文件目錄;
|   |-- catalina.policy Java相關的安全策略配置文件,在系統資源級別上提供訪問控制的能力,好比:配置tomcat對文件系統中目錄或文件的讀、寫執行等權限,及對一些內存,session等的管理權限;
|   |-- catalina.properties Tomcat內部package的定義及訪問相關的控制,也包括對經過類裝載器裝載的內容的控制;Tomcat在啓動時會事先讀取此文件的相關設置;
|   |-- context.xml tomcat的默認context容器,全部host的默認配置信息;
|   |-- logging.properties Tomcat經過本身內部實現的JAVA日誌記錄器來記錄操做相關的日誌,此文件即爲日誌記錄器相關的配置信息,能夠用來定義日誌記錄的組件級別以及日誌文件的存在位置等;
|   |-- server.xml tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主組件的相關配置信息;
|   |-- tomcat-users.xml Realm認證時用到的相關角色、用戶和密碼等信息;Tomcat自帶的manager默認狀況下會用到此文件;在Tomcat中添加/刪除用戶,爲用戶指定角色等將經過編輯此文件實現;
|   |-- web.xml 爲不一樣的Tomcat配置的web應用設置缺省值的文件,遵循Servlet規範標準的配置文件,用於配置servlet,併爲全部的Web應用程序提供包括MIME映射等默認配置信息;
|-- lib 運行須要的庫文件(JARS),包含被Tomcat使用的各類各樣的jar文件。在Linux/UNIX上,任何這個目錄中的文件將被附加到Tomcat的classpath中;
|-- logs 日誌文件默認存放目錄;
|   |-- localhost_access_log.2013-09-18.txt 訪問日誌;
|   |-- localhost.2013-09-18.log 錯誤和其它日誌;
|   |-- manager.2013-09-18.log 管理日誌;
|   |-- catalina.2013-09-18.log Tomcat啓動或關閉日誌文件;
|-- temp 臨時文件存放目錄;
|   |-- safeToDelete.tmp
|-- webapps tomcat默認存放應用程序的目錄,比如apache的默認網頁存放路徑是/var/www/html同樣;
|   |-- docs tomcat文檔;
|   |-- examples tomcat自帶的一個獨立的web應用程序例子;
|   |-- host-manager tomcat的主機管理應用程序;
|   |   |-- META-INF 整個應用程序的入口,用來描述jar文件的信息;
|   |   |   |-- context.xml 當前應用程序的context容器配置,它會覆蓋tomcat/conf/context.xml中的配置;
|   |   |-- WEB-INF 用於存放當前應用程序的私有資源;
|   |   |   |-- classes 用於存放當前應用程序所須要的class文件;
|   |   |   |-- lib 用於存放當前應用程序所須要的jar文件;
|   |   |   |-- web.xml 當前應用程序的部署描述符文件,定義應用程序所要加載的servlet類,以及該程序是如何部署的;
|   |-- manager tomcat的管理應用程序;
|   |-- ROOT 指tomcat的應用程序的根,若是應用程序部署在ROOT中,則可直接經過http://ip:port 訪問到;
|-- work 用於存放JSP應用程序在部署時編譯後產生的class文件;

#2 Tomcat模塊結構# 以下圖所示,前端請求被tomcat直接接收或者由前端的代理,經過HTTP,或者AJP代理給Tomcat,此時請求被tomcat中的connector接收,不一樣的connector和Engine被service組件關聯起來,在一個Engine中定義了許多的虛擬主機,由Host容器定義,每個Host容器表明一個主機,在各自的Host中,又能夠定義多個Context,用此來定義一個虛擬主機中的多個獨立的應用程序。web

Tomcat模塊結構

#3 Tomcat server.xml配置# Tomcat Server的結構圖以下:apache

Tomcat Server結構圖

##3.1 conf/server.xml配置##bootstrap

<Server port="8005" shutdown="SHUTDOWN">
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
    <Listener className="org.apache.catalina.core.JasperListener" />
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

    <!-- 全局命名資源,來定義一些外部訪問資源,其做用是爲全部引擎應用程序所引用的外部資源的定義 --> 
    <GlobalNamingResources>
        <!-- 定義的一個名叫「UserDatabase」的認證資源,將conf/tomcat-users.xml加載至內存中,在須要認證的時候到內存中進行認證 -->
        <Resource name="UserDatabase" auth="Container" 
              type="org.apache.catalina.UserDatabase" 
              description="User database that can be updated and saved" 
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
              pathname="conf/tomcat-users.xml" /> 
    </GlobalNamingResources> 
 
    <!-- 定義Service組件,同來關聯Connector和Engine,一個Engine能夠對應多個Connector,每一個Service中只能一個Engine -->
    <Service name="Catalina"> 
        <!-- 修改HTTP/1.1的Connector監聽端口爲80.客戶端經過瀏覽器訪問的請求,只能經過HTTP傳遞給tomcat -->
        <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 
     
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 
        
        <!-- 修改當前Engine,默認主機是,www.test.com -->
        <Engine name="Catalina" defaultHost="test.com"> 
  
			<!-- Realm組件,定義對當前容器內的應用程序訪問的認證,經過外部資源UserDatabase進行認證 -->     
        	<Realm className="org.apache.catalina.realm.LockOutRealm"> 
         		<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> 
       		</Realm> 
    
			<!-- 定義一個主機,域名爲:test.com,應用程序的目錄是/web,設置自動部署,自動解壓 -->
        	<Host name="test.com"  appBase="/web" unpackWARs="true" autoDeploy="true">
            	<!-- 定義一個別名www.test.com,相似apache的ServerAlias --> 
	        	<Alias>www.test.com</Alias> 
            	<!-- 定義該應用程序,訪問路徑"",即訪問www.test.com便可訪問,網頁目錄爲:相對於appBase下的www/,即/web/www,而且當該應用程序下web.xml或者類等有相關變化時,自動重載當前配置,即不用重啓tomcat使部署的新應用程序生效 -->
            	<Context path="" docBase="www/" reloadable="true" /> 
            	<!-- 定義另一個獨立的應用程序,訪問路徑爲:www.test.com/bbs,該應用程序網頁目錄爲/web/bbs --> 
            	<Context path="/bbs" docBase="/web/bbs" reloadable="true" /> 
            
				<!-- 定義一個Valve組件,用來記錄tomcat的訪問日誌,日誌存放目錄爲:/web/www/logs若是定義爲相對路徑則是至關於$CATALINA_HOME,並不是相對於appBase,這個要注意。定義日誌文件前綴爲www_access.並以.log結尾,pattern定義日誌內容格式,具體字段表示能夠查看tomcat官方文檔 -->
            	<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/www/logs" 
                	prefix="www_access." suffix=".log" 
                	pattern="%h %l %u %t "%r" %s %b" />
        	</Host> 

			<!-- 定義一個主機名爲manager.test.com,應用程序目錄是$CATALINA_HOME/webapps,自動解壓,自動部署 -->
        	<Host name="manager.test.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> 
        		<!-- 定義遠程地址訪問策略,僅容許172.23.136.*網段訪問該主機,其餘的將被拒絕訪問 -->
            	<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="172.23.136.*" /> 
            	<!-- 定義該主機的訪問日誌 --> 
            	<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/bbs/logs" 
                	prefix="bbs_access." suffix=".log" 
                	pattern="%h %l %u %t "%r" %s %b" /> 
        	</Host>
		</Engine>
	</Service>
</Server>

看上去很複雜。其實,大部分都是註釋。下面是一個簡圖說明了各組件之間的關係!後端

|-- Server
|    |-- Listener
|    |-- GlobalNamingResources
|    |    |-- Resource
|    |-- Service
|    |    |-- Connector
|    |    |-- Engine
|    |    |    |-- Realm
|    |    |    |-- Host
|    |    |    |    |-- Alias
|    |    |    |    |-- Context
|    |    |    |    |-- Value

上面列出的比較經常使用的組件元素,server.xml文件中可定義的元素很是多,包括Server, Service, Connector, Engine, Cluster, Host, Alias, Context, Realm, Valve, Manager, Listener, Resources, Resource, ResourceEnvRef, ResourceLink, WatchedResource, GlobalNameingResources, Store, Transaction, Channel, Membership, Transport, Member, ClusterListener等等。瀏覽器

由以上配置不難看出存在的一個問題。若是咱們想要對其中一個應用程序的配置作一些修改,那麼就必須從新啓動tomcat,那樣勢必就會影響到另外兩個應用程序的正常服務。所以以上配置是不適合線上使用的,所以須要將其配置爲多實例,每一個實例只跑一個獨立的應用程序,那樣咱們應用程序之間就不會在互相受到影響。可是咱們將面臨這樣一個問題,80端口只能被一個HTTP/1.1 Connector監聽,而三個tomcat實例則至少須要3個HTTP/1.1 Connector,這樣咱們就須要一個前端代理作分發處理,接收HTTP 80端口的請求,按域名經過每一個tomcat實例的AJP/1.3 Connector傳遞請求。而前端的代理選擇apache,基於這樣的思路,咱們還能夠作到tomcat的負載均衡,並且apache會將接收的HTTP超文本傳輸報文從新封裝成二進制格式經過AJP/1.3 協議傳遞給後端的tomcat處理,在效率上也是有明顯的提高。緩存

##3.2 server.xml組件元素## server.xml組件元素tomcat

  1. ** <Server>元素**

這會讓Tomcat啓動一個server實例(即一個JVM),它監聽在8005端口以接收shutdown命令。各Server的定義不能使用同一個端口,這意味着若是在同一個物理機上啓動了多個Server實例,必須配置它們使用不一樣的端口。這個端口的定義用於爲管理員提供一個關閉此實例的便捷途徑,所以,管理員能夠直接telnet至此端口使用SHUTDOWN命令關閉此實例。不過,基於安全角度的考慮,這一般不容許遠程進行。

該元素表明整個容器,是Tomcat實例的頂層元素。由org.apache.catalina.Server接口來定義。它包含一個或多個<Service>元素。而且它不能作爲任何元素的子元素。

<Server port ="8005" shutdown ="SHUTDOWN" debug ="0">

className:指定實現org.apache.catalina.Server接口的類。默認值爲: org.apache.catalina.core.StandardServer;

port:指定Tomcat監聽shutdown命令端口。終止服務器運行時,必須在Tomcat服務器所在的機器上發出shutdown命令。該屬性是必須的;

shutdown:指定終止Tomcat服務器運行時,發給Tomcat服務器的shutdown監聽端口的字符串。該屬性必須設置;

  1. <Service>元素

Service主要用於關聯一個引擎和與此引擎相關的鏈接器,每一個鏈接器經過一個特定的端口和協議接收入站請求交將其轉發相當聯的引擎進行處理。所以,Service要包含一個引擎、一個或多個鏈接器。

該元素由org.apache.catalina.Service接口定義,它包含一個<Engine>元素,以及一個或多個<Connector>,這些Connector元素共享用同一個Engine元素。

<Service name="Catalina"> // 第一個<Service>處理全部直接由Tomcat服務器接收的web客戶請求
<Service name="Apache"> // 第二個<Service>處理全部由Apahce服務器轉發過來的Web客戶請求

className:指定實現org.apahce.catalina.Service接口的類。默認爲:org.apahce.catalina.core.StandardService;

name:定義Service的名字,此名字也會在產生相關的日誌信息時記錄在日誌文件當中,默認爲Catalina;

  1. <Engine>元素

Engine是Servlet處理器的一個實例,即servlet引擎,默認爲定義在server.xml中的Catalina。

每一個Service元素只能有一個Engine元素。元素處理在同一個<Service>中全部<Connector>元素接收到的客戶請求。由org.apahce.catalina.Engine接口定義。

<Engine name="Catalina" defaultHost="localhost" debug="0">

className:指定實現Engine接口的類,默認值爲StandardEngine;

defaultHost:指定處理客戶的默認主機名,在<Engine>中的<Host>子元素中必須定義這一主機;定義一個接收全部發往非明肯定義虛擬主機的請求的host組件;

name:定義Engine的名字;

在<Engine>能夠包含以下元素<Logger>, <Realm>, <Value>, <Host>,<Listener>;

  1. <Host>元素

位於Engine容器中用於接收請求並進行相應處理的主機或虛擬主機。

它由Host接口定義。一個Engine元素能夠包含多個<Host>元素。每一個<Host>的元素定義了一個虛擬主機。它包含了一個或多個Web應用<Context>。

<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">

className:指定實現Host接口的類。默認值爲StandardHost

appBase:指定虛擬主機的目錄,能夠指定絕對目錄,也能夠指定相對於<CATALINA_HOME>的相對目錄。若是沒有此項,默認爲<CATALINA_HOME>/webapps;

autoDeploy:若是此項設爲true,表示Tomcat服務處於運行狀態時,可以監測appBase下的文件,若是有新有web應用加入進來,會自運發佈這個WEB應用;

unpackWARs:若是此項設置爲true,表示把WEB應用的WAR文件先展開爲開放目錄結構後再運行。若是設爲false將直接運行爲WAR文件;

alias:指定主機別名,能夠指定多個別名;

deployOnStartup:若是此項設爲true,表示Tomcat服務器啓動時會自動發佈appBase目錄下全部的Web應用;

若是Web應用中的server.xml沒有相應的<Context>元素,將採用Tomcat默認的Context;

name:定義虛擬主機的名字;

在<Host>元素中能夠包含以下子元素:<Logger>, <Realm>, <Value>, <Context>;

  1. <Context>元素

Context在某些意義上相似於apache中的路徑別名,一個Context定義用於標識tomcat實例中的一個Web應用程序。

它由Context接口定義。是使用最頻繁的元素。每一個<Context>元素表明了運行在虛擬主機上的單個Web應用。一個<Host>能夠包含多個<Context>元素。每一個web應用有惟一的一個相對應的Context表明web應用自身。servlet容器爲第一個web應用建立一個 ServletContext對象。

<Context path="/sample" docBase="sample" debug="0" reloadbale="true">

className:指定實現Context的類,默認爲StandardContext類;

docBase:相應的Web應用程序的存放位置;也可使用相對路徑,起始路徑爲此Context所屬Host中appBase定義的路徑;切記,docBase的路徑名不能與相應的Host中appBase中定義的路徑名有包含關係,好比,若是appBase爲deploy,而docBase毫不能爲deploy-bbs類的名字;

path:指定訪問Web應用的URL入口,注意/myweb,而不是myweb了事;

reloadable:若是這個屬性設爲true, Tomcat服務器在運行狀態下會監視在WEB-INF/classes和Web-INF/lib目錄CLASS文件的改動。若是監視到有class文件被更新,服務器自從新加載Web應用;

cookies:指定是否經過Cookies來支持Session,默認值爲true;

useNaming:指定是否支持JNDI,默認值爲了true;

在<Context>元素中能夠包含以下元素:<Logger>, <Realm>, <Resource>, <ResourceParams>;

  1. <Connector>元素

由Connector接口定義。<Connector>元素表明與客戶程序實際交互的組件,它負責接收客戶請求,以及向客戶返回響應結果。

進入Tomcat的請求能夠根據Tomcat的工做模式分爲以下兩類:

Tomcat做爲應用程序服務器:請求來自於前端的web服務器,這多是Apache, IIS, Nginx等;

Tomcat做爲獨立服務器:請求來自於web瀏覽器;

Tomcat應該考慮工做情形併爲相應情形下的請求分別定義好須要的鏈接器才能正確接收來自於客戶端的請求。一個引擎能夠有一個或多個鏈接器,以適應多種請求方式。

定義鏈接器可使用多種屬性,有些屬性也只適用於某特定的鏈接器類型。通常說來,常見於server.xml中的鏈接器類型一般有4種:

HTTP鏈接器

SSL鏈接器

AJP 1.3鏈接器

proxy鏈接器

<!-- 第一個Connector元素定義了一個HTTP Connector,它經過8080端口接收HTTP請求;-->
<Connector port="8080" maxThread="50" minSpareThreads="25" maxSpareThread="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" />

<!--  第二個Connector元素定義了一個AJP Connector,它經過8009端口接收由其它服務器轉發過來的請求;-->
<Connector port="8009" enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3" />

<!-- 第三個Connector元素定義了多個屬性的SSL鏈接器;-->
<Connector port="8443" maxThreads="150" minSpareThreads="25"
 maxSpareThreads="75" enableLookups="false" acceptCount="100"
 debug="0" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" />

Connector元素共用屬性:

className:指定實現Connector接口的類;

enableLookups:若是設爲true,表示支持域名解析,能夠把IP地址解析爲主機名。WEB應用中調用request.getRemoteHost方法返回客戶機主機名。默認值爲true;

redirectPort:指定轉發端口。若是當前端口只支持non-SSL請求,在須要安全通訊的場命,將把客戶請求轉發至SSL的redirectPort端口;

HttpConnector元素的屬性:

className:指定實現Connector的類;

port:設定Tcp/IP端口,默認值爲8080,若是把8080改爲80,則只要輸入 http://localhost 便可,由於TCP/IP的默認端口是80;

address:若是服務器有二個以上ip地址,此屬性能夠設定端口監聽的ip地址。默認狀況下,端口會監聽服務器上全部的ip地址;

bufferSize:設定由端口建立的輸入流的緩存大小。默認值爲2048byte;

protocol:設定Http協議,默認值爲HTTP/1.1;

maxThreads:設定在監聽端口的線程的最大數目,這個值也決定了服務器能夠同時響應客戶請求的最大數目。默認值爲200;

acceptCount:設定在監聽端口隊列的最大客戶請求數量,默認值爲10。若是隊列已滿,客戶必須等待;

connectionTimeout:定義創建客戶鏈接超時的時間。若是爲-1,表示不限制創建客戶鏈接的時間;

AJP Connector的屬性:

className:指定實現Connector的類;

port:設定AJP端口號;

protocol:必須設定爲AJP/1.3;

#4 Tomcat一個服務,配置多個端口號# 即一個service配置多個端口,項目能夠經過多個端口訪問。修改tomcat-home\conf下的server.xml,在Service下配置多個<Connector>便可。

<Service name="Catalina"> 
	<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
	<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
	<Connector port="8099" protocol="HTTP/1.1" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
		enableLookups="false" redirectPort="8443" acceptCount="100"
		debug="0" connectionTimeout="20000" URIEncoding="utf-8"
		disableUploadTimeout="true" />

	<Engine defaultHost="localhost" name="Catalina"> 
		<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> 
		<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
		</Host>
	</Engine>
</Service>

在這個應用裏,能夠用8080端口號訪問服務,也能夠用8099端口號來訪問服務; 服務放置的路徑由host決定,上例中服務放在webapps下。

#5 Tomcat多個服務,配置不一樣端口號# 即配置多個service,每一個service能夠配置多個端口。**修改tomcat-home\conf下的server.xml,添加多個Service便可。

注意:Service name、Engine name、appBase,端口號別忘了修改,以避免重複。

<Service name="Catalina">
	<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
	<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

	<Engine defaultHost="localhost" name="Catalina">
		<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
		<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
		</Host>
	</Engine>
</Service>

<Service name="Catalina1">
	<Connector connectionTimeout="20000" port="8099" protocol="HTTP/1.1" redirectPort="8443"/>
	<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

	<Engine defaultHost="localhost" name="Catalina1">
		<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
		<Host appBase="webapps1" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
		</Host>
	</Engine>
</Service>

<Service name="Catalina2">
	<Connector connectionTimeout="20000" port="8098" protocol="HTTP/1.1" redirectPort="8443"/>
	<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

	<Engine defaultHost="localhost" name="Catalina2">
		<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
		<Host appBase="webapps2" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
		</Host>
	</Engine>
</Service>

以上三個service,發佈的路徑不一樣,項目分別發佈在webapps、webapps一、webapps2下,訪問不一樣的項目的方法:

http://localhost:8080/項目名稱1

http://localhost:8099/項目名稱2

http://localhost:8088/項目名稱3

#6 Tomcat優化配置# ##6.1 精簡Tomcat和配置文件##

  1. 刪除不須要的管理應用和幫助應用,提升tomcat安全性

刪除webapps下全部文件:rm –fr $CATALINA_HOME/webapps/*

刪除server/webapps下全部文件:rm –fr $CATALINA_HOME/server/webapps/*

  1. 精簡sever.xml配置文件

使用tomcat發佈版本中的最小配置文件,提升性能,若是有功能上的需求,在逐個的加入功能配置。

備份原來的server.xml爲server.xml_bak:mv server.xml server.xml_bak

複製server-minimal.xml爲server.xml:cp server-minimal.xml server.xml

##6.2 鏈接器優化## 在$CATALINA_HOME/conf/server.xml 配置文件中的Connetctor節點,和鏈接數相關的參數配置和優化。

  1. maxThreads

Tomcat使用線程來處理接收的每一個請求。這個值表示Tomcat可建立的最大的線程數。默認值200。 能夠根據機器的時期性能和內存大小調整,通常能夠在400-500。最大能夠在800左右。

  1. acceptCount

指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理。默認值10。

  1. minSpareThreads

Tomcat初始化時建立的線程數。默認值4。

  1. maxSpareThreads

一旦建立的線程超過這個值,Tomcat就會關閉再也不須要的socket線程。默認值50。

  1. enableLookups

是否反查域名,默認值爲true。爲了提升處理能力,應設置爲false

  1. connnectionTimeout

網絡鏈接超時,默認值20000,單位:毫秒。設置爲0表示永不超時,這樣設置有隱患的。一般可設置爲30000毫秒

  1. maxKeepAliveRequests

保持請求數量,默認值100。

  1. bufferSize

輸入流緩衝大小,默認值2048 bytes。

  1. compression

壓縮傳輸,取值on/off/force,默認值off。

其中和最大鏈接數相關的參數爲maxThreads和acceptCount。若是要加大併發鏈接數,應同時加大這兩個參數web server容許的最大鏈接數還受制於操做系統的內核參數設置,一般Windows是2000個左右,Linux是1000個左右。

配置示例:

<!-- AJP鏈接 -->
<Connector port="8009" maxTreads="500" minSpareThreads="10" 
       maxSpareThreads="50" acceptCount="50" connectionTimeout="60000" 
       enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

<!-- 通用鏈接 -->
<Connector port="8080"
       maxTreads="500" minSpareThreads="10" maxSpareThreads="50"
       acceptCount="50" connectionTimeout="60000"
       enableLookups="false" redirectPort="8443" protocol="AJP/1.3"
       compression="on"
       compressionMinSize="2048"
       noCompressionUserAgents="gozilla, traviata"
       compressableMimeType="text/html,text/xml" />

<!-- 主機和應用配置 -->
<Host name="localhost" appBase=""
    unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">
    <Context path="" docBase="/www/xxxx/site/web" reloadable="true" debug="0"/>
</Host>

##6.3 JVM優化## Tomcat默承認以使用的內存爲128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件$CATALINA_HOME/bin/catalina.sh的前面,增長以下設置:

JAVA_OPTS="$JAVA_OPTS -Xms[初始化內存大小] -Xmx[可使用的最大內存]"
# 或設置環境變量
export JAVA_OPTS="$JAVA_OPTS -Xms[初始化內存大小] -Xmx[可使用的最大內存]

通常說來,你應該使用物理內存的 80% 做爲堆大小。若是本機上有Apache服務器,能夠先折算Apache須要的內存,而後修改堆大小。建議設置爲70%;建議設置[初始化內存大小]等於[可使用的最大內存],這樣能夠減小平凡分配堆而下降性能。

##6.4 其餘優化配置##

  1. Tomcat中如何禁止和容許列目錄下的文件

在$CATALINA_HOME/conf/web.xml中,把listings參數設置成false便可,以下:

<servlet>
     <servlet-name>default</servlet-name>
     <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
     <init-param>
         <param-name>debug</param-name>
         <param-value>0</param-value>
     </init-param>
     <init-param>
         <param-name>listings</param-name>
         <param-value>false</param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
</servlet>
相關文章
相關標籤/搜索