本文主要包括tomcat服务器的web应用部署和管理,以及server.xml
的主要配置。
1、manager应用
tomcat本身内置了两个web应用,专门用来管理tomcat,它们分别是host-manager(管理virtual host)和manager(管理web应用)。
http://localhost:8080/host-manager/html
http://localhost:8080/manager/html
在启动tomcat之后,我们访问上面的这两个网址可以发现被403了。因为我们还没有在配置文件中增加相关的用户,为了保证安全,这里的用户默认都是禁用的,我们需要自己创建。
我们编辑tomcat目录下的conf子目录中的tomcat-users.xml
,添加对应的配置即可:
<!--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 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应用的配置文件:
vim /home/tomcat9/webapps/host-manager/META-INF/context.xml
vim /home/tomcat9/webapps/manager/META-INF/context.xml
然后修改里面限制的IP地址为全部或者自己的IP地址即可。
<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容器具有很好的灵活性。
image如上图所示,我们可以看到:
- 一台机器上可以通过设置不同的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
(可以嵌套多个)。具体的每个属性参数我们可以查询官网,下面解释默认的参数配置。
<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
。
<Service name="Catalina">
...
</Service>
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的配置,具体的配置参数可以点这里查看官网:
<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协议。因此大多数情况下,我们并不需要新增链接器配置, 只是根据需要对已有链接器进行优化。
<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。
<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优先级
<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 "%r" %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。
<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
网友评论