轉(zhuǎn)自陳明乾的博客,可能有一定更新。
轉(zhuǎn)原文聲明:
原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章 原始出處 、作者信息和本聲明。否則將追究法律責(zé)任。http://freeloda.blog.51cto.com/2033581/1299644
大綱
- 一、前言
- 二、安裝與配置Tomcat
- 三、Tomcat 目錄的結(jié)構(gòu)
- 四、Tomcat 配置文件
注,本文的測(cè)試的操作系統(tǒng)為 CentOS 6.8 x86_64,軟件版本為 jdk-8u101、apache-tomcat-7.0.70。
軟件下載地址:
- jdk 8u101:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html - apache-tomcat 7.0.70: http://tomcat.apache.org/download-70.cgi
一、前言
在上一篇博文中我們主要講解的Tomcat的基礎(chǔ)知識(shí)以及相關(guān)的Java知識(shí),對(duì)于不怎么清楚的博友可以參考一下:http://freeloda.blog.51cto.com/2033581/1298687。
在這博客中我們主要講解Tomcat的安裝與配置詳解。那下面我們就來(lái)說(shuō)一下吧!
二、安裝與配置Tomcat
1.查看一下安裝文件
[root@tomcat1 ~]# ls -1
apache-tomcat-7.0.70.tar.gz
jdk-8u101-linux-x64.rpm
2.同步一下時(shí)間
[root@tomcat java]# ntpdate 202.120.2.101
3.安裝JDK
[root@tomcat1 ~]# rpm -ivh jdk-8u101-linux-x64.rpm
4.修改環(huán)境變量
注意,CentOS 6.8 預(yù)先安裝了 OpenJDK:
[root@tomcat1 ~]# /usr/bin/java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
要使用我們安裝 jdk,應(yīng)該設(shè)置 PATH 環(huán)境變量,在搜索命令時(shí),首先查找 $JAVA_HOME/bin 下的路徑,設(shè)置環(huán)境變量如下:
[root@tomcat1 ~]# cat /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_101/
export PATH=$JAVA_HOME/bin:$PATH
使其立即生效:
[root@tomcat1 ~]# source /etc/profile.d/java.sh
5.測(cè)試一下
[root@tomcat1 ~]# java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
注:好了,到這里我們的jdk就安裝成功了。下面我們來(lái)安裝一下Tomcat!
6.解壓并創(chuàng)建鏈接
[root@tomcat1 ~]# tar -xf apache-tomcat-7.0.70.tar.gz -C /usr/local/
[root@tomcat1 ~]# cd /usr/local/
[root@tomcat1 local]# ln -sv apache-tomcat-7.0.70/ tomcat
`tomcat' -> `apache-tomcat-7.0.70/'
7.修改環(huán)境變量
[root@tomcat1 local]# cat /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
使其立即生效:
[root@tomcat1 local]# source /etc/profile.d/tomcat.sh
8.測(cè)試一下,啟動(dòng) tomcat
[root@tomcat1 local]# catalina.sh start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_101/
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
9.查看啟動(dòng)的端口
[root@tomcat1 local]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1094/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1173/master
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1383/java
tcp 0 0 :::8009 :::* LISTEN 1383/java
tcp 0 0 :::8080 :::* LISTEN 1383/java
tcp 0 0 :::22 :::* LISTEN 1094/sshd
tcp 0 0 ::1:25 :::* LISTEN 1173/master
這里有三個(gè) java 進(jìn)程:8005 是 tomcat 實(shí)例的端口,8080 是 HTTP 連接器端口,8009 是 AJP 連接器的端口:
測(cè)試訪問(wèn)一下:
注,好了到這里我們的Tomcat就安裝完成了,下面我們就來(lái)看看我們安裝的內(nèi)容。
三、Tomcat 目錄的結(jié)構(gòu)
1.Tomcat的安裝
其實(shí)對(duì)于完全由Java寫(xiě)成的Tomcat,Windows版本和Linux版本沒(méi)有多大區(qū)別,比如Linux版本,在Solaris下也沒(méi)有問(wèn)題。這里,主要以Linux版本作為示例。
注,在安裝使用Tomcat之前,先安裝JDK,最好是Sun的JDK 1 .5 以上版。我們上面已經(jīng)安裝過(guò)了,這里我們就不在多說(shuō)。
2.Tomcat的目錄結(jié)構(gòu)
首先,我們先來(lái)簡(jiǎn)單查看一下目錄文件,
[root@tomcat1 ~]# cd /usr/local/tomcat/
[root@tomcat1 tomcat]# ls -1 -F
bin/
conf/
lib/
LICENSE
logs/
NOTICE
RELEASE-NOTES
RUNNING.txt
temp/
webapps/
work/
下面我們來(lái)簡(jiǎn)單說(shuō)明下,
- bin ——Tomcat執(zhí)行腳本目錄
- conf ——Tomcat配置文件
- lib ——Tomcat運(yùn)行需要的庫(kù)文件(JARS)
- logs ——Tomcat執(zhí)行時(shí)的 LOG 文件
- temp ——Tomcat臨時(shí)文件存放目錄
- webapps ——Tomcat 的主要 Web 發(fā)布目錄(存放我們自己的JSP, SERVLET,類(lèi))
- work ——Tomcat的工作目錄,Tomcat將從JSP文件轉(zhuǎn)譯生成的Java文件和class文件放在這里。
下面我們來(lái)說(shuō)一說(shuō)各目錄中包含的文件,
bin目錄下的文件:
[root@tomcat1 tomcat]# ls bin/
bootstrap.jar daemon.sh startup.sh
catalina.bat digest.bat tomcat-juli.jar
catalina.sh digest.sh tomcat-native.tar.gz
catalina-tasks.xml setclasspath.bat tool-wrapper.bat
commons-daemon.jar setclasspath.sh tool-wrapper.sh
commons-daemon-native.tar.gz shutdown.bat version.bat
configtest.bat shutdown.sh version.sh
configtest.sh startup.bat
我們來(lái)說(shuō)說(shuō)最主要主文件有,
- catalina.sh 用于啟動(dòng)和關(guān)閉tomcat服務(wù)器
- configtest.sh 用于檢查配置文件
- startup.sh 啟動(dòng)Tomcat的腳本
- shutdown.sh 關(guān)閉Tomcat的腳本
conf目錄下的文件:
[root@tomcat1 tomcat]# ls -F conf/
Catalina/ catalina.properties logging.properties tomcat-users.xml
catalina.policy context.xml server.xml web.xml
最主要的配置文件有,
- server.xml Tomcat 的全局配置文件
- web.xml 為不同的Tomcat配置的web應(yīng)用設(shè)置缺省值的文件
- tomcat-users.xml Tomcat用戶認(rèn)證的配置文件
lib目錄下的文件:
[root@tomcat1 tomcat]# ls lib/
annotations-api.jar el-api.jar tomcat-api.jar tomcat-jdbc.jar
catalina-ant.jar jasper-el.jar tomcat-coyote.jar tomcat-util.jar
catalina-ha.jar jasper.jar tomcat-dbcp.jar websocket-api.jar
catalina.jar jsp-api.jar tomcat-i18n-es.jar
catalina-tribes.jar servlet-api.jar tomcat-i18n-fr.jar
ecj-4.4.2.jar tomcat7-websocket.jar tomcat-i18n-ja.jar
包含被Tomcat使用的各種各樣的jar文件。在Linux/UNIX上,任何這個(gè)目錄中的文件將被附加到Tomcat的classpath中。
logs目錄下的文件:
[root@tomcat1 tomcat]# ls logs/
catalina.2016-08-01.log localhost.2016-08-01.log
catalina.out localhost_access_log.2016-08-01.txt
host-manager.2016-08-01.log manager.2016-08-01.log
主要的配置文件有,
- localhost_access_log.2016-08-01.txt 訪問(wèn)日志
- localhost.2016-08-01.log 錯(cuò)誤和其它日志
- manager.2016-08-01.log 管理日志
- catalina.2016-08-01.log Tomcat啟動(dòng)或關(guān)閉日志文件
webapps目錄下的文件:
[root@tomcat1 tomcat]# ls -F webapps/
docs/ examples/ host-manager/ manager/ ROOT/
含Web應(yīng)用的程序 (JSP、Servlet和JavaBean等)
work目錄下的配置文件:
[root@tomcat1 tomcat]# ls work/
Catalina
[root@tomcat1 tomcat]# ls work/Catalina/
localhost
[root@tomcat1 tomcat]# ls -F work/Catalina/localhost/
_/ docs/ examples/ host-manager/ manager/
它們由Tomcat自動(dòng)生成,這是Tomcat放置它運(yùn)行期間的中間(intermediate)文件(諸如編譯的JSP文件)地方。 如果當(dāng)Tomcat運(yùn)行時(shí),你刪除了這個(gè)目錄那么將不能夠執(zhí)行包含JSP的頁(yè)面。
好了,Tomcat的目錄結(jié)構(gòu)我們就說(shuō)到這了,下面我們來(lái)說(shuō)說(shuō)Tomcat應(yīng)用程序的組成。
3.Tomcat 應(yīng)用程序的組成
注,上面的內(nèi)容中我們講解了Tomcat的目錄結(jié)構(gòu),其中有個(gè)目錄是webapps,主要存放Web應(yīng)用程序。那我們下面來(lái)說(shuō)一說(shuō)Web應(yīng)用程序的組成。
按照Tomcat的規(guī)范,Tomcat的Web應(yīng)用程序應(yīng)該由如下目錄組成,
(1).頁(yè)面內(nèi)容等文件的存放位置:*.html, *.jsp等可以有許多目錄層次,由用戶的網(wǎng)站結(jié)構(gòu)而定,實(shí)現(xiàn)的功能應(yīng)該是網(wǎng)站的界面,也就是用戶主要的可見(jiàn)部分。除了HTML文件、JSP文件外,還有js(JavaScript)文件和css(樣式表)文件以及其他多媒體文件等。
(2).Web-INF/web.xml 這是一個(gè)Web應(yīng)用程序的描述文件。這個(gè)文件是一個(gè)XML文件,描述了Servlet和這個(gè)Web應(yīng)用程序的其他組件信息,此外還包括一些初始化信息和安全約束等等。
(3).Web-INF/classes/ 這個(gè)目錄及其下的子目錄應(yīng)該包括這個(gè)Web應(yīng)用程序的所有JavaBean及Servlet等編譯好的Java類(lèi)文件(.class)文件,以及沒(méi)有被壓縮打入JAR包的其他class文件和相關(guān)資源。注意,在這個(gè)目錄下的Java類(lèi)應(yīng)該按照其所屬的包層次組織目錄(即如果該.class文件具有包的定義,則該*.class文件應(yīng)該放在.\WEB-INF\classes\包名下)。
(4).通常Web-INF/classes/ 這個(gè)目錄下的類(lèi)文件也可以打包成JAR文件,并可以放到WEB-INF下的lib目錄下。如將 classes目錄下的各個(gè)*.class文件打包成WebMis.jar文件(jar cvf WebMis.jar .)
注,
- WEB-INF目錄中包含應(yīng)用軟件所使用的資源,但是WEB-INF卻不在公共文檔根目錄之中。在這個(gè)目錄中所包含的文件都不能被客戶機(jī)所訪問(wèn)。
- 類(lèi)目錄中(在WEB-INF下)包含運(yùn)行Web應(yīng)用程序時(shí)所需的Servlets,Beans等類(lèi)。
- lib目錄(在WEB-INF下)包含有Java archive files (JARs),例如標(biāo)簽庫(kù)或者Servlets,Beans等類(lèi)的*.jar文件。
- 如果一個(gè)類(lèi)出現(xiàn)在JAR文件中同時(shí)也出現(xiàn)在類(lèi)的目錄中,類(lèi)加載器會(huì)加載位于類(lèi)目錄中的那一個(gè)。
(5). common/lib/ 這個(gè)目錄下包含了所有壓縮到JAR文件中的類(lèi)文件和相關(guān)文件。比如:第三方提供的Java庫(kù)文件、JDBC驅(qū)動(dòng)程序等。
- 其中msbase.jar、mssqlserver.jar、msutil.jar文件為SqlServer2000的JDBC驅(qū)動(dòng)程序
- 其中servlet-api.jar和jsp-api.jar為Servlet和JSP的API所在的包
好了,Tomcat的應(yīng)用程序的能成我們就基本說(shuō)到這里了,下面我們來(lái)看一下默認(rèn)Web程序的目錄結(jié)構(gòu)。
[root@tomcat1 WEB-INF]# cd /usr/local/tomcat/
[root@tomcat1 tomcat]# ls -F
bin/ lib/ logs/ RELEASE-NOTES temp/ work/
conf/ LICENSE NOTICE RUNNING.txt webapps/
[root@tomcat1 tomcat]# cd webapps/;
[root@tomcat1 webapps]# ls -F
docs/ examples/ host-manager/ manager/ ROOT/
[root@tomcat1 webapps]# cd examples/
[root@tomcat1 examples]# ls -F
index.html jsp/ servlets/ WEB-INF/ websocket/ websocket-deprecated/
[root@tomcat1 examples]# cd WEB-INF/
[root@tomcat1 WEB-INF]# ls -F
classes/ jsp/ jsp2/ lib/ tags/ web.xml
到這里我們的Tomcat的目錄結(jié)構(gòu)就講解完成了,下面我們得來(lái)詳細(xì)說(shuō)說(shuō),Tomcat的配置文件。
四、Tomcat 配置文件
1.簡(jiǎn)介
查看一下默認(rèn)配置文件,
[root@tomcat1 WEB-INF]# ls -F /usr/local/tomcat/conf/
Catalina/ catalina.properties logging.properties tomcat-users.xml
catalina.policy context.xml server.xml web.xml
Tomcat的配置文件默認(rèn)存放在 $CATALINA_HOME/conf 目錄中,主要有以下幾個(gè):
- server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主組件的相關(guān)配置信息;
- web.xml:遵循Servlet規(guī)范標(biāo)準(zhǔn)的配置文件,用于配置servlet,并為所有的Web應(yīng)用程序提供包括MIME映射等默認(rèn)配置信息;
- tomcat-user.xml:Realm認(rèn)證時(shí)用到的相關(guān)角色、用戶和密碼等信息;Tomcat自帶的manager默認(rèn)情況下會(huì)用到此文件;在Tomcat中添加/刪除用戶,為用戶指定角色等將通過(guò)編輯此文件實(shí)現(xiàn);
- catalina.policy:Java相關(guān)的安全策略配置文件,在系統(tǒng)資源級(jí)別上提供訪問(wèn)控制的能力;
- catalina.properties:Tomcat內(nèi)部package的定義及訪問(wèn)相關(guān)的控制,也包括對(duì)通過(guò)類(lèi)裝載器裝載的內(nèi)容的控制;Tomcat在啟動(dòng)時(shí)會(huì)事先讀取此文件的相關(guān)設(shè)置;
- logging.properties: Tomcat通過(guò)自己內(nèi)部實(shí)現(xiàn)的JAVA日志記錄器來(lái)記錄操作相關(guān)的日志,此文件即為日志記錄器相關(guān)的配置信息,可以用來(lái)定義日志記錄的組件級(jí)別以及日志文件的存在位置等;
- context.xml:所有host的默認(rèn)配置信息;
注,下面我們對(duì)常用的配置文件進(jìn)行詳解。
2.server.xml
首先,我們來(lái)查看一下默認(rèn)的server.xml文件,
Tomcat以面向?qū)ο蟮姆绞竭\(yùn)行,它可以在運(yùn)行時(shí)動(dòng)態(tài)加載配置文件中定義的對(duì)象結(jié)構(gòu),這有點(diǎn)類(lèi)似于apache的httpd模塊的調(diào)用方式。server.xml中定義的每個(gè)主元素都會(huì)被創(chuàng)建為對(duì)象,并以某特定的層次結(jié)構(gòu)將這些對(duì)象組織在一起。下面是默認(rèn)配置,
[root@tomcat1 WEB-INF]# cd /usr/local/tomcat/conf/
[root@tomcat1 conf]# cat server.xml
<?xml version='1.0' encoding='utf-8'?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- Note: A "Server" is not itself a "Container", so you may not
define subcomponents such as "Valves" at this level.
Documentation at /docs/config/server.html
-->
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- Security listener. Documentation at /docs/config/listeners.html
<Listener className="org.apache.catalina.security.SecurityListener" />
-->
<!--APR library loader. Documentation at /docs/apr.html -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
<Listener className="org.apache.catalina.core.JasperListener" />
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!-- Global JNDI resources
Documentation at /docs/jndi-resources-howto.html
-->
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<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>
<!-- A "Service" is a collection of one or more "Connectors" that share
a single "Container" Note: A "Service" is not itself a "Container",
so you may not define subcomponents such as "Valves" at this level.
Documentation at /docs/config/service.html
-->
<Service name="Catalina">
<!--The connectors can use a shared executor, you can define one or more named thread pools-->
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
<!-- Define a SSL HTTP/1.1 Connector on port 8443
This connector uses the BIO implementation that requires the JSSE
style configuration. When using the APR/native implementation, the
OpenSSL style configuration is required as described in the APR/native
documentation -->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<!-- An Engine represents the entry point (within Catalina) that processes
every request. The Engine implementation for Tomcat stand alone
analyzes the HTTP headers included with the request, and passes them
on to the appropriate Host (virtual host).
Documentation at /docs/config/engine.html -->
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->
<Engine name="Catalina" defaultHost="localhost">
<!--For clustering, please take a look at documentation at:
/docs/cluster-howto.html (simple how to)
/docs/config/cluster.html (reference documentation) -->
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
<!-- Use the LockOutRealm to prevent attempts to guess user passwords
via a brute-force attack -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- This Realm uses the UserDatabase configured in the global JNDI
resources under the key "UserDatabase". Any edits
that are performed against this UserDatabase are immediately
available for use by the Realm. -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
注,看上去很復(fù)雜。其實(shí),大部分都是注釋。下面是一個(gè)簡(jiǎn)圖說(shuō)明了各組件之間的關(guān)系!
<Server> 頂層元素,代表一個(gè)服務(wù)器
<Service> 頂層元素,是Connector的集合,只有一個(gè)Engine
<Connectior/> 連接器類(lèi)元素,代表通信接口
<Engine> 容器類(lèi)元素,為特定的Service組件處理所有客戶請(qǐng)求,可包含多個(gè)Host
<Host> 為特定的虛擬主機(jī)處理所有客戶請(qǐng)求
<Context> 為特定的WEB應(yīng)用處理所有客戶請(qǐng)求
</Context>
</Host>
</Engine>
</Service>
</Server>
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等。
下面簡(jiǎn)單介紹幾個(gè)常用組件:
(1).Server組件
如上面示例文件中定義的:
<Server port=”8005” shutdown=”SHUTDOWN”>
這會(huì)讓Tomcat啟動(dòng)一個(gè)server實(shí)例(即一個(gè)JVM),它監(jiān)聽(tīng)在8005端口以接收shutdown命令。各Server的定義不能使用同一個(gè)端口,這意味著如果在同一個(gè)物理機(jī)上啟動(dòng)了多個(gè)Server實(shí)例,必須配置它們使用不同的端口。這個(gè)端口的定義用于為管理員提供一個(gè)關(guān)閉此實(shí)例的便捷途徑,因此,管理員可以直接telnet至此端口使用SHUTDOWN命令關(guān)閉此實(shí)例。不過(guò),基于安全角度的考慮,這通常不允許遠(yuǎn)程進(jìn)行。
Server的相關(guān)屬性:
- className: 用于實(shí)現(xiàn)此Server容器的完全限定類(lèi)的名稱(chēng),默認(rèn)為org.apache.catalina.core.StandardServer;
- port: 接收shutdown指令的端口,默認(rèn)僅允許通過(guò)本機(jī)訪問(wèn),默認(rèn)為8005;
- shutdown:發(fā)往此Server用于實(shí)現(xiàn)關(guān)閉tomcat實(shí)例的命令字符串,默認(rèn)為SHUTDOWN;
(2).Service組件
Service主要用于關(guān)聯(lián)一個(gè)引擎和與此引擎相關(guān)的連接器,每個(gè)連接器通過(guò)一個(gè)特定的端口和協(xié)議接收入站請(qǐng)求,將其轉(zhuǎn)發(fā)至關(guān)聯(lián)的引擎進(jìn)行處理。因此,Service要包含一個(gè)引擎、一個(gè)或多個(gè)連接器。
如上面示例中的定義:
<Service name=”Catalina”>
這定義了一個(gè)名為Catalina的Service,此名字也會(huì)在產(chǎn)生相關(guān)的日志信息時(shí)記錄在日志文件當(dāng)中。
Service相關(guān)的屬性:
- className: 用于實(shí)現(xiàn)service的類(lèi)名,一般都是org.apache.catalina.core.StandardService。
- name:此服務(wù)的名稱(chēng),默認(rèn)為Catalina;
(3).Connector組件
進(jìn)入Tomcat的請(qǐng)求可以根據(jù)Tomcat的工作模式分為如下兩類(lèi):
- Tomcat作為應(yīng)用程序服務(wù)器:請(qǐng)求來(lái)自于前端的web服務(wù)器,這可能是Apache, IIS, Nginx等;
- Tomcat作為獨(dú)立服務(wù)器:請(qǐng)求來(lái)自于web瀏覽器;
Tomcat應(yīng)該考慮工作情形并為相應(yīng)情形下的請(qǐng)求分別定義好需要的連接器才能正確接收來(lái)自于客戶端的請(qǐng)求。一個(gè)引擎可以有一個(gè)或多個(gè)連接器,以適應(yīng)多種請(qǐng)求方式。
定義連接器可以使用多種屬性,有些屬性也只適用于某特定的連接器類(lèi)型。一般說(shuō)來(lái),常見(jiàn)于server.xml中的連接器類(lèi)型通常有4種:
- HTTP連接器
- SSL連接器
- AJP 1.3連接器
- proxy連接器
如上面示例server.xml中定義的HTTP連接器:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
定義連接器時(shí)可以配置的屬性非常多,但通常定義HTTP連接器時(shí)必須定義的屬性只有“port”,定義AJP連接器時(shí)必須定義的屬性只有"protocol",因?yàn)槟J(rèn)的協(xié)議為HTTP。以下為常用屬性的說(shuō)明:
- address:指定連接器監(jiān)聽(tīng)的地址,默認(rèn)為所有地址,即0.0.0.0;
- maxThreads:支持的最大并發(fā)連接數(shù),默認(rèn)為200;
- port:監(jiān)聽(tīng)的端口,默認(rèn)為0;
- protocol:連接器使用的協(xié)議,默認(rèn)為HTTP/1.1,定義AJP協(xié)議時(shí)通常為AJP/1.3;
- redirectPort:如果某連接器支持的協(xié)議是HTTP,當(dāng)接收客戶端發(fā)來(lái)的HTTPS請(qǐng)求時(shí),則轉(zhuǎn)發(fā)至此屬性定義的端口;
- connectionTimeout:等待客戶端發(fā)送請(qǐng)求的超時(shí)時(shí)間,單位為毫秒,默認(rèn)為60000,即1分鐘;
- enableLookups:是否通過(guò)request.getRemoteHost()進(jìn)行DNS查詢以獲取客戶端的主機(jī)名;默認(rèn)為true;
- acceptCount:設(shè)置等待隊(duì)列的最大長(zhǎng)度;通常在tomcat所有處理線程均處于繁忙狀態(tài)時(shí),新發(fā)來(lái)的請(qǐng)求將被放置于等待隊(duì)列中;
下面是一個(gè)定義了多個(gè)屬性的SSL連接器:
<Connector port="8443"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" acceptCount="100" debug="0" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
(4).Engine組件
Engine是Servlet處理器的一個(gè)實(shí)例,即servlet引擎,默認(rèn)為定義在 server.xml 中的 Catalina。Engine 需要 defaultHost 屬性來(lái)為其定義一個(gè)接收所有發(fā)往非明確定義虛擬主機(jī)的請(qǐng)求的host組件。如前面示例中定義的:
<Engine name="Catalina" defaultHost="localhost">
常用的屬性定義:
- defaultHost:Tomcat支持基于FQDN的虛擬主機(jī),這些虛擬主機(jī)可以通過(guò)在Engine容器中定義多個(gè)不同的Host組件來(lái)實(shí)現(xiàn);但如果此引擎的連接器收到一個(gè)發(fā)往非非明確定義虛擬主機(jī)的請(qǐng)求時(shí)則需要將此請(qǐng)求發(fā)往一個(gè)默認(rèn)的虛擬主機(jī)進(jìn)行處理,因此,在Engine中定義的多個(gè)虛擬主機(jī)的主機(jī)名稱(chēng)中至少要有一個(gè)跟defaultHost定義的主機(jī)名稱(chēng)同名;
- name:Engine組件的名稱(chēng),用于日志和錯(cuò)誤信息記錄時(shí)區(qū)別不同的引擎;
注,Engine容器中可以包含Realm、Host、Listener和Valve子容器。
(5).Host組件
位于Engine容器中用于接收請(qǐng)求并進(jìn)行相應(yīng)處理的主機(jī)或虛擬主機(jī),如前面默認(rèn)配置文件中定義:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
常用屬性說(shuō)明:
- appBase:此Host的webapps目錄,即存放非歸檔的web應(yīng)用程序的目錄或歸檔后的WAR文件的目錄路徑;可以使用基于$CATALINA_HOME的相對(duì)路徑;
- autoDeploy:在Tomcat處于運(yùn)行狀態(tài)時(shí)放置于appBase目錄中的應(yīng)用程序文件是否自動(dòng)進(jìn)行deploy;默認(rèn)為true;
- unpackWars:在啟用此webapps時(shí)是否對(duì)WAR格式的歸檔文件先進(jìn)行展開(kāi);默認(rèn)為true;
下面是虛擬主機(jī)定義示例:
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps">
<Context path="" docBase="ROOT"/>
<Context path="/bbs" docBase="/web/bss"
reloadable="true" crossContext="true"/>
</Host>
<Host name="mail.test.com" appBase="/web/mail">
<Context path="" docBase="ROOT"/>
</Host>
</Engine>
主機(jī)別名定義:
如果一個(gè)主機(jī)有兩個(gè)或兩個(gè)以上的主機(jī)名,額外的名稱(chēng)均可以以別名的形式進(jìn)行定義,如下:
<Host name="www.test.com" appBase="webapps" unpackWARs="true">
<Alias>test.com</Alias>
</Host>
(6).Context組件
Context在某些意義上類(lèi)似于apache中的路徑別名,一個(gè)Context定義用于標(biāo)識(shí)tomcat實(shí)例中的一個(gè)Web應(yīng)用程序;如下面的定義:
<!-- Tomcat Root Context -->
<Context path="" docBase="/web/webapps"/>
<!-- buzzin webapp -->
<Context path="/bbs"
docBase="/web/threads/bbs"
reloadable="true">
</Context>
<!-- chat server -->
<Context path="/chat" docBase="/web/chat"/>
<!-- darian web -->
<Context path="/darian" docBase="darian"/>
在Tomcat中,每一個(gè)context定義也可以使用一個(gè)單獨(dú)的XML文件進(jìn)行,其文件的目錄為
$CATALINA_HOME/conf/<engine name>/<hostname>。
可以用于Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。
常用的屬性定義有:
- docBase:相應(yīng)的Web應(yīng)用程序的存放位置;也可以使用相對(duì)路徑,起始路徑為此Context所屬Host中appBase定義的路徑;切記,docBase的路徑名不能與相應(yīng)的Host中appBase中定義的路徑名有包含關(guān)系,比如,如果appBase為deploy,而docBase絕不能為deploy-bbs類(lèi)的名字;
- path:相對(duì)于Web服務(wù)器根路徑而言的URI;如果為空“”,則表示為此webapp的根路徑;如果context定義在一個(gè)單獨(dú)的xml文件中,此屬性不需要定義;
- reloadable:是否允許重新加載此context相關(guān)的Web應(yīng)用程序的類(lèi);默認(rèn)為false;
(7).Realm組件
一個(gè)Realm表示一個(gè)安全上下文,它是一個(gè)授權(quán)訪問(wèn)某個(gè)給定Context的用戶列表和某用戶所允許切換的角色相關(guān)定義的列表。因此,Realm就像是一個(gè)用戶和組相關(guān)的數(shù)據(jù)庫(kù)。定義Realm時(shí)惟一必須要提供的屬性是classname,它是Realm的多個(gè)不同實(shí)現(xiàn),用于表示此Realm認(rèn)證的用戶及角色等認(rèn)證信息的存放位置。
- JAASRealm:基于Java Authintication and Authorization Service實(shí)現(xiàn)用戶認(rèn)證;
- JDBCRealm:通過(guò)JDBC訪問(wèn)某關(guān)系型數(shù)據(jù)庫(kù)表實(shí)現(xiàn)用戶認(rèn)證;
- JNDIRealm:基于JNDI使用目錄服務(wù)實(shí)現(xiàn)認(rèn)證信息的獲取;
- MemoryRealm:查找tomcat-user.xml文件實(shí)現(xiàn)用戶信息的獲取;
- UserDatabaseRealm:基于UserDatabase文件(通常是tomcat-user.xml)實(shí)現(xiàn)用戶認(rèn)證,它實(shí)現(xiàn)是一個(gè)完全可更新和持久有效的MemoryRealm,因此能夠跟標(biāo)準(zhǔn)的MemoryRealm兼容;它通過(guò)JNDI實(shí)現(xiàn);
下面是一個(gè)常見(jiàn)的使用UserDatabase的配置:
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>
下面是一個(gè)使用JDBC方式獲取用戶認(rèn)證信息的配置:
<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/authority"
connectionName="test" connectionPassword="test"
userTable="users" userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" />
(8).Valve組件
Valve類(lèi)似于過(guò)濾器,它可以工作于Engine和Host/Context之間、Host和Context之間以及Context和Web應(yīng)用程序的某資源之間。一個(gè)容器內(nèi)可以建立多個(gè)Valve,而且Valve定義的次序也決定了它們生效的次序。Tomcat中實(shí)現(xiàn)了多種不同的Valve:
- AccessLogValve:訪問(wèn)日志Valve
- ExtendedAccessValve:擴(kuò)展功能的訪問(wèn)日志Valve
- JDBCAccessLogValve:通過(guò)JDBC將訪問(wèn)日志信息發(fā)送到數(shù)據(jù)庫(kù)中;
- RequestDumperValve:請(qǐng)求轉(zhuǎn)儲(chǔ)Valve;
- RemoteAddrValve:基于遠(yuǎn)程地址的訪問(wèn)控制;
- RemoteHostValve:基于遠(yuǎn)程主機(jī)名稱(chēng)的訪問(wèn)控制;
- SemaphoreValve:用于控制Tomcat主機(jī)上任何容器上的并發(fā)訪問(wèn)數(shù)量;
- JvmRouteBinderValve:在配置多個(gè)Tomcat為以Apache通過(guò)mod_proxy或mod_jk作為前端的集群架構(gòu)中,當(dāng)期望停止某節(jié)點(diǎn)時(shí),可以通過(guò)此Valve將用記請(qǐng)求定向至備用節(jié)點(diǎn);使用此Valve,必須使用JvmRouteSessionIDBinderListener;
- ReplicationValve:專(zhuān)用于Tomcat集群架構(gòu)中,可以在某個(gè)請(qǐng)求的session信息發(fā)生更改時(shí)觸發(fā)session數(shù)據(jù)在各節(jié)點(diǎn)間進(jìn)行復(fù)制;
- SingleSignOn:將兩個(gè)或多個(gè)需要對(duì)用戶進(jìn)行認(rèn)證webapp在認(rèn)證用戶時(shí)連接在一起,即一次認(rèn)證即可訪問(wèn)所有連接在一起的webapp;
- ClusterSingleSingOn:對(duì)SingleSignOn的擴(kuò)展,專(zhuān)用于Tomcat集群當(dāng)中,需要結(jié)合ClusterSingleSignOnListener進(jìn)行工作;
RemoteHostValve和RemoteAddrValve可以分別用來(lái)實(shí)現(xiàn)基于主機(jī)名稱(chēng)和基于IP地址的訪問(wèn)控制,控制本身可以通過(guò)allow或deny來(lái)進(jìn)行定義,這有點(diǎn)類(lèi)似于Apache的訪問(wèn)控制功能;如下面的Valve則實(shí)現(xiàn)了僅允許本機(jī)訪問(wèn)/probe:
<Context path="/probe" docBase="probe">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1"/>
</Context>
其中相關(guān)屬性定義有:
- className:相關(guān)的java實(shí)現(xiàn)的類(lèi)名,相應(yīng)于分別應(yīng)該為org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;
- allow:以逗號(hào)分開(kāi)的允許訪問(wèn)的IP地址列表,支持正則表達(dá)式,因此,點(diǎn)號(hào)“.”用于IP地址時(shí)需要轉(zhuǎn)義;僅定義allow項(xiàng)時(shí),非明確allow的地址均被deny;
- deny: 以逗號(hào)分開(kāi)的禁止訪問(wèn)的IP地址列表,支持正則表達(dá)式;使用方式同allow;
(9).GlobalNamingResources
應(yīng)用于整個(gè)服務(wù)器的JNDI映射,此可以避免每個(gè)Web應(yīng)用程序都需要在各自的web.xml創(chuàng)建,這在web應(yīng)用程序以WAR的形式存在時(shí)尤為有用。它通常可以包含三個(gè)子元素:
- Environment;
- Resource;
- ResourceEnvRef;
(10).WatchedResource
WatchedResource可以用于Context中監(jiān)視指定的webapp程序文件的改變,并且能夠在監(jiān)視到文件內(nèi)容發(fā)生改變時(shí)重新裝載此文件。
(11).Listener
Listener用于創(chuàng)建和配置LifecycleListener對(duì)象,而LifecycleListener通常被開(kāi)發(fā)人員用來(lái)創(chuàng)建和刪除容器。
(12).Loader
Java的動(dòng)態(tài)裝載功能是其語(yǔ)言功能強(qiáng)大表現(xiàn)之一,Servlet容器使用此功能在運(yùn)行時(shí)動(dòng)態(tài)裝載servlet和它們所依賴(lài)的類(lèi)。Loader可以用于Context中控制java類(lèi)的加載。
(13).Manager
Manger對(duì)象用于實(shí)現(xiàn)HTTP會(huì)話管理的功能,Tomcat中有5種Manger的實(shí)現(xiàn):
StandardManager
Tomcat的默認(rèn)會(huì)話管理器,用于非集群環(huán)境中對(duì)單個(gè)處于運(yùn)行狀態(tài)的Tomcat實(shí)例會(huì)話進(jìn)行管理。當(dāng)Tomcat關(guān)閉時(shí),這些會(huì)話相關(guān)的數(shù)據(jù)會(huì)被寫(xiě)入磁盤(pán)上的一個(gè)名叫SESSION.ser的文件,并在Tomcat下次啟動(dòng)時(shí)讀取此文件。PersistentManager
當(dāng)一個(gè)會(huì)話長(zhǎng)時(shí)間處于空閑狀態(tài)時(shí)會(huì)被寫(xiě)入到swap會(huì)話對(duì)象,這對(duì)于內(nèi)存資源比較吃緊的應(yīng)用環(huán)境來(lái)說(shuō)比較有用。
3)DeltaManager
用于Tomcat集群的會(huì)話管理器,它通過(guò)將改變了會(huì)話數(shù)據(jù)同步給集群中的其它節(jié)點(diǎn)實(shí)現(xiàn)會(huì)話復(fù)制。這種實(shí)現(xiàn)會(huì)將所有會(huì)話的改變同步給集群中的每一個(gè)節(jié)點(diǎn),也是在集群環(huán)境中用得最多的一種實(shí)現(xiàn)方式。BackupManager
用于Tomcat集群的會(huì)話管理器,與DeltaManager不同的是,某節(jié)點(diǎn)會(huì)話的改變只會(huì)同步給集群中的另一個(gè)而非所有節(jié)點(diǎn)。
5)SimpleTcpReplicationManager
Tomcat4時(shí)用到的版本,過(guò)于老舊了。
(14).Stores
PersistentManager必須包含一個(gè)Store元素以指定將會(huì)話數(shù)據(jù)存儲(chǔ)至何處。這通常有兩種實(shí)現(xiàn)方式:FileStore和JDBCStore。
(15).Resources
經(jīng)常用于實(shí)現(xiàn)在Context中指定需要裝載的但不在Tomcat本地磁盤(pán)上的應(yīng)用資源,如Java類(lèi),HTML頁(yè)面,JSP文件等。
(16).Cluster
專(zhuān)用于配置Tomcat集群的元素,可用于Engine和Host容器中。在用于Engine容器中時(shí),Engine中的所有Host均支持集群功能。在Cluster元素中,需要直接定義一個(gè)Manager元素,這個(gè)Manager元素有一個(gè)其值為org.apache.catalina.ha.session.DeltaManager或org.apache.catalina.ha.session.BackupManager的className屬性。同時(shí),Cluster中還需要分別定義一個(gè)Channel和ClusterListener元素。
- Channel 用于Cluster中給集群中同一組中的節(jié)點(diǎn)定義通信“信道”。Channel中需要至少定義Membership、Receiver和Sender三個(gè)元素,此外還有一個(gè)可選元素Interceptor。
- Membership 用于Channel中配置同一通信信道上節(jié)點(diǎn)集群組中的成員情況,即監(jiān)控加入當(dāng)前集群組中的節(jié)點(diǎn)并在各節(jié)點(diǎn)間傳遞心跳信息,而且可以在接收不到某成員的心跳信息時(shí)將其從集群節(jié)點(diǎn)中移除。Tomcat中Membership的實(shí)現(xiàn)是org.apache.catalina.tribes.membership.McastService。
- Sender 用于Channel中配置“復(fù)制信息”的發(fā)送器,實(shí)現(xiàn)發(fā)送需要同步給其它節(jié)點(diǎn)的數(shù)據(jù)至集群中的其它節(jié)點(diǎn)。發(fā)送器不需要屬性的定義,但可以在其內(nèi)部定義一個(gè)Transport元素。
- Transport 用于Sender內(nèi)部,配置數(shù)據(jù)如何發(fā)送至集群中的其它節(jié)點(diǎn)。Tomcat有兩種Transport的實(shí)現(xiàn): 1) PooledMultiSender基于Java阻塞式IO,可以將一次將多個(gè)信息并發(fā)發(fā)送至其它節(jié)點(diǎn),但一次只能傳送給一個(gè)節(jié)點(diǎn)。 2)PooledParallelSener 基于Java非阻塞式IO,即NIO,可以一次發(fā)送多個(gè)信息至一個(gè)或多個(gè)節(jié)點(diǎn)。
- Receiver 用于Channel定義某節(jié)點(diǎn)如何從其它節(jié)點(diǎn)的Sender接收復(fù)制數(shù)據(jù),Tomcat中實(shí)現(xiàn)的接收方式有兩種BioReceiver和NioReceiver。
3.web.xml
web.xml基于Java Servlet規(guī)范,可被用于每一個(gè)Java servlet容器,通常有兩個(gè)存放位置,$CATALINA_BASE/conf和每個(gè)Web應(yīng)用程序(通常是WEB-INF/web.xml)。Tomcat在deploy一個(gè)應(yīng)用程序時(shí)(包括重啟或重新載入),它首先讀取conf/web.xml,而后讀取WEB-INF/web.xml。
好了,到這里Tomcat服務(wù)器的安裝與配置以及各組件詳解就說(shuō)到這里了,希望大家有所收獲_…… 在前面的兩篇博客中我們主要講解了,Tomcat相關(guān)的理論知識(shí)與相關(guān)組件的講解,從下一篇博客開(kāi)始,我們將講解Tomcat的相關(guān)操作,包括Nginx結(jié)合Tomcat、Apache結(jié)合Tomcat、Tomcat集群講解等。