Tomcat篇04-部署和管理

本文主要包括tomcat服务器的web应用部署和管理,以及server.xml的主要配置。

1、manager应用

tomcat本身内置了两个web应用,专门用来管理tomcat,它们分别是host-manager(管理virtual host)和manager(管理web应用)。

1
2
http://localhost:8080/host-manager/html
http://localhost:8080/manager/html

在启动tomcat之后,我们访问上面的这两个网址可以发现被403了。因为我们还没有在配置文件中增加相关的用户,为了保证安全,这里的用户默认都是禁用的,我们需要自己创建。

我们编辑tomcat目录下的conf子目录中的tomcat-users.xml,添加对应的配置即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--admin对应的是host-manager的用户-->
<!--allows access to the HTML GUI-->
<role rolename="admin-gui"/>
<!--allows access to the text interface-->
<role rolename="admin‐script"/>

<!--manager对应的是manager的用户-->
<!--allows access to the HTML GUI and the status pages-->
<role rolename="manager-gui"/>
<!--allows access to the text interface and the status pages-->
<role rolename="manager‐script"/>
<!--allows access to the JMX proxy and the status pages-->
<role rolename="manager-jmx"/>
<!--allows access to the status pages only-->
<role rolename="manager-status"/>

<!--我们这里添加一个用户,然后定义角色即可-->
<user username="tinychen" password="tinychen#321" roles="admin‐gui,manager-gui"/>

Users with the admin-gui role should not be granted the admin-script role.

注意被授予admin-gui权限的用户不应该授予admin-script权限

Users with the manager-gui role should not be granted either the manager-script or manager-jmx roles.

注意被授予manager-gui权限的用户不应该授予manager-scriptmanager-jmx权限

tomcat9中默认是只允许部署tomcat的机器访问manger和host-manager的页面的,因此我们需要修改tomcat目录下对应的web应用的配置文件:

1
2
vim /home/tomcat9/webapps/host-manager/META-INF/context.xml 
vim /home/tomcat9/webapps/manager/META-INF/context.xml

然后修改里面限制的IP地址为全部或者自己的IP地址即可。

1
2
3
4
5
6
7
8
9
10
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)
|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

# 将allow参数改为
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="^.*$" />

然后我们就可以访问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.policycatalina.propertiescontext.xmlserver.xmltomcat-users.xmlweb.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 Elementsserver块是整个配置文件的根元素,而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块内嵌的子元素为 ListenerGlobalNamingResourcesService(可以嵌套多个)。具体的每个属性参数我们可以查询官网,下面解释默认的参数配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<Server port="8005" shutdown="SHUTDOWN">
<!--
port : Tomcat监听的关闭服务器的端口
shutdown : 关闭服务器的指令字符串
-->

<!-- 以日志形式输出服务器、操作系统、JVM的版本信息 -->
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />

<!-- 启动和停止APR。如果找不到APR库会输出日志但并不影响tomcat正常启动 -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
<!--
注意这里的SSLEngine默认是打开的(on)
如果启用了apr作为连接器的协议
但是只配置了http而没有配置https
则会报错
-->

<!-- 用于避免JRE内存泄漏问题 -->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

<!-- 用户加载(服务器启动)和销毁(服务器停止)全局命名服务 -->
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

<!-- 用于在Context停止时重建Executor池中的线程, 以避免ThreadLocal相关的内
存泄漏 -->
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

<!-- GlobalNamingResources中定义了全局命名服务: -->
<GlobalNamingResources>
<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" />
<!--这里定义的文件就是我们前面配置manager和host manager的用户的文件-->
</GlobalNamingResources>

<Service>
...
</Service>

</Server>

3.2.2 Service块

Service元素用于创建 Service 实例,默认使用 org.apache.catalina.core.StandardService。 默认情况下,Tomcat9中默认仅指定了Service的名称为Catalina

1
2
3
<Service name="Catalina">
...
</Service>

Service 可以内嵌的元素为 : ListenerExecutorConnectorEngine ,详细的参数可以点击这里查看官网

  • Listener 用于为Service 添加生命周期监听器
  • Executor 用于配置Service 共享线程池
  • Connector 用于配置 Service 包含的链接器
  • Engine 用于配置Service中连接器(connector)对应的Servlet 容器引擎

3.3 Executor

executor表示可组件之间Tomcat中共享的线程池。默认情况下,Service并未添加共享线程池配置。executor实现了tomcat中的org.apache.catalina.Executor接口。 如果不配置共享线程池,那么Catalina 各组件在用到线程池时会独立创建。由于executorService元素的嵌套元素。为了使它能够被Connector使用,Executor元素必须出现在server.xml中的Connector元素之前。下面展示的是一个简单的executor的配置,具体的配置参数可以点这里查看官网

1
2
3
4
5
6
7
8
9
10
<Executor name="tomcatThreadPool"
namePrefix="catalina‐exec‐"
maxThreads="200"
minSpareThreads="100"
maxIdleTime="60000"
maxQueueSize="Integer.MAX_VALUE"
prestartminSpareThreads="false"
threadPriority="5"
className="org.apache.catalina.core.StandardThreadExecutor"/>

属性 含义
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
2
3
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  • 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
2
3
<Engine name="Catalina" defaultHost="localhost">
……
</Engine>
  • name:用于指定Engine 的名称, 默认为Catalina
  • defaultHost:默认使用的虚拟主机名称,当客户端请求访问的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
2
3
4
5
6
7
8
<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 &quot;%r&quot; %s %b" />
<Alias>www.example.com</Alias>
<Alias>www.example2.com</Alias>
</Host>

上面这一段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
2
3
4
5
6
<Host name="localhost"  appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="myAppDeploy" path="/myApp">
....
</Context>
</Host>
  • docBase:Web应用目录或者War包的部署路径。可以是绝对路径,也可以是相对于该Context所属的Host中的appBase的相对路径。
  • path:Web应用的Context的访问路径。

假设tomcat的安装目录为/home/tomcat9,Host为默认的localhost, 则该web应用访问的根路径为: http://localhost:8080/myApp,对应的部署文件所存放的路径为:/home/tomcat9/webapps/myAppDeploy