天天看點

tomcat學習随筆

    Tomcat是由Apache軟體基金會下屬的Jakarta項目開發的一個Servlet容器,按照Sun Microsystems提供的技術規範,實作了對Servlet和JavaServer Page(JSP)的支援,并提供了作為Web伺服器的一些特有功能,如Tomcat管理和控制平台、安全局管理和Tomcat閥等。由于Tomcat本身也内含了一個HTTP伺服器,它也可以被視作一個單獨的Web伺服器。但是,不能将Tomcat和Apache Web伺服器混淆,Apache Web Server是一個用C語言實作的HTTP web server;這兩個HTTP web server不是捆綁在一起的。Apache Tomcat包含了一個配置管理工具,也可以通過編輯XML格式的配置檔案來進行配置。因為Tomcat 技術先進、性能穩定,而且免費,因而深受Java 愛好者的喜愛并得到了部分軟體開發商的認可,成為目前比較流行的輕量級Web 應用伺服器。

一,安裝

1,配置jdk環境變量:

export JAVA_HOME=/opt/soft/jdk1.7.0_55/

export JRE_HOME=/opt/soft/jdk1.7.0_55/jre

export PATH=$PATH:/opt/soft/jdk1.7.0_55/bin

export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib

2,tomact安裝:

軟體下載下傳位址:http://tomcat.apache.org/,下載下傳二進制的tar包,解壓即可使用。

# cd /opt/soft

# tar xf apache-tomcat-7.0.54.tar.gz

# cd /opt/soft/apache-tomcat-7.0.54

二,tomcat7基本配置

1,目錄結構

 /bin:腳本檔案目錄。

 /lib:存放所有web項目都可以通路的公共jar包(使用Common類加載器加載)。

 /conf:存放配置檔案,最重要的是server.xml。

 /logs:存放日志檔案。

 /temp:Tomcat運作時候存放臨時檔案用的。

 /webapps:web應用釋出目錄。

 /work:Tomcat把各種由jsp生成的servlet檔案放在這個目錄下。删除後,啟動時會自動建立。

2 ,配置檔案

 server.xml:主要的配置檔案。

 web.xml:預設的web app配置,WEB-INF/web.xml會覆寫該配置。

 context.xml:全局的context配置,對所有host生效

3,啟動

# bash startup.sh

4,當url中未明确指定檔案名時并且目錄中也沒有tomcat指定的index檔案時,列出相關目錄下所有檔案:

打開web.xml檔案,找到如下配置,把false改成true,重新開機tomcat即可。

    <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>

            <param-name>listings</param-name>

            <param-value>false</param-value>

        <load-on-startup>1</load-on-startup>

    </servlet>

5,虛拟目錄的配置的兩種方法

1)打開server.xml檔案,知道其中如下的配置:

      <Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

               prefix="localhost_access_log." suffix=".txt"

               pattern="%h %l %u %t "%r" %s %b" />

      </Host>

然後在Host域中添加類似如下配置即可:

        <Context path="/lee" docBase="/opt/www" debug="0" reloadable="true"></Context>

        <Context path="/jia" docBase="/opt/" debug="0" reloadable="true"></Context>

docBase:是項目檔案夾的web-inf檔案夾的上一層目錄 

reloadable:是指可以重新加載,一般設定為true,友善使用,不需要經常重新開機Tomcat。 

2)在conf/Catalina/locahost(該目錄可能需要手工建立)下建立一個檔案abc.xml,注意檔案名中的abc就表示虛拟目錄的名稱,是以不可随意命名,該檔案的内容為: 

<Context docBase="/opt/" debug="0" reloadable="true"></Context>

這裡的Context元素會被Engine名字為Catalina下的localhost主機下的所有web應用加載。

三,虛拟主機的配置

1,tomcat 7的xml配置檔案server.xml通常在預設情況下,在<Engine></Engine>标簽之間會有一個預設虛拟主機配置:

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

最簡的server.xml格式為:

<Engine name="Catalina" defaultHost="ren">

    <Host name="ren"    appBase="renapps"/>

    <Host name="stimpy" appBase="stimpyapps"/>

</Engine>

Host就是虛拟主機的元素(标簽)。預設虛拟主機的應用程式目錄是指向tomcat目錄下的webapps這個檔案夾的,預設打開的應用是ROOT,即在浏覽器中輸入http://localhost:8080 打開的是ROOT這個Web應用。

2,自定義基于域名的虛拟主機

在第一個虛拟主機的結束标簽後面添加:

      <Host name="www.mydomain.com" appBase="/opt" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

    <Context docBase="/opt/www" path="/my" reloadable="true" />

      </Host>

      <Host name="www.domain.com" appBase="/opt" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

    <Context docBase="/opt/www" path="" reloadable="true" />

appBase設定成了docBase的上一級目錄,在apps目錄下的test檔案夾才是存放web應用的地方。

