Tomcat篇04-部署和管理
本文最后更新于:May 4, 2020 am
本文主要包括tomcat服务器的web应用部署和管理,以及server.xml的主要配置。
1、manager应用
tomcat本身内置了两个web应用,专门用来管理tomcat,它们分别是host-manager(管理virtual host)和manager(管理web应用)。
1 | |
在启动tomcat之后,我们访问上面的这两个网址可以发现被403了。因为我们还没有在配置文件中增加相关的用户,为了保证安全,这里的用户默认都是禁用的,我们需要自己创建。
我们编辑tomcat目录下的conf子目录中的tomcat-users.xml,添加对应的配置即可:
1 | |
Users with the
admin-guirole should not be granted theadmin-scriptrole.注意被授予
admin-gui权限的用户不应该授予admin-script权限Users with the
manager-guirole should not be granted either themanager-scriptormanager-jmxroles.注意被授予
manager-gui权限的用户不应该授予manager-script或manager-jmx权限
tomcat9中默认是只允许部署tomcat的机器访问manger和host-manager的页面的,因此我们需要修改tomcat目录下对应的web应用的配置文件:
1 | |
然后修改里面限制的IP地址为全部或者自己的IP地址即可。
1 | |
然后我们就可以访问web界面来查看tomcat服务器的运行状态了。
- manager的web界面

- host-manager的web界面

2、Tomcat的容器架构
Tomcat设计了4种容器,分别是Engine、Host、Context和Wrapper。这4种容器是父子关系, Tomcat通过一种分层的架构,使得Servlet容器具有很好的灵活性。

