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-gui
role should not be granted theadmin-script
role.注意被授予
admin-gui
权限的用户不应该授予admin-script
权限Users with the
manager-gui
role should not be granted either themanager-script
ormanager-jmx
roles.注意被授予
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
。