文章目录
- 1.Tomcat简介
- 2.Tomcat原理架构
- 2.1.总体架构
- 2.2.连接器
- 2.2.1.具体功能
- 2.2.2.IO模型
- 2.2.3.逻辑处理流程
- 2.2.4.内部处理流程
- 2.3.容器
- 2.4.启动过程
- 2.5.请求过程
- 3.Tomcat适用场景
- 4.Tomcat与其他Web容器对比
- 5.Tomcat安装和启动
- 5.1.Java环境变量
- 5.2.系统服务
- 5.3.启动关闭
- 6.Tomcat配置文件解析
- 6.1.目录结构
- 6.2.配置文件介绍
- 6.3.context.xml
- 6.4.server.xml
- 6.5.web.xml
- 6.6.tomcat-users.xml
1.Tomcat简介
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。
Tomcat最初是由Sun的软件架构师詹姆斯·邓肯·戴维森开发的。后来他帮助将其变为开源项目,并由Sun贡献给Apache软件基金会。由于大部分开源项目O’Reilly都会出一本相关的书,并且将其封面设计成某个动物的素描,因此他希望将此项目以一个动物的名字命名。因为他希望这种动物能够自己照顾自己,最终,他将其命名为Tomcat(英语公猫或其他雄性猫科动物)。而O’Reilly出版的介绍Tomcat的书籍的封面也被设计成了一个公猫的形象。而Tomcat的Logo兼吉祥物也被设计为一只公猫。
2.Tomcat原理架构
2.1.总体架构
Tomcat最主要的为两个组件是连接器(connector)和容器(container)。多个connector和一个container组成一个service,service用于对外提供服务,而service的生命周期由server来控制。server属于最顶层的抽象。
连接器(connector):也可以叫Coyote,Coyote是Connector框架的名字,负责在服务器端处理客户端连接,如socket连接,request封装,连接线程池等工作。Service 只是在 Connector 和 Container 外面多包一层,把它们组装在一起,向外面提供服务,一个 Service 可以设置多个 Connector,但是只能有一个 Container 容器。所有组件的生命周期都使用lifecycle接口统一管理,里面包含init,start,stop,destory方法。
最初的连接器(connector)只能设置成BIO模式,现在的高版本Tomcat默认的连接模式都是NIO,很大程度上了提升了请求的并发量。
容器(container):加载和管理 Servlet,负责对客户端的请求进行逻辑处理,并把结果返回给客户端。在tomcat中一共有4种: engine,host,context,wrapper。一个wrapper则对应一个servlet,一个context对应一个应用,一个host对应一个站点,engine是引擎,一个容器只有一个。
2.2.连接器
**连接器(connector)**也可以叫Coyote , 是对外的接口。客户端通过其与服务器建立连接、发送请求并接收响应 。
2.2.1.具体功能
主要有如下功能
- 监听网络端口;
- 接受网络请求;
- 读取网络字节流;
- 根据应用层协议解析字节流,生成统一的 tomcat request 和 tomcat response 对象;
- 将 tomcat request 对象转成 servletRequest;
- 调用 servlet 容器,得到 servletResponse;
- 将 servletResponse 转成 tomcat response;
- 将 tomcat response 转成网络字节流;
将响应字节流写回给浏览器
2.2.2.IO模型
IO模型 | 描述 |
---|---|
NIO | 非阻塞I/O,采用Java NIO类库实现 |
NIO2 | 异步I/O,采用JDK NIO2类库实现 |
APR | 采用Apache可移植运行库实现,是C/C++编写的本地库。 如选择此方案,需要单独安装APR库 |
NIO Connector结构:
Tomcat8.0之前默认IO方式为BIO,之后默认为NIO,性能要优于BIO,APR是本地库,性能最佳,但是需要操作系统底层支持,要安装可移植库
2.2.3.逻辑处理流程
2.2.4.内部处理流程
ProtocolHandler
Coyote 协议接口, 通过Endpoint 和 Processor , 实现针对具体协议的处 理能力。Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocol , AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol , Http11Nio2Protocol ,Http11AprProtocol
EndPoint
EndPoint 是 Coyote 通信端点,即通信监听的接口,是具体Socket接收和发送处理器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议的。
Processor
Processor 是Coyote 协议处理接口 ,如果说EndPoint是用来实现TCP/IP协议的,那么Processor用来实现HTTP协议,Processor接收来自EndPoint的 Socket,读取字节流解析成Tomcat Request和Response对象,并通过 Adapter将其提交到容器处理,Processor是对应用层协议的抽象
Adapter
由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了自己的 Request类来封装这些请求信息。ProtocolHandler接口负责解析请求并生成 Tomcat Request类。但是这个Request对象不是标准的ServletRequest,不能用Tomcat Request作为参数来调用容器。Tomcat设计者的解决方案是引 入CoyoteAdapter,这是适配器模式的经典运用,连接器调用 CoyoteAdapter的Sevice方法,传入的是Tomcat Request对象, CoyoteAdapter负责将Tomcat Request转成ServletRequest,再调用容器
2.3.容器
Container组件下有几种具体的组件,分别是Engine、Host、Context和Wrapper。这4种组件(容器)是父子关系。Tomcat通过一种分层的架构,使得Servlet容器具有很好的灵活性。
- Engine
Engine表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,每个Service组件只能包含一个Engine容器组件, 但Engine组件可以包含若干Host容器组件。 - Host
代表一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机下可包含多个Context。 - Context
表示一个Web应用程序, 一个Web应用可包含多个Wrapper。 - Wrapper
表示一个Servlet,Wrapper 作为容器中的最底层,不能包含子容器
2.4.启动过程
启动脚本linux下是startup.sh,在windows下是startup.bat。
2.5.请求过程
- 当Tomcat 启动后,Connector组件的接收器(Acceptor)将会监听是否有客户端套接字连接并接收Socket。
- 一旦监听到客户端连接,则将连接交由线程池Executor处理,开始执行请求响应任务。
- Http11NioProcessor组件负责从客户端连接中读取消息报文,然后开始解析HTTP的请求行、请求头部、请求体。将解析后的报文封装成Request对象,方便后面处理时通过Request对象获取HTTP协议的相关值。
- Mapper组件根据HTTP协议请求行的URL属性值和请求头部的Host属性值匹配由哪个Host容器、哪个Context容器、哪个Wrapper容器处理请求,这个过程其实就是根据请求从Tomcat中找到对应的Servlet。然后将路由的结果封装到Request对象中,方便后面处理时通过Request对象选择容器。
- CoyoteAdaptor组件负责将Connector组件和Engine容器连接起来,把前面处理过程中生成的请求对Request和响应对象Response传递到Engine容器,调用它的管道。
- Engine容器的管道开始处理请求,管道里包含若干阀门(Valve),每个阀门负责某些处理逻辑。可以根据自己的需要往这个管道中添加多个阀门,它会负责匹配并调用Host容器的管道。
- Host容器的管道开始处理请求,它同样也包含若干阀门(Valve),它继续往下调用匹配Context容器的管道。
- Context容器的管道开始处理请求,它负责调用Wrapper容器的管道。
- Wrapper容器的管道开始处理请求,它会执行该Wrapper容器对应的Servlet对象的处理方法,对请求进行逻辑处理,并将结果输出到客户端。
3.Tomcat适用场景
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。Tomcat最新版本为10.0.22。
4.Tomcat与其他Web容器对比
Tomcat 作为处理jsp等动态应用的轻量级web服务器,在同类型的平台有 jboss,resin等,特进行了如下对比,供参考。
Tomcat | Jboss | Resin | |
---|---|---|---|
是否开源 | 是 | 是 | 是(普通版) |
开源协议 | Apache License 2.0 | LGPL | GPLv3 |
优点 | 社区活跃;资料很容易获取;是java servlet容器和小型轻量级web服务器;主要用来处理jsp动态页面,也可以处理静态页面,但性能不如apache;运行时占用系统资源小;具有跨平台性;部署应用和层序简单;提供realm支持;支持热部署和热加载 | 基于J2EE的开放源代码的应用服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat等绑定使用用于java应用和服务;运行所需系统资源较小;支持热部署 | 支持热部署;支持html、servlet,、jsp和eclipse;相对于tomcat处理速度快;报错机制人性化;相比tomcat更好的支持中文;resin分为普通版和专业版,主要区别是专业版支持缓存和负载均衡等功能 |
缺点 | 并发支持不高;报错机制不是特别的好用;不提供EJB等支持,但如果与JBoss(一个开源的应用服务器)集成到一块,则可以实现J2EE的全部功能。 | 但是不是所有的ejb都能正常运行在jboss上;相关文档以及学习资料比较少 | 普通版功能受限;专业版收费; |
EJB | 不支持 | 支持 | 支持 |
适合场景 | 小型应用(可以通过集群等来提升整体性能,支持大型应用) | EJB中小型应用 | 大中小型应用 |
5.Tomcat安装和启动
- 下载所需的tomcat版本并解压到指定目录
- 在主机安装所需的jdk版本,并配置环境变量
- 若使用自定义的jdk版本,需要在tomcat的启动脚本中自定义
5.1.Java环境变量
- 全局变量配置
vi /etc/profile
然后,加入:
export JAVA_HOME=/usr/java/jdk1.8.0_201
export CLASSPATH=
J
A
V
A
H
O
M
E
/
l
i
b
:
JAVA_HOME/lib:
JAVAHOME/lib:JAVA_HOME/jre/lib
export PATH=
P
A
T
H
:
PATH:
PATH:JAVA_HOME/bin:$JAVA_HOME/jre/bin
使环境变量生效:source /etc/profile
- 当前用户配置
直接编辑个人bash配置文件,在里面加入jdk环境变量的设置。如下:
vi ~/.bashrc
然后,加入:
export JAVA_HOME=/usr/java/jdk1.8.0_201
export CLASSPATH=
J
A
V
A
H
O
M
E
/
l
i
b
:
JAVA_HOME/lib:
JAVAHOME/lib:JAVA_HOME/jre/lib
export PATH=
P
A
T
H
:
PATH:
PATH:JAVA_HOME/bin:$JAVA_HOME/jre/bin
使环境变量生效:source ~/.bashrc
- 针对单独的Tomcat进行设置
去掉jdk的全局变量设置。
在tomcat下,打开catalina.sh文件,添加语句如下:export JAVA_HOME=“你的jdk路径”
5.2.系统服务
增加 /usr/lib/systemd/system/tomcat.service,并编辑内容:
[Unit]
Description=Tomcat8
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/tomcat/apache/bin/startup.sh
ExecReload=/usr/tomcat/apache/bin/startup.sh
ExecStop=/usr/tomcat/apache/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
#systemctl enable tomcat //开机自启动
5.3.启动关闭
切换到tomcat主目录下的bin目录
cd usr/local/tomcat/bin
-
启动tomcat服务
方式一:直接启动
./startup.sh
方式二:作为服务启动
systemctl start tomcat
方式三:控制台动态输出方式启动
./catalina.sh run
动态地显示tomcat后台的控制台输出信息,Ctrl+C后退出并关闭服务 -
关闭tomcat服务
./shutdown.sh
或 systemctl stop tomcat ##已经配置为系统服务
6.Tomcat配置文件解析
6.1.目录结构
- bin目录:存放tomcat命令文件,主要包含以.sh结尾的Linux命令和以.bat结尾的Windows命令
- conf目录:存放tomcat的配置文件,web.xml、server.xml等
- lib目录:存放tomcat运行需要的一些jar包
- logs目录:存放tomcat运行时产生的日志文件
- temp目录:存放tomcat运行时产生的临时文件
- webapps目录:存放需要运行的应用程序,我们发布项目就是将打包好的war放在该目录下,tomcat启动时会自动加载该目录下的应用。
- work目录:存放编译后的.class文件,如jsp编译后的文件
6.2.配置文件介绍
- server.xml:Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;
- web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;
- context.xml:所有host的默认配置信息;
- logging.properties:日志相关配置;
- tomcat-users.xml:认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情况下会用到此文件;在Tomcat中添加/删除用户,为用户指定角色等将通过编辑此文件实现;
- catalina.policy:Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力,以安全模式启动Tomcat会使用这个配置
- catalina.properties:Tomcat内部package的定义及访问相关的控制,也包括对通过类装载器装载的内容的控制;Tomcat在启动时会事先读取此文件的相关设置;
- jaspic-providers.xml:用户认证配置文件
6.3.context.xml
Context.xml 是 Tomcat 公用的环境配置,tomcat 服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。推荐在 $CATALINA_BASE/conf/context.xml 中进行独立的配置。因为 server.xml 是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载,而context.xml 文件则不然。示例如下:
<Context path="/eml" docBase="eml" debug="0" reloadbale="true" privileged="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/web2.xml</WatchedResource> #监控资源文件,如果web.xml || web2.xml改变了,则自动重新加载改应用。
<Resource name="jdbc/testSiteds" #表示指定的jndi名称
auth="Container" #表示认证方式,一般为Container
type="javax.sql.DataSource"
maxActive="100" #连接池支持的最大连接数
maxIdle="40" #连接池中最多可空闲maxIdle个连接
maxWait="30000" #连接池中连接用完时,新的请求等待时间,毫秒
username="test" #表示数据库用户名
password="123456" #表示数据库用户的密码
driverClassName="com.mysql.jdbc.Driver" #表示JDBC DRIVER
url="jdbc:mysql://localhost:3306/testSite" /> #表示数据库URL地址
</Context>
context.xml的三个作用范围:
- tomcat server 级别:
在$CATALINA_BASE/conf/context.xml 里配置,如果你在这个地方配置、那么这个配置文件将会被所有的webApp共享 。 - Host 级别:
在 C A T A L I N A B A S E / c o n f / C a t a l i n a / CATALINA_BASE/conf/Catalina/ CATALINABASE/conf/Catalina/{hostName} 里添加 context.xml,继而进行配置,这个配置将会被这个主机上的所有webapp共享。 - web app 级别:
在 C A T A L I N A B A S E / c o n f / C a t a l i n a / CATALINA_BASE/conf/Catalina/ CATALINABASE/conf/Catalina/{hostName} 里添加 ${webAppName}.xml,继而进行配置。此时,path=“”,webAppName 即为 path属性的值,也就是访问的虚拟目录。
另:tomcat 服务器文件中的 $CATALINA_BASE/webapps 目录下的所有文件夹都是一个应用。这个时候不需要自己动手配置,服务器默认将文件夹名映射成虚拟目录名称。还可以通过 $CATALINA_BASE/webapps/{App}/META-INF/context.xml 来配置,这个是在web应用中自己添加的,配置和其它一样。
6.4.server.xml
server.xml是Tomcat的主配置文件,可以对Service, Connector, Engine, Realm, Valve, Hosts等主组件进行相关配置
<!-- port: 接收shutdown指令的端口,默认仅允许通过本机访问,默认为8005;
shutdown:发往此Server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN;
使用方式:telnet localhost 8005, 输入SHUTDOWN即可关闭tomcat
如果你不配置这两个属性,Tomcat的这种关闭机制还是会运行的。你不想暴露这种关闭机制的
话,可以将端口设置成poer=-1,shutdown设置成一个复杂的字符串,比如shutdown="xscdeww#12"
-->
<Server port="8005" shutdown="SHUTDOWN">
<!-- 默认配置的Listener -->
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!-- 应用于整个服务器的JNDI映射,此可以避免每个Web应用程序都需要在各自的web.xml创建,这在web应用程序 以WAR的形式存在时尤为有用。
-->
<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" />
</GlobalNamingResources>
<!-- Service是多个Connector和单个Container的组合。Container是一个抽象的概念,由Engine, Realm, Valve和Hosts主组组成。
在server.xml配置文件中可以同时配置多个Service标签
-->
<Service name="Catalina">
<!--The connectors can use a shared executor, you can define one or more named thread pools
-->
<!-- 默认情况下,每个连接器connector会使用自己创建的线程池,我们也可以配置多个线程池让连接器共享-->
<!-- 如果想让连接器connector组件使用这个线程池,需要在连接器组件中配置executor属性.
另外,Executor元素的配置应该放在Connector配置的前面,这样才会先加载Executor的配置。
Executor的主要属性包括:
- name:该线程池的名称id
- maxThreads:线程池中最大活跃线程数,默认值200(Tomcat7和8都是)
- minSpareThreads:线程池中保持的最小线程数,最小值是25
- maxIdleTime:线程空闲的最大时间,当空闲超过该值时关闭线程(除非线程数小于
minSpareThreads),单位是ms,默认值60000(1分钟)
- daemon:是否后台线程,默认值true
- threadPriority:线程优先级,默认值5
- namePrefix:线程名字的前缀,线程池中线程名字为:namePrefix+线程编号
-->
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<!-- Connector是Tomcat中请求接收和响应返回的端点,Tomcat中支持HTTP、AJP和APR等协议。
下面的配置定义了一个支持Http协议的连接器,监听8080端口
Connector组件支持以下组件的配置:
- address:指定连接器监听的地址,默认为所有地址,即0.0.0.0;
- port:监听的端口,默认为0;
- protocol:连接器使用的协议,默认为HTTP/1.1,定义AJP协议时通常为AJP/1.3;
- connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为60000,即1分钟;
- maxThreads:支持的最大并发连接数,默认为200;
- redirectPort:如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,
则转发至此属性定义的端口;
- enableLookups:是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名;
默认为true;
- acceptCount:设置等待队列的最大长度;
- executor:指定共享的线程池组件;
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
executor="tomcatThreadPool" />
<!-- 下面是进行支持Https的配置 -->
<!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443
This connector uses the NIO implementation. The default
SSLImplementation will depend on the presence of the APR/native
library and the useOpenSSL attribute of the
AprLifecycleListener.
Either JSSE or OpenSSL style configuration may be used regardless of
the SSLImplementation selected. JSSE style configuration is used below.
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
type="RSA" />
</SSLHostConfig>
</Connector>
-->
<!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
This connector uses the APR/native implementation which always uses
OpenSSL for TLS.
Either JSSE or OpenSSL style configuration may be used. OpenSSL style
configuration is used below.
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
certificateFile="conf/localhost-rsa-cert.pem"
certificateChainFile="conf/localhost-rsa-chain.pem"
type="RSA" />
</SSLHostConfig>
</Connector>
-->
<!-- Define an AJP 1.3 Connector on port 8009 -->
<!--
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
-->
<!-- Tomcat内部有4个级别的容器,分别是Engine、Host、Context和Wrapper。Engine代表全局Servlet引 擎,每个Service组件只能包含一个Engine容器组件,但Engine组件可以包含若干Host容器组件
-->
<!-- An Engine represents the entry point (within Catalina) that processes
every request. The Engine implementation for Tomcat stand alone
analyzes the HTTP headers included with the request, and passes them
on to the appropriate Host (virtual host).
Documentation at /docs/config/engine.html -->
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->
<Engine name="Catalina" defaultHost="localhost">
<!--For clustering, please take a look at documentation at:
/docs/cluster-howto.html (simple how to)
/docs/config/cluster.html (reference documentation) -->
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
<!-- Use the LockOutRealm to prevent attempts to guess user passwords
via a brute-force attack -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- This Realm uses the UserDatabase configured in the global JNDI
resources under the key "UserDatabase". Any edits
that are performed against this UserDatabase are immediately
available for use by the Realm. -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!-- 配置虚拟主机,可以配置多个-->
<!-- 一个Host下面可以有多个Context,也就是可以部署多个Webapp应用,一个webapp对应一个Context,用不同的ContextPath区分
-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<!-- Host下面也可以配置Context相关的配置 -->
</Host>
</Engine>
</Service>
</Server>
6.5.web.xml
Tomcat的conf目录下面的web.xml配置文件和我们平时应用中WEB-INF下面的配置web.xml功能一致,只是Tomcat下面的这个配置文件用来配置所有应用通用的配置,对所用应用生效。
配置默认servlet,Jsp处理器和一些其他的filter;
为所有的Web应用程序提供包括MIME映射;
并设置欢迎页面。
通常Tomcat下面的这个配置文件不需要我们自己另行做额外配置。
6.6.tomcat-users.xml
Tomcat Manager是Tomcat自带的、用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。
在默认情况下,Tomcat Manager是处于禁用状态的。准确地说,Tomcat Manager需要以用户角色进行登录并授权才能使用相应的功能,不过Tomcat并没有配置任何默认的用户,因此需要我们进行相应的用户配置之后才能使用Tomcat Manager。
Tomcat Manager的用户配置是在Tomcat安装目录/conf/tomcat-users.xml文件中进行管理的。
Tomcat Manager的用户配置非常简单,下面我们以一个具体的配置为例:
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
<user username="admin" password="123456" roles="manager-script"/>
</tomcat-users>
如上所示,我们只需要在tomcat-users节点中配置相应的role(角色/权限)和user(用户)即可。一个user节点表示单个用户,属性username和password分别表示登录的用户名和密码,属性roles表示该用户所具备的权限。
user节点的roles属性值与role节点的rolename属性值相对应,表示当前用户具备该role节点所表示的角色权限。当然,一个用户可以具备多种权限,因此属性roles的值可以是多个rolename,多个rolename之间以英文逗号隔开即可。
Tomcat已经为我们定义了4种不同的角色——也就是4个rolename,我们只需要使用Tomcat为我们定义的这几种角色就足够满足我们的工作需要了。
以下是Tomcat Manager 4种角色的大致介绍(下面URL中的*为通配符):
- manager-gui
允许访问html接口(即URL路径为/manager/html/*) - manager-script
允许访问纯文本接口(即URL路径为/manager/text/*) - manager-jmx
允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*) - manager-status
允许访问Tomcat只读状态页面(即URL路径为/manager/status/)
从Tomcat Manager内部配置文件中可以得知,manager-gui、manager-script、manager-jmx均具备manager-status的权限,也就是说,manager-gui、manager-script、manager-jmx三种角色权限无需再额外添加manager-status权限,即可直接访问路径/manager/status/。