Tomcat 的配置文件由4個 xml 文件構成,context.xml、web.xml、server.xml、tomcat-users.xml 這4個文件。每一個文件都有本身的功能與配置方法,下列將逐一介紹這幾個文件的配置:html
1、context.xml 文件java
Context.xml 是 Tomcat 公用的環境配置,tomcat 服務器會定時去掃描這個文件。一旦發現文件被修改(時間戳改變了),就會自動從新加載這個文件,而不須要重啓服務器。推薦在 $CATALINA_BASEconf/context.xml 中進行獨立的配置。由於 server.xml 是不可動態重加載的資源,服務器一旦啓動了之後,要修改這個文件,就得重啓服務器才能從新加載,而context.xml 文件則否則。mysql
下面是context.xml文件的配置web
1 <Context path="/eml" docBase="eml" debug="0" reloadbale="true" privileged="true"> 2 3 <WatchedResource>WEB-INF/web.xml</WatchedResource> 4 5 <WatchedResource>WEB-INF/eml.xml</WatchedResource> #監控資源文件,若是web.xml || eml.xml改變了,則自動從新加載改應用。 6 7 <Resource name="jdbc/testSiteds" #表示指定的jndi名稱 8 auth="Container" #表示認證方式,通常爲Container 9 type="javax.sql.DataSource" 10 maxActive="100" #鏈接池支持的最大鏈接數 11 maxIdle="40" #鏈接池中最多可空閒maxIdle個鏈接 12 maxWait="30000" #鏈接池中鏈接用完時,新的請求等待時間,毫秒 13 username="txl" #表示數據庫用戶名 14 password="123456" #表示數據庫用戶的密碼 15 driverClassName="com.mysql.jdbc.Driver" #表示JDBC DRIVER 16 url="jdbc:mysql://localhost:3306/testSite" /> #表示數據庫URL地址 17 18 </Context>
context.xml的三個做用範圍sql
1. tomcat server 級別:數據庫
在$CATALINA_BASE/conf/context.xml 裏配置,若是你在這個地方配置、那麼這個配置文件將會被全部的webApp共享 。apache
2. Host 級別:跨域
在 $CATALINA_BASE/conf/Catalina/${hostName} 裏添加 context.xml,繼而進行配置,這個配置將會被這個主機上的全部webapp共享。瀏覽器
3. web app 級別:緩存
在 $CATALINA_BASE/conf/Catalina/${hostName} 裏添加 ${webAppName}.xml,繼而進行配置。
此時,path="",
webAppName 即爲 path屬性的值,也就是訪問的虛擬目錄。
另:tomcat 服務器文件中的 $CATALINA_BASE/webapps 目錄下的全部文件夾都是一個應用。這個時候不須要本身動手配置,服務器默認將文件夾名映射成虛擬目錄名稱。還能夠經過 $CATALINA_BASE/webapps/{App}/META-INF/context.xml 來配置,這個是在web應用中本身添加的,配置和其它同樣。
<context> 標籤是使用,
2、web.xml文件
Web應用程序描述文件,都是關因而Web應用程序的配置文件。全部Web應用的 web.xml 文件的父文件。
1 <web-app > 2 <filter></filter> 3 <filter-mapping></filter-mapping> 4 <servlet></servlet> 5 <servlet-mapping></servlet-mapping> 6 <session-config></session-config> 7 <mime-mapping></mime-mapping> 8 <welcome-file-list></welcome-file-list> 9 </web-app >
1 <!-- 2 filter 配置Servlet過濾器 3 filter-name 定義過濾器的名字。當有多個過濾器時,不能同名 4 filter-class 指定實現這一過濾的類,這個類負責具體的過濾事務 5 --> 6 <filter> 7 <filter-name>SampleFilter</filter-name> 8 <filter-class>mypack.SampleFilter</filter-class> 9 </filter> 10 11 <!-- 12 filter-mapping 設定過濾器負責過濾的URL 13 filter-name 過濾器名。這裏的名字必定要和filter中的過濾器名匹配 14 url-pattern 指定過濾器負責過濾的URL 15 --> 16 <filter-mapping> 17 <filter-name>SampleFilter</filter-name> 18 <url-pattern>*.jsp</url-pattern> 19 </filter-mapping> 20 21 <!-- 22 servlet 配置Servlet. 23 servlet-name 定義Servlet的名字 24 servlet-class 指定實現這個servlet的類 25 init-param 定義Servlet的初始化參數和參數值,可有多個init-param。在servlet類中經過getInitParamenter(String name)方法訪問初始化參數 26 load-on-startup 指定當Web應用啓動時,裝載Servlet的次序。 27 當值爲正數或零時:Servlet容器先加載數值小的servlet,再依次加載其餘數值大的servlet. 28 當值爲負或未定義:Servlet容器將在Web客戶首次訪問這個servlet時加載它 29 --> 30 <servlet> 31 <servlet-name>SampleServlet</servlet-name> 32 <servlet-class>mypack.SampleServlet</servlet-class> 33 <init-param> 34 <param-name>initParam1</param-name> 35 <param-value>2</param-value> 36 </init-param> 37 <load-on-startup>1</load-on-startup> 38 </servlet> 39 40 <!-- 41 配置servlet映射(下面代碼爲SampleServlet指定的相對URL爲"/sample": 42 servlet-name 指定servlet的名字,這裏的名字應該和<Servlet>元素中定義的名字匹配。 43 url-pattern 指定訪問這個servlet的URL。只需給出相對路徑。 44 --> 45 <servlet-mapping> 46 <servlet-name>SampleServlet</servlet-name> 47 <url-pattern>/sample</url-pattern> 48 </servlet-mapping> 49 50 <!--配置session session用來設定HttpSession的生命週期。單位(秒)--> 51 <session-config> 52 <session-timeout>30</session-timeout> 53 </session-config> 54 55 <!--配置Wel0come0文件清單--> 56 <welcome-file-list> 57 <welcome-file>login.jsp</welcome-file> 58 <welcome-file>index.htm</welcome-file> 59 </welcome-file-list>
該文件基本不用配置,Tomcat7 支持 Servlet3.0 註解定義,無需配置 web.xml。爲了使 Tomcat 可以運行 CGI,必須註釋掉<servlet-name> CGI 的那段。
更多細節請參考:http://blog.163.com/ny_lonely/blog/static/18892427320136925044357
3、server.xml文件
server.xml是對tomcat的設置,能夠設置端口號,添加虛擬機這些的,是對服務器的設置
下面則是server.xml配置文件的詳解:
1 <Server port="8005" shutdown="SHUTDOWN"> 2 <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> 3 <Listener className="org.apache.catalina.security.SecurityListener" /> 4 <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 5 <Listener className="org.apache.catalina.core.JasperListener" /> 6 <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> 7 <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> 8 <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> 9 <GlobalNamingResources> 10 <!-- 全局命名資源,來定義一些外部訪問資源,其做用是爲全部引擎應用程序所引用的外部資源的定義 --!> 11 <Resource name="UserDatabase" auth="Container" 12 type="org.apache.catalina.UserDatabase" 13 description="User database that can be updated and saved" 14 factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 15 pathname="conf/tomcat-users.xml" /> 16 </GlobalNamingResources> 17 <!-- 定義的一個名叫「UserDatabase」的認證資源,將conf/tomcat-users.xml加載至內存中,在須要認證的時候到內存中進行認證 --> 18 <Service name="Catalina"> 19 <!-- # 定義Service組件,同來關聯Connector和Engine,一個Engine能夠對應多個Connector,每一個Service中只能一個Engine --!> 20 <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 21 <!-- 修改HTTP/1.1的Connector監聽端口爲80.客戶端經過瀏覽器訪問的請求,只能經過HTTP傳遞給tomcat。還能夠設置server與URIEncoding參數 --> 22 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 23 <Engine name="Catalina" defaultHost="test.com"> 24 <!-- 修改當前Engine,默認主機是,www.test.com --> 25 <Realm className="org.apache.catalina.realm.LockOutRealm"> 26 <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 27 resourceName="UserDatabase"/> 28 </Realm> 29 # Realm組件,定義對當前容器內的應用程序訪問的認證,經過外部資源UserDatabase進行認證 30 <Host name="test.com" appBase="/web" unpackWARs="true" autoDeploy="true"> 31 <!-- 定義一個主機,域名爲:test.com,應用程序的目錄是/web,設置自動部署,自動解壓 --> 32 <Alias>www.test.com</Alias> 33 <!-- 定義一個別名www.test.com,相似apache的ServerAlias --> 34 <Context path="" docBase="www/" reloadable="true" /> 35 <!-- 定義該應用程序,訪問路徑"",即訪問www.test.com便可訪問,網頁目錄爲:相對於appBase下的www/,即/web/www,而且當該應用程序下web.xml或者類等有相關變化時,自動重載當前配置,即不用重啓tomcat使部署的新應用程序生效 --> 36 <Context path="/bbs" docBase="/web/bbs" reloadable="true" /> 37 <!-- 定義另一個獨立的應用程序(虛擬主機),訪問路徑爲:www.test.com/bbs,該應用程序網頁目錄爲/web/bbs --> 38 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/www/logs" 39 prefix="www_access." suffix=".log" 40 pattern="%h %l %u %t "%r" %s %b" /> 41 <!-- 定義一個Valve組件,用來記錄tomcat的訪問日誌,日誌存放目錄爲:/web/www/logs若是定義爲相對路徑則是至關於$CATALINA_HOME,並不是相對於appBase,這個要注意。定義日誌文件前綴爲www_access.並以.log結尾,pattern定義日誌內容格式,具體字段表示能夠查看tomcat官方文檔 --> 42 </Host> 43 <Host name="manager.test.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> 44 <!-- 定義一個主機名爲man.test.com,應用程序目錄是$CATALINA_HOME/webapps,自動解壓,自動部署 --> 45 <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="172.16.100.*" /> 46 <!-- 定義遠程地址訪問策略,僅容許172.16.100.*網段訪問該主機,其餘的將被拒絕訪問 --> 47 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/bbs/logs" 48 prefix="bbs_access." suffix=".log" 49 pattern="%h %l %u %t "%r" %s %b" /> 50 <!-- 定義該主機的訪問日誌 --> 51 </Host> 52 </Engine> 53 </Service> 54 </Server>
一、<Server>元素:
是整個配置文件的根元素。表示整個Catalina容器。
屬性:
className:實現了org.apache.catalina.Server接口的類名,標準實現類是org.apache.catalina.core.StandardServer類;
Port:Tomcat服務器監聽用於關閉Tomcat服務器的命令(必須);
Shutdown:發送到端口上用於關閉Tomcat服務器的命令;
二、<Connector>元素:
鏈接器,負責接收客戶的請求,以及向客戶端回送響應的消息。
HTTP鏈接器:
屬性:
allowTrace:是否容許HTTP的TRACE方法,默認爲false;
emptySessionPath:若是設置爲true,用戶的全部路徑都將設置爲/,默認爲false;
enableLookups:調用request、getRemoteHost()執行DNS查詢,以返回遠程主機的主機名,若是設置爲false,則直接返回IP地址;
maxPostSize:指定POST方式請求的最大量,沒有指定默認爲2097152;
protocol:值必須爲HTTP1.1,若是使用AJP處理器,該值必須爲AJP/1.3;
proxyName:如這個鏈接器正在一個代理配置中被使用,指定這個屬性,在request.getServerName()時返回;
redirectPort:如鏈接器不支持SSL請求,如收到SSL請求,Catalina容器將會自動重定向指定的端口號,讓其進行處理;
scheme:設置協議的名字,在request.getScheme()時返回,SSL鏈接器設爲」https」,默認爲」http」;
secure:在SSL鏈接器可將其設置爲true,默認爲false;
URIEncoding:用於解碼URL的字符編碼,沒有指定默認值爲ISO-8859-1;
useBodyEncodingForURI:主要用於Tomcat4.1.x中,指示是否使用在contentType中指定的編碼來取代URIEncoding,用於解碼URI查詢參數,默認爲false;
xpoweredBy:爲true時,Tomcat使用規範建議的報頭代表支持Servlet的規範版本,默認爲false;
acceptCount:當全部的可能處理的線程都正在使用時,在隊列中排隊請求的最大數目。當隊列已滿,任何接收到的請求都會被拒絕,默認值爲10;
bufferSize:設由鏈接器建立輸入流緩衝區的大小,以字節爲單位。默認狀況下,緩存區大的大小爲2048字節;
compressableMimeType:MIME的列表,默認以逗號分隔。默認值是text/html,text/xml,text/plain;
compression:指定是否對響應的數據進行壓縮。off:表示禁止壓縮、on:表示容許壓縮(文本將被壓縮)、force:表示全部狀況下都進行壓縮,默認值爲off;
connectionTimeout:設置鏈接的超時值,以毫秒爲單位。默認值爲60000=60秒;
disableUploadTimeOut:容許Servlet容器,正在執行使用一個較長的鏈接超時值,以使Servlet有較長的時間來完成它的執行,默認值爲false;
maxHttpHeaderSize:HTTP請求和響應頭的最大量,以字節爲單位,默認值爲4096字節;
maxKeepAliveRequest:服務器關閉以前,客戶端發送的流水線最大數目。默認值爲100;
maxSpareThreads:容許存在空閒線程的最大數目,默認值爲50;
minSpareThreads:設當鏈接器第一次啓協建立線程的數目,確保至少有這麼多的空閒線程可用。默認值爲4;
port:服務端套接字監聽的TCP端口號,默認值爲8080(必須);
socketBuffer:設Socket輸出緩衝區的大小(以字節爲單位),-1表示禁止緩衝,默認值爲9000字節;
toNoDelay:爲true時,能夠提升性能。默認值爲true;
threadPriority:設JVM中請求處理線程優先級。默認值爲NORMAL-PRIORITY;
例如:
1 <Connector 2 port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" 3 redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />
AJP鏈接器:
用於將Apache與Tomcat集成在一塊兒,當Apache接收到動態內容請求時,經過在配置中指定的端口號將請求發送給在此端口號上監聽的AJP鏈接器組件。
屬性:
backlog:當全部可能的請求處理線程都在使用時,隊列中排隊的請求最大數目。默認爲10,當隊列已滿,任何請求都將被拒絕;
maxSpareThread:容許存在空閒線程的最大數目,默認值爲50;
maxThread:最大線程數,默認值爲200;
minSpareThreads:設當鏈接器第一次啓動時建立線程的數目,確保至少有這麼多的空閒線程可用,默認值爲4;
port:服務端套接字的TCP端口號,默認值爲8089(必須);
topNoDelay:爲true時,能夠提升性能,默認值爲true;
soTimeout:超時值;
三、<Engine>元素:
爲特定的Service處理全部的請示。每一個Service只能包含一個Engine元素,它負責接收和處理此Service全部的鏈接器收到的請求,向鏈接發回響應,並最終顯示在客戶端。<Engine>至少有一個<Host>元素,必須至少有一個<Host>屬性的名字與defaultHost指定的名字相匹配。
屬性:
className:實現org.apache.catalina.Engine接口,默認實現類爲org.apache.catalina.core.StandardEngine類;
defaultHost:默認主機名,值必須與<Service>的name值相匹配;
name:指定Engine的邏輯名字(必須);
jvmRoute:在負載勻衡中使用的標識符,必須惟一;
例如:
1 <Engine name="Cataline" defaultHost="localhst">
四、<Host>元素:
表示一個虛擬主機,爲特定的虛擬主機處理全部請求。
屬性:
appBase:設定應用程序的基目錄,絕對路徑或相對於%CATALINA_HOME%的路徑名;
autoDeploy:指示Tomcat運行時,若有新的WEB程序加開appBase指定的目錄下,是否爲自動佈署,默認值爲true;
className:實現了org.apache.catalina.Host接口的類,標準實現類爲org.apache.catalina.core.StandardHost類;
deployOnStartup:Tomcat啓動時,是否自動部署appBase屬性指定目錄下全部的WEB應用程序,默認值爲true;
name:虛擬主機的網絡名(必須);
標準Host實現類org.apahce.catalina.core.StandardHost支持的附加屬性:
deployXML:爲false將不會解析WEB應用程序內部的context.xml,默認值爲true;
unPackWARs:虛擬主機指定臨時讀寫使用的目錄的路徑名,不設,Tomcat會在%CATALINA_HOME%/work目錄下提供一個合適的目錄;
1 <Host name="localhst" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> 2
配置虛擬主機: 3 <Hostname="xxx" appBase="/test"> 4 <Contentpath=" " docBase="www/"/> 5 </Hostname>
五、<context>元素:
一個WEB應用程序,處理當前WEB應用程序的全部請求,每個<Context>必須使用惟一的上下文路徑。
屬性:
className:實現了org.apache.catalina.Context接口的類,標準實現類org.apache.catalina.core.StandardContext類;
cookies:是否將Cookie應用於Session,默認值爲true;
crossContext:是否容許跨域訪問,爲true時,在程序內調用ServletContext.getContext()方法將返回一個虛擬主機上其它web程序的請求調度器;默認值爲false,調 徑用 getContext()返回爲null;
docBase:絕對路徑或相對於Host的appBase 屬性的相對路徑;
privileged:爲true,容許Web應用程序使用容器的Servlet;
path:指定上下文路徑。一個虛擬主機中,上下文路徑必須惟一;
reloadable:爲true,Tomcat運行時,若是WEB-INF/classes和WEB-INF/lib目錄中有改變,Tomcat會自動從新加載該WEB應用程序。雖方便,但開銷也大,默認值爲false,咱們在調用能夠打開,發佈後再關閉;
cacheMaxSize:靜態資源緩存最大值,以KB爲單位,默認值爲10240KB;
cachingAllowed:是否容許靜態資源緩存,默認爲true;
caseSensitive:默認爲true,資源文件名大小寫敏感,若是爲false大小寫不敏感;
unpackWAR:默認爲true;
workDir:爲WEB應用程序內部的Servlet指定臨時讀寫的目錄路徑名。如沒有設置,則Tomcat會在%CATALINA_HOME%/work目錄下提供一個合適的目錄;
一個 server 有一個 service,一個 service 裏有多個 connector 和一個 engine,不一樣的 connector 除了端口可能不一樣,協議也可能不一樣。多個connector 對應一個 engine。 engine 表明咱們應用程序的容器。一個 engine 中有一個到多個 host,一個host 表明咱們的一個虛擬主機。host 裏又有一個到多個 context,一個 context 表明了一個應用程序的虛擬子站點。
4、tomcat-users.xml
Tomcat Manager是Tomcat自帶的、用於對Tomcat自身以及部署在Tomcat上的應用進行管理的web應用。Tomcat是Java領域使用最普遍的服務器之一,所以Tomcat Manager也成爲了使用很是廣泛的功能應用。
在默認狀況下,Tomcat Manager是處於禁用狀態的。準確地說,Tomcat Manager須要以用戶角色進行登陸並受權才能使用相應的功能,不過Tomcat並無配置任何默認的用戶,所以須要咱們進行相應的用戶配置以後才能使用Tomcat Manager。
Tomcat Manager的用戶配置是在Tomcat安裝目錄/conf/tomcat-users.xml
文件中進行管理的。
Tomcat Manager的用戶配置很是簡單,下面咱們以一個具體的配置爲例:
1 <tomcat-users> 2 <role rolename="manager-gui"/> 3 <role rolename="manager-script"/> 4 <user username="tomcat" password="tomcat" roles="manager-gui"/> 5 <user username="admin" password="123456" roles="manager-script"/> 6 </tomcat-users>
如上所示,咱們只須要在tomcat-users
節點中配置相應的role
(角色/權限)和user
(用戶)便可。一個user
節點表示單個用戶,屬性username
和password
分別表示登陸的用戶名和密碼,屬性roles
表示該用戶所具有的權限。
user
節點的roles
屬性值與role
節點的rolename
屬性值相對應,表示當前用戶具有該role節點所表示的角色權限。固然,一個用戶能夠具有多種權限,所以屬性roles
的值能夠是多個rolename
,多個rolename
之間以英文逗號隔開便可。
稍加思考,咱們就應該猜想到,rolename
的屬性值並非隨意的內容,不然Tomcat怎麼可以知道咱們隨便定義的rolename
表示什麼樣的權限呢。實際上,Tomcat已經爲咱們定義了4種不一樣的角色——也就是4個rolename
,咱們只須要使用Tomcat爲咱們定義的這幾種角色就足夠知足咱們的工做須要了。
如下是Tomcat Manager 4種角色的大體介紹(下面URL中的*爲通配符):
從Tomcat Manager內部配置文件中能夠得知,manager-gui
、manager-script
、manager-jmx
均具有manager-status
的權限,也就是說,manager-gui
、manager-script
、manager-jmx
三種角色權限無需再額外添加manager-status
權限,便可直接訪問路徑/manager/status/*
。
配置tomcat的時候遇到了如下問題:
1.剛開始須要用戶名密碼,不知道用戶名和密碼是什麼,可是輸入什麼都不正確。
解決辦法:
本身在tomcat-users.xml中按格式添加用戶 conf文件夾裏面
默認是註釋掉了的,這主要是考慮到服務器的安全,若是是本地測試,去掉如下這段註釋,而後重啓動服務器,再輸入
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
用戶和密碼都一目瞭然了。
2.進入manager界面以後,顯示的是403 Access Denied。
解決辦法:
在conf/tomcat-users.xml文件中看到這麼一段話:
NOTE: By default, no user is included in the "manager-gui" role required
to operate the "/manager/html" web application. If you wish to use this app,
you must define such a user - the username and password are arbitrary.
也就是說,爲了考慮安全,tomcat默認仍是沒有manager-gui的管理權限的,若是想要使用manager
的話,須要自行加入管理權限(角色)。
須要加一個這樣的權限(角色)
<role rolename="manager-gui"/>
而後再加到須要的用戶名中去
<user username="tomcat" password="tomcat" roles="tomcat,manager-gui"/>
這樣OK了。