一.简述
Apache Tomcat最早是由Sun Microsystems开发的一个Servlet容器,在1999年被捐献给ASF(Apache Software Foundation),隶属于Jakarta项目,现在已经独立为一个顶级项目。Tomcat主要实现了Java EE中的Servlet、JSP规范,同时也提供HTTP服务,是市场上非常流行的Java Web容器。
简而言之,Tomcat是一个运行Java的Web服务器,底层是Socket的一个程序,它也是Servlet和JSP的一个容器。
二.版本
Tomcat | JDK | JavaEE | Servlet | JSP |
---|---|---|---|---|
9.x | >= 8 | 8 | 4.0 | 2.4? |
8.x | >= 7 | 7 | 3.1 | 2.3 |
7.x | >= 6 | 6 | 3.0 | 2.2 |
6.x | >= 5 | 5 | 2.5 | 2.1 |
5.x | >= 1.4 | 1.4 | 2.4 | 2.0 |
4.x | >= 1.3 | 1.3 | 2.3 | 1.2 |
3.x | >= 1.1 | 1.3 | 2.2 | 1.1 |
三.目录结构
apache-tomcat-8.x:
-
bin:主要存放tomcat的操作命令,根据操作系统可以分为两大类:一是以
.bat
结尾(Windows);二是以.sh
结尾(Linux/Unix)。比如可以通过startup
启动,shutdown
关闭Tomcat。e.g. OS X下启动Tomcat:
cd /安装目录/apache-tomcat-9.0.13/bin ./startup.sh /** * -bash: ./startup.sh: Permission denied * chmod u+x *.sh (修改Tomcat的bin目录下.sh的权限) */
-
conf:全局配置文件
- 一个策略文件:
- catalina.policy:当使用
-security
选项启动tomcat实例时会读取此配置文件来实现其安全运行策略;
- catalina.policy:当使用
- 两个属性文件:
- catalina.properties :Java属性的定义文件,用于设定类加载路径等,以及一些JVM性能相关的调优参数。
- logging.properties :日志相关的配置信息。
- 四个XML配置文件:
- server.xml:Tomcat的主要配置文件,配置整个服务器信息,如修改连接器端口号(默认为8080)。不能动态重加载,文件修改之后必须重启服务器才能生效。
- web.xml:全局的web应用程序部署描述文件,如可以设置tomcat支持的文件类型。
- context.xml:Tomcat的一些特定配置项,针对所有应用程序生效。
- tomcat-users.xml:配置Tomcat的用户名、密码,管理身份验证以及访问控制权限。
- 一个策略文件:
-
lib:Tomcat运行依赖的一些Jar文件,比如常见的servlet-api.jar、jsp-api.jar。所有的应用程序可用,可以放置一些公用的Jar文件,如MySQL JDBC驱动(mysql-connector-java-5.1.{xx}-bin.jar)。
-
logs:运行中产生的日志文件。包含引擎(engine)日志文件 Catalina.{yyyy-mm-dd}.log,主机日志文件localhost.{yyyy-mm-dd}.log,以及一些其他应用日志文件如manager、host-manager。访问日志也保存在此目录下。
-
temp:临时文件目录,清空不会影响Tomcat运行。
-
webapps:默认的应用程序根目录,Tomcat启动时会自动加载该目录下的应用程序,可以以文件夹、war包、jar包的形式发布(启动时会自动解压成相应的文件夹)。也可以把应用程序放置在其他路径下,需要在文件中配置路径映射。
-
work:用来存放tomcat在运行时的编译后文件,如JSP编译后的文件。清空work目录,然后重启tomcat,可以达到清除缓存的作用。
四.架构
Tomcat是一个HTTP服务器,同时也是一个Servlet容器(可以执行Servlet文件,JSP、JSF会被转换成Servlet),支持多种功能,因此采用了分层、模块化的设计。
查看conf文件夹中的server.xml文件,如上图的层次结构:
<?xml version='1.0' encoding='utf-8'?>
<Server>
<Service>
<Connector/>
<Engine>
<Host></Host>
</Engine>
</Service>
</Server>
Server
Server是一个顶级组件,代表了一个Tomcat实例,一个JVM进程中只能有一个Server实例。Tomcat提供了一个实现了 org.apache.catalina.Server
接口的 org.apache.catalina.core.StandardServer
默认类,读取Server元素配置。
<Server port="8005" shutdown="SHUTDOWN"></Server>
Server是配置文件中的最外层元素,支持以下属性:
- className:指定要使用的实现类(必须实现org.apache.catalina.Server接口)名称。如果不指定,默认使用标准实现类StandardServer。
- address:等待shutdown命令的服务器IP地址。默认是localhost。
- port:等待shutdown命令的监听端口。如果设置为-1,表示关闭shutdown端口。
- shutdown:指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串。该属性必须设置 。
启动Tomcat,打开终端输入命令 telnet localhost 8005
连接服务器,在输入 SHUTDOWN
命令即可关闭Tomcat。
Service
Server元素中可以有一个或多个Service,每个Service关联了多个Connector和一个Engine。
<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"></Engine>
</Service>
Service支持两个属性:
- className:指定要使用的实现类(必须实现
org.apache.catalina.Service
接口)名称。如果不指定,默认使用标准实现类StandardService
。 - name:Service的名称,在同一个Server元素中必须唯一,默认是Catalina。
Connector
Connector主要用来处理客户端发来的请求,一个Connector与一个TCP端口绑定,Service中默认包含两个Connector
- HTTP/1.1:处理HTTP请求,此连接器使Tomcat可以作为HTTP服务器使用。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!--
port:属性指定监听端口,默认8080端口,可修改为1024-65535间的任意一个端口
protocol:支持协议
connectionTimeout:定义连接器等待时间,默认20秒
redirectPort:SSL请求会重定向到8443端口(https)
-->
- AJP/1.3:Apache JServ 协议处理Tomcat与Apache之间的通信。Tomcat核心功能是解析Servlet,html和图片解析功能相对其他HTTP服务器较弱(如Apache HTTP Server),所以,一般都是集成使用,Apache处理静态页面请求,Tomcat处理Servlet/JSP请求。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Container
Tomcat中的容器包括:Engine、Host、Context、Cluster,层级最高的容器是Engine,最低的是Context。
-
Engine:Engine中可以包含一个或者多个Host,可以配置默认主机。Engine容器会从HTTP Connector接收HTTP请求,并且会根据主机名/IP地址交由相应的主机处理请求。
-
<Engine name="Catalina" defaultHost="localhost"></Engine>
-
Host:一个Host元素代表了一个虚拟主机,默认主机名为localhost,支持多个Context。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host> <!-- appBase:定义了应用程序的根目录,默认是webapps unpackWARS:定义了是否解压webapps中的WAR文件,如果指定为“false”,会从WAR文件直接运行程序,执行较慢 autoDeploy:把应用程序直接拖到webapps目录下,是否自动运行 -->
-
Context:Host元素定义了虚拟主机,Context则是虚拟主机下的具体应用。Tomcat启动后,webapps目录下的所有应用程序都会自动运行,访问某个具体项目需要在URL中指定项目名称,如 http://localhost:8080/examples/ ,ROOT目录除外。想要通过 http://localhost:8080 来访问自定义项目,可以把应用程序直接放到ROOT目录中(让ROOT做为项目的根目录),也可以通过Context来配置映射。
<Context path="" docBase="webapps/examples" reloadable="false"/> <!-- path:访问项目时的URL,加在localhost:8080后 docBase:path对应的项目目录 reloadable:监视 /WEB-INF/classes/ 和 /WEB-INF/lib目录中的类文件,更改后自动重载应用程序, 生成环境不建议使用,默认为“false” -->
更改server.xml文件后,重新启动Tomcat,在浏览器中输入 http://localhost:8080 即可访问examples应用。
注意修改元素的appBase的属性为空
appBase=""
,否则Tomcat启动时,examples应用会被加载两次。 -
Cluster:Cluster可以解决应用之间session共享、上下文属性共享,以及在集群内共同部署应用程序的问题。元素可以包含在或者元素下。