配置完成後,重新開機tomcat使用配置生效。

每一個Host會在Catalina引擎下根據host的name建立對應的檔案夾:

[root@yd_82_231 conf]# ls Catalina/

3,自定義基于端口的虛拟主機

雖然可以增加Connector來增加服務的端口,但是host中沒有提供端口的選項,這樣增加出來的端口和源端口是一樣的虛拟主機設定,無法達到我們的要求。

單純增加端口沒有辦法,那麼我們可以增加service,舉例如下:

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

….省略了server的配置

  <Service name="Catalina">

    <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

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

      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

               resourceName="UserDatabase"/>

      </Realm>

      <Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true">

        <Context path="/lee" docBase="/opt/www" debug="0" reloadable="true"></Context>

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

               prefix="localhost_access_log." suffix=".txt"

               pattern="%h %l %u %t "%r" %s %b" />

      <Host name="www.mydomain.com" appBase="/opt" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

    </Engine>

  </Service>

<!--##############這是第二個service##############-->

<Service name="Catalina2">

    <Connector port="8090" />

    <Engine name="Catalina2" defaultHost="localhost">

      <Logger className="org.apache.catalina.logger.FileLogger" />

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

             resourceName="UserDatabase" />

      <Host name="localhost" appBase="webapps2" />

</Server>

增加的service可以配置設定自己的connector和host,隻要和主service不沖突即可,然後重新開機tomcat。會發現自動生成了對應的engine目錄和host目錄:

[root@yd_82_231 conf]# pwd

/opt/soft/apache-tomcat-7.0.54/conf

[root@yd_82_231 conf]# ls

Catalina   catalina.policy      context.xml         server.xml        web.xml

Catalina2  catalina.properties  logging.properties  tomcat-users.xml

[root@yd_82_231 conf]# ls Catalina2/         

localhost

4,禁止和允許主機或ip位址的通路

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

        <Valve className="org.apache.catalina.valves.RemoteHostValve" allow="*.mycompany.com,www.yourcompany.com"/> 

        <Valve className="org.apache.catalina.valves.RemoteAddrValve"   deny="10.10.81.*"/>

三,簡單調優

1,禁用DNS查詢

  當web應用程式向要記錄用戶端的資訊時,它也會記錄用戶端的IP位址或者通過域名伺服器查找機器名轉換為IP位址。而DNS查詢需要占用網絡,并且包括可能從很多很遠的伺服器或者不起作用的伺服器上去擷取對應的IP的過程,這樣會消耗一定的時間。

操作:

修改server.xml檔案中的enableLookups參數值: enableLookups="false"

2,調整線程數

    通過應用程式的連接配接器(Connector)進行性能控制的的參數是建立的處理請求的線程數。Tomcat使用線程池加速響應速度來處理請求。在Java中線程是程式運作時的路徑,是在一個程式中與其它控制線程無關的、能夠獨立運作的代碼段。它們共享相同的位址空間。多線程幫助程式員寫出CPU最大使用率的高效程式,使空閑時間保持最低,進而接受更多的請求。

  示例如下:

    <Connector port="80" protocol="HTTP/1.1"

        maxThreads="600" 最多運作線程數  

        minSpareThreads="100" 初始化建立的線程數

        maxSpareThreads="500"

          最多能建立的線程數,一旦建立的線程超過這個值,Tomcat就會關閉不再需要socket線程.

        acceptCount="700" 指定當所有可以使用的處理請求的線程數都被使用時

          可以放到處理隊列中的請求數,超過這個數的請求将不予處理

        connectionTimeout="20000"

        enableLookups="false"

        redirectPort="8443" />

3,設定session過去時間

  在\conf\web.xml中通過參數指定:(機關為分鐘)

    <session-config>   

        <session-timeout>180</session-timeout>     

    </session-config> 

四,server.xml檔案詳解

1,<Server>元素

它代表整個容器 ,是Tomcat 執行個體的頂層元素 .由org.apache.catalina.Server 接口來定義 .它包含一個<Service>元素. 并且它不能做為任何元素的子元素 。

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

1)className指定實作 org.apache.catalina.Server接口的類. 預設值為org.apache.catalina.core.StandardServer

2)port指定 Tomcat監聽shutdown 指令端口。終止伺服器運作時,必須在 Tomcat伺服器所在的機器上發出

3)shutdown指令,該屬性是必須的。shutdown指定終止Tomcat伺服器運作時,發給 Tomcat伺服器的shutdown 監聽端口的字元串。該屬性必須設定。

2,<Service>元素

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

<Service name="Catalina">  

<Service name="Apache">

可以有多個service元素,每個service也可以監聽自己的端口。

1>className 指定實作 org.apahce.catalina.Service接口的類. 預設為org.apahce.catalina.core.StandardService

2>name定義 Service的名字

3,<Engine>元素

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

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

1)className指定實作Engine 接口的類 ,預設值為StandardEngine