如上图所示,我们可以看到:
- 一台机器上可以通过设置不同的CATALINA_BASE来运行多个tomcat实例,即可以运行多个server
- 一个server中只有一个Engine,而Engine就是实现了servlet规范的引擎,这里就是Catalina
- 一个engine中可以包含多个host,即和apache、nginx等服务器相同,可以配置多个virtual host站点
- 一个host中可以包含多个context,即可以包含多个web应用
- 一个warpper表示一个Servlet,wrapper 作为容器中的最底层,不能包含子容器
Tomcat使用组合模式来管理这些容器,所有容器组件都实现了Container接口,因此组合模式可以使得用户对单容器对象(最底层的Wrapper)和组合容器对象(Context、Host或者Engine)的使用具有一致性。
Tomcat 服务器的配置主要集中于 tomcat/conf 下的 catalina.policy、 catalina.properties、context.xml、server.xml、tomcat-users.xml、web.xml 文件。
Tomcat的这一设计思想在其配置文件server.xml中得到了很好的诠释,server.xml 是tomcat 服务器的核心配置文件,包含了Tomcat的 Servlet 容器 (Catalina)的所有配置。下面我们先来了解一下server.xml文件中的一些主要配置。
3、server.xml
3.1 server.xml整体架构
首先我们需要知道server.xml中的xml代码块分类,tomcat官网将其主要分为四类:
- Top Level Elements:
server块是整个配置文件的根元素,而service块代表与引擎关联的一组连接器(connector)。 - Connectors :表示外部客户端向特定服务发送请求和接收响应的接口(比如我们之前提到的coyote连接器以及对应的NIO等IO模式都是整个范畴内的概念)。
- Containers:容器(
Container)负责处理传入的请求并创建相应的响应。Engine处理对Service的所有请求,Host处理对特定virtual host的所有请求,而Context处理对特定Web应用程序的所有请求。 - Nested Components:表示可以嵌套在
Container元素内的元素。 注意一些元素可以嵌套在任何Container中,而另一些元素只能嵌套在Context中。
3.2 Top Level Elements
3.2.1 Server块
Server块代表的是整个catalina servlet容器。因此,它必须是conf/server.xml配置文件中最外面的单个元素。它的属性代表了整个servlet容器的特征。Tomcat9中默认的配置文件中Server块内嵌的子元素为 Listener、GlobalNamingResources、Service(可以嵌套多个)。具体的每个属性参数我们可以查询官网,下面解释默认的参数配置。
1 | |
3.2.2 Service块
Service元素用于创建 Service 实例,默认使用 org.apache.catalina.core.StandardService。 默认情况下,Tomcat9中默认仅指定了Service的名称为Catalina。
1 | |
Service 可以内嵌的元素为 : Listener、Executor、Connector、Engine ,详细的参数可以点击这里查看官网
Listener用于为Service添加生命周期监听器Executor用于配置Service共享线程池Connector用于配置Service包含的链接器Engine用于配置Service中连接器(connector)对应的Servlet 容器引擎
3.3 Executor
executor表示可组件之间Tomcat中共享的线程池。默认情况下,Service并未添加共享线程池配置。executor实现了tomcat中的org.apache.catalina.Executor接口。 如果不配置共享线程池,那么Catalina 各组件在用到线程池时会独立创建。由于executor是Service元素的嵌套元素。为了使它能够被Connector使用,Executor元素必须出现在server.xml中的Connector元素之前。下面展示的是一个简单的executor的配置,具体的配置参数可以点这里查看官网:
1 | |
| 属性 | 含义 |
|---|---|
| name | 线程池名称,用于Connector中指定。 |
| namePrefix | 所创建的每个线程的名称前缀,一个单独的线程名称为 namePrefix+threadNumber。 |
| daemon | 是否作为守护线程(类似于守护进程),默认为true |
| maxThreads | 线程池中最大线程数。 |
| minSpareThreads | 活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。 |
| maxIdleTime | 线程空闲时间,超过该时间后,空闲线程会被销毁,默 认值为6000(1分钟),单位毫秒。 |
| maxQueueSize | 在被执行前最大线程排队数目,默认为int的最大值,也就是广义的无限。除非特殊情况,这个值不需要更改, 否则会有请求不会被处理的情况发生。 |
| prestartminSpareThreads | 启动线程池时是否启动 minSpareThreads部分线程。 默认值为false,即不启动。 |
| threadPriority | 线程池中线程优先级,默认值为5,值从1到10。 |
| className | 线程池实现类,未指定情况下,默认实现类为 org.apache.catalina.core.StandardThreadExecutor。 如果想使用自定义线程池首先需要实现 org.apache.catalina.Executor接口。 |
3.4 Connector
Connector 用于创建链接器实例。默认情况下,server.xml 配置了两个链接器,一个支 持HTTP协议,一个支持AJP协议。因此大多数情况下,我们并不需要新增链接器配置, 只是根据需要对已有链接器进行优化。
1 | |
port为监听的端口,如果设置为0,Tomcat将会随机选择一个可用的端口号给当前Connector 使用protocol为Connector的协议,这里默认的是HTTP和AJP两种协议,后面可以指定对应协议的不同版本,默认情况下会检测本机是否配置了APR库,如果有并且useAprConnector设置为true则会默认使用APR模式的IO协议,如果无则会使用NIO模式connectionTimeOut:Connector 接收链接后的等待超时时间,单位为毫秒。 -1表示永不超时redirectPort:当前Connector 不支持SSL请求, 接收到了一个请求, 并且也符合 security-constraint 约束, 需要SSL传输,Catalina自动将请求重定向到指定的端口executor: 指定前面提到的共享线程池的名称,也可以通过maxThreads、minSpareThreads 等属性对该connector进行单独配置对应的内部线程池URIEncoding: 用于指定编码URI的字符编码, Tomcat8.x和Tomcat9.x版本默认的编码为 UTF-8 , Tomcat7.x版本默认为ISO-8859-1
3.5 engine
Engine 作为Servlet 引擎的顶级元素,内部可以嵌入: Cluster、Listener、Realm、 Valve和Host。
1 | |
name:用于指定Engine 的名称, 默认为CatalinadefaultHost:默认使用的虚拟主机名称,当客户端请求访问的host无效时,会跳转到默认的host来处理请求
3.6 Host
Host 元素用于配置一个虚拟主机,它支持以下嵌入元素:Alias、Cluster、Listener、 Valve、Realm、Context
如果在Engine下配置Realm,那么此配置将在当前Engine下的所有Host中共享。 同样,如果在Host中配置Realm ,则在当前Host下的所有Context 中共享
Context中的Realm优先级 > Host的Realm优先级 > Engine中的Realm优先级
1 | |
上面这一段Host的配置文件中还额外添加了Valve配置来实现自定义的日志记录。其中一些参数的详细信息和配置方式可以查看官网的说明
。The shorthand pattern
pattern="common"corresponds to the Common Log Format defined by ‘%h %l %u %t “%r” %s %b’.
- name: 当前Host通用的网络名称,也就是常用的域名,如果有多个域名对应同一个Host的应用,我们可以设置一个或多个Alias来实现访问
- appBase:当前Host应用对应的目录,当前Host上部署的Web应用均在该目录下(相对路径和绝对路径均可),默认为webapps
- unpackWARs:设置为true,Host在启动时会将appBase目录下war包解压为目 录。设置为false,Host将直接从war文件启动
- autoDeploy: 控制tomcat是否在运行时定期检测并自动部署新增或变更的web应用
3.7 Context
Context的完整配置官网文档,Context 用于配置一个Web应用,默认的配置如下。它支持的内嵌元素为:CookieProcessor,Loader,Manager,Realm,Resources,WatchedResource,JarScanner,Valve。
1 | |
- docBase:Web应用目录或者War包的部署路径。可以是绝对路径,也可以是相对于该Context所属的Host中的
appBase的相对路径。 - path:Web应用的Context的访问路径。
假设tomcat的安装目录为/home/tomcat9,Host为默认的localhost, 则该web应用访问的根路径为: http://localhost:8080/myApp,对应的部署文件所存放的路径为:/home/tomcat9/webapps/myAppDeploy。