2)defaultHost指定處理客戶的預設主機名 ,在<Engine> 中的<Host>子元素中必須定義這一主機 

3)name定義 Engine的名字。在<Engine>可以包含如下元素 <Logger>, <Realm>, <Value>, <Host>

4,<Host>元素

它由Host接口定義,一個Engine 元素可以包含多個 <Host>元素. 每個<Host>的元素定義了一個虛拟主機 .它包含了一個或多個Web應用。

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

1)className指定實作Host 接口的類 .預設值為StandardHost

2)appBase指定虛拟主機的目錄 ,可以指定絕對目錄,也可以指定相對于 <CATALINA_HOME>的相對目錄. 如果沒有此項 ,預設為<CATALINA_HOME>/webapps

3)autoDeploy如果此項設為 true,表示Tomcat服務處于運作狀态時 ,能夠監測appBase下的檔案 ,如果有新有web應用加入進來,會自運釋出這個 WEB應用

4)unpackWARs如果此項設定為 true,表示把WEB 應用的WAR檔案先展開為開放目錄結構後再運作 .如果設為false将直接運作為WAR檔案 

5)alias指定主機名稱 ,可以指定多個别名

6)deployOnStartup如果此項設為 true,表示Tomcat 伺服器啟動時會自動釋出 appBase目錄下所有的Web應用。如果Web 應用中的 server.xml沒有相應的<Context> 元素,将采用 Tomcat預設的Context。即全局的context.xml配置,對所有host生效。

7)name定義虛拟主機的名字。在<Host>元素中可以包含如下子元素 <Logger>, <Realm>, <Value>,<Context>

5,<Context>元素

它由Context接口定義,是使用最頻繁的元素。每個<Context>元素代表了運作在虛拟主機上的單個 Web應用。一個<Host>可以包含多個 <Context>元素. 每個web應用有唯一的一個相對應的Context代表web應用自身。servlet容器為第一個web應用建立一個 ServletContext對象。

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

1)className指定實作Context 的類,預設為 StandardContext類

2)path指定通路 Web應用的URL 入口,注意 /myweb,而不是myweb 了事

3)reloadable如果這個屬性設為 true, Tomcat伺服器在運作狀态下會監視在 WEB-INF/classes和Web-INF/lib目錄CLASS 檔案的改運 .如果監視到有class檔案被更新 ,伺服器自重新加載Web應用 

3)cookies指定是否通過 Cookies來支援Session, 預設值為 true

4)useNaming指定是否支援 JNDI,預設值為了true在<Context> 元素中可以包含如下元素 <Logger>,<Realm>, <Resource>, <ResourceParams>

6,<Connector>元素

由Connector接口定義 .<Connector>元素代表與客戶程式實際互動的給件 ,它負責接收客戶請求,以及向客戶傳回響應結果。

<Connector port="8080" maxThread="50" minSpareThreads="25" maxSpareThread="75"  

 enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" 

 connectionTimeout="20000" disableUploadTimeout="true" />

 <Connection port="8009" enableLookups="false" redirectPort="8443" debug="0" 

 protocol="AJP/1.3" />

第一個Connector元素定義了一個 HTTP Connector,它通過8080 端口接收 HTTP請求; 

第二個Connector元素定義了一個 JD Connector,它通過8009 端口接收由其它伺服器轉發過來的請求。

Connector元素共用屬性 

1)className指定實作 Connector接口的類

2)enableLookups如果設為 true,表示支援域名解析,可以把 IP位址解析為主機名.WEB應用中調用request.getRemoteHost方法傳回客戶機主機名.預設值為 true

3)redirectPort指定轉發端口 .如果目前端口隻支援non-SSL請求 ,在需要安全通信的場命,将把客戶請求轉發至SSL的 redirectPort端口

7,HttpConnector元素的屬性

1)className實作 Connector的類

因為TCP/IP的預設端口是 80

3)address如果伺服器有二個以上 ip位址, 此屬性可以設定端口監聽的 ip位址. 預設情況下 ,端口會監聽伺服器上所有的 ip位址

4)bufferSize設定由端口建立的輸入流的緩存大小 .預設值為2048byte

5)protocol設定 Http協定, 預設值為 HTTP/1.1

6)maxThreads設定在監聽端口的線程的最大數目 ,這個值也決定了伺服器可以同時響應客戶請求的最大數目。預設值為200。

7)acceptCount設定在監聽端口隊列的最大客戶請求數量 ,預設值為10. 如果隊列已滿 ,客戶必須等待.

8)connectionTimeout定義建立客戶連接配接逾時的時間 .如果為-1, 表示不限制建立客戶連接配接的時間 

8,JkConnector的屬性 

2)port設定 AJP端口号

3)protocol必須設定為 AJP/1.3

本文轉自 leejia1989 51CTO部落格,原文連結:http://blog.51cto.com/leejia/1417887,如需轉載請自行聯系原作者