当前位置: 首页 > news >正文

Tomcat新手成长之路:安装部署优化全解析(上)

文章目录

  • 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.请求过程

在这里插入图片描述

  1. 当Tomcat 启动后,Connector组件的接收器(Acceptor)将会监听是否有客户端套接字连接并接收Socket。
  2. 一旦监听到客户端连接,则将连接交由线程池Executor处理,开始执行请求响应任务。
  3. Http11NioProcessor组件负责从客户端连接中读取消息报文,然后开始解析HTTP的请求行、请求头部、请求体。将解析后的报文封装成Request对象,方便后面处理时通过Request对象获取HTTP协议的相关值。
  4. Mapper组件根据HTTP协议请求行的URL属性值和请求头部的Host属性值匹配由哪个Host容器、哪个Context容器、哪个Wrapper容器处理请求,这个过程其实就是根据请求从Tomcat中找到对应的Servlet。然后将路由的结果封装到Request对象中,方便后面处理时通过Request对象选择容器。
  5. CoyoteAdaptor组件负责将Connector组件和Engine容器连接起来,把前面处理过程中生成的请求对Request和响应对象Response传递到Engine容器,调用它的管道。
  6. Engine容器的管道开始处理请求,管道里包含若干阀门(Valve),每个阀门负责某些处理逻辑。可以根据自己的需要往这个管道中添加多个阀门,它会负责匹配并调用Host容器的管道。
  7. Host容器的管道开始处理请求,它同样也包含若干阀门(Valve),它继续往下调用匹配Context容器的管道。
  8. Context容器的管道开始处理请求,它负责调用Wrapper容器的管道。
  9. 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等,特进行了如下对比,供参考。

TomcatJbossResin
是否开源是(普通版)
开源协议Apache License 2.0LGPLGPLv3
优点社区活跃;资料很容易获取;是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安装和启动

  1. 下载所需的tomcat版本并解压到指定目录
  2. 在主机安装所需的jdk版本,并配置环境变量
  3. 若使用自定义的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=forkingExecStart=/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.配置文件介绍

  1. server.xml:Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;
  2. web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;
  3. context.xml:所有host的默认配置信息;
  4. logging.properties:日志相关配置;
  5. tomcat-users.xml:认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情况下会用到此文件;在Tomcat中添加/删除用户,为用户指定角色等将通过编辑此文件实现;
  6. catalina.policy:Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力,以安全模式启动Tomcat会使用这个配置
  7. catalina.properties:Tomcat内部package的定义及访问相关的控制,也包括对通过类装载器装载的内容的控制;Tomcat在启动时会事先读取此文件的相关设置;
  8. 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的三个作用范围:

  1. tomcat server 级别:
    在$CATALINA_BASE/conf/context.xml 里配置,如果你在这个地方配置、那么这个配置文件将会被所有的webApp共享 。
  2. 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共享。
  3. 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 receivedand responses are returned. Documentation at :Java HTTP Connector: /docs/config/http.htmlJava AJP  Connector: /docs/config/ajp.htmlAPR (HTTP/AJP) Connector: /docs/apr.htmlDefine 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 8443This connector uses the NIO implementation. The defaultSSLImplementation will depend on the presence of the APR/nativelibrary and the useOpenSSL attribute of theAprLifecycleListener.Either JSSE or OpenSSL style configuration may be used regardless ofthe 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/2This connector uses the APR/native implementation which always usesOpenSSL for TLS.Either JSSE or OpenSSL style configuration may be used. OpenSSL styleconfiguration 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 processesevery request.  The Engine implementation for Tomcat stand aloneanalyzes the HTTP headers included with the request, and passes themon 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 passwordsvia a brute-force attack --><Realm className="org.apache.catalina.realm.LockOutRealm"><!-- This Realm uses the UserDatabase configured in the global JNDIresources under the key "UserDatabase".  Any editsthat are performed against this UserDatabase are immediatelyavailable 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 applicationsDocumentation at: /docs/config/valve.html --><!--<Valve className="org.apache.catalina.authenticator.SingleSignOn" />--><!-- Access log processes all example.Documentation at: /docs/config/valve.htmlNote: 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 &quot;%r&quot; %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中的*为通配符):

  1. manager-gui
    允许访问html接口(即URL路径为/manager/html/*)
  2. manager-script
    允许访问纯文本接口(即URL路径为/manager/text/*)
  3. manager-jmx
    允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*)
  4. 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/

相关文章:

Tomcat新手成长之路:安装部署优化全解析(上)

文章目录 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…...

跟我学C++中级篇——通信的数据的传递形式

一、通信的数据传递 在开发程序中&#xff0c;无可避免的会进行数据的传递。这种传递方式有很多种&#xff0c;字节流、消息、Json、参数以及对象甚至可能的方法。那么在传递这些数据时&#xff0c;如何正确的采用更合适的方法&#xff0c;就成为了一个设计的首选的问题。 二…...

C语言 qsort及应用

qsort及应用 qsort:快速排序函数,需要引用stdlib.h文件. void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *, const void *) ); 参数: base:需要排序的数组 num:数据个数(数组长度) width:每个数据的字节数(sizeof(数据类型)) compa…...

【C语言】连接陷阱探秘(4):检查外部类型

目录 一、外部类型概述 1.1. 外部类型的重要性 1.2. 外部类型在C语言中的使用 1.3. 注意事项 二、常见的外部类型陷阱 2.1. 结构体和联合体的大小不匹配 2.1.1. 示例代码 2.1.2. 正确的做法 2.2. 枚举类型的值不匹配 2.3. 函数签名不一致 2.3.1. 函数签名不一致的问…...

打造双层环形图:基础与高级渐变效果的应用

在数据可视化领域&#xff0c;环形图因其独特的展示方式而广受欢迎。今天&#xff0c;我们将通过ECharts库来创建一个具有双层渐变效果的高级环形图。本文将详细介绍如何实现这种视觉效果。 1. 环形图基础 首先&#xff0c;我们需要了解环形图的基本构成。环形图由内外两个圆…...

【Git】Git 完全指南:从入门到精通

Git 完全指南&#xff1a;从入门到精通 Git 是现代软件开发中最重要的版本控制工具之一&#xff0c;它帮助开发者高效地管理项目&#xff0c;支持分布式协作和版本控制。无论是个人项目还是团队开发&#xff0c;Git 都能提供强大的功能来跟踪、管理代码变更&#xff0c;并保障…...

【mac】mac自动定时开关机和其他常用命令,管理电源设置的工具pmset

一、操作步骤 1、打开终端 2、pmset 是用于管理电源设置的强大工具&#xff0c;我们将使用这个命令 &#xff08;1&#xff09;查询当前任务 pmset -g sched查看到我当前的设置是 唤醒电源开启在 工作日的每天早上8点半 上班时不用手动开机了 &#xff08;2&#xff09;删…...

【Leecode】Leecode刷题之路第62天之不同路径

题目出处 62-不同路径-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 62-不同路径-官方解法 方法1&#xff1a;动态规划 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&…...

基于深度学习的手势识别算法

基于深度学习的手势识别算法 概述算法原理核心逻辑效果演示使用方式参考文献 概述 本文基于论文 [Simple Baselines for Human Pose Estimation and Tracking[1]](ECCV 2018 Open Access Repository (thecvf.com)) 实现手部姿态估计。 手部姿态估计是从图像或视频帧集中找到手…...

helm部署golang服务

Helm 是 Kubernetes 的一个包管理工具,类似于 Linux 中的 apt 或 yum。它使得在 Kubernetes 上部署和管理应用程序变得更加简单和高效。 安装 https://get.helm.sh/helm-v3.16.3-linux-amd64.tar.gz具体版本号可以在github上看到最新的版本号,然后替换上面链接来获取。gith…...

DreamCamera2相机预览变形的处理

最近遇到一个问题&#xff0c;相机更换了摄像头后&#xff0c;发现人像角度顺时针旋转了90度&#xff0c;待人像角度正常后&#xff0c;发现 预览时图像有挤压变形&#xff0c;最终解决。在此记录 一人像角度的修改 先放示意图 设备预览人像角度如图1所示&#xff0c;顺时针旋…...

Mysql误删表中数据与误删表的恢复方法

查看数据库是否开启binlog日志 mysql> show variables like %log_bin%; ------------------------------------------------------------------------ | Variable_name | Value | ------------------------------------…...

lapack、blas、solver库的区别和联系

LAPACK、BLAS、Solver 库 是数值计算领域的重要组成部分,它们各自的功能和设计目标有所不同,但也存在密切的联系。 1. 概述 库主要功能设计目标BLAS提供基础的线性代数操作,如向量运算、矩阵-向量乘法、矩阵-矩阵乘法等。提供高度优化的基础线性代数操作,作为更高级库的底层…...

deepin 安装 chrome 浏览器

deepin 安装 chrome 浏览器 最近好多小伙伴儿和我说 deepin 无法安装最新的谷歌浏览器 其实是因为最新的 谷歌浏览器 其中的一个依赖需要提前安装 提前安装依赖然后再安装谷歌浏览器就可以了 安装 fonts-liberationsudo apt -y install fonts-liberation安装 chrome 浏览器sudo…...

永久免费的PDF万能水印删除工具

永久免费的PDF万能水印删除工具 1.简介 PDF万能水印删除工具&#xff0c;可以去除99.9%的PDF水印。例如&#xff1a;XObject水印&#xff08;含图片水印&#xff09;、文本水印、绘图水印/曲线水印、注释水印、工件水印、剪切路径水印等等。本软件是永久免费&#xff0c;无有…...

Linux网络——NAT/代理服务器

一.NAT技术 1.NAT IP转换 之前我们讨论了, IPv4 协议中, IP 地址数量不充足的问题&#xff0c;NAT 技术就是当前解决 IP 地址不够用的主要手段, 是路由器的一个重要功能。 NAT 能够将私有 IP 对外通信时转为全局 IP. 也就是一种将私有 IP 和全局IP 相互转化的技术方法: 很…...

大米中的虫子检测-检测储藏的大米中是否有虫子 支持YOLO,VOC,COCO格式标注,4070张图片的数据集

大米中的虫子检测-检测储藏的大米中是否有虫子 支持YOLO&#xff0c;VOC&#xff0c;COCO格式标注&#xff0c;4070张图片的数据集 数据集分割 4070总图像数 训练组 87&#xff05; 3551图片 有效集 9&#xff05; 362图片 测试集 4% 157图片 预处理 自动定向…...

基于Java的小程序电商商城开源设计源码

近年来电商模式的发展越来越成熟&#xff0c;基于 Java 开发的小程序电商商城开源源码&#xff0c;为众多开发者和企业提供了构建个性化电商平台的有力工具。 基于Java的电子商城购物平台小程序的设计在手机上运行&#xff0c;可以实现管理员&#xff1b;首页、个人中心、用户…...

node.js基础学习-fs模块-文件操作(六)

一、前言 fs模块是 Node.js 内置的文件系统&#xff08;File System&#xff09;模块&#xff0c;它提供了一系列用于与文件系统进行交互的方法。通过fs模块&#xff0c;可以对文件或目录进行读取、写入、删除、重命名、查询状态等操作&#xff0c;这使得 Node.js 能够很好地处…...

设计模式:11、迭代器模式(游标)

目录 0、定义 1、迭代器模式的四种角色 2、迭代器模式的UML类图 3、示例代码 4、迭代器的next()方法与集合的get(int index)方法的效率对比&#xff08;LinkedList为例&#xff09; 0、定义 提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不需要暴露该对象…...

Oracle SCN与时间戳的映射关系

目录 一、基本概述 二、相关操作 三、参考文档 一、基本概述 Oracle 数据库中的 SYS.SMON_SCN_TIME 表是一个关键的内部表&#xff0c;主要用于记录过去时间段中SCN与具体的时间戳之间的映射关系。这种映射关系可以帮助用户将 SCN 值转换为可读性更强的时间戳&#xff0c;从而…...

【广告投放系统】头条可视化投放平台vue3+element-plus+vite落地历程和心得体会

前言 hallo&#xff0c;又是许久未见&#xff0c;昨天也是正式把公司内部的广告投放平台暂时落地&#xff0c;我也即将离开待了两年多的地方。言归正传&#xff0c;由于头条广告后台的升级改版&#xff0c;因此为了满足内部投放需求&#xff0c;做了一个可视化的投放平台&…...

Gazebo插件相机传感器(可订阅/camera/image_raw话题)

在仿真环境中使用相机传感器&#xff0c;通常需要结合Gazebo插件来实现。Gazebo是一个功能强大的机器人仿真工具&#xff0c;支持多种传感器模型&#xff0c;包括相机。下面是如何在Gazebo中使用相机传感器的详细步骤。 1. 修改Xacro文件以包含Gazebo插件 首先&#xff0c;修…...

华三(HCL)和华为(eNSP)模拟器共存安装手册

接上章叙述&#xff0c;解决同一台PC上同时部署华三(HCL)和华为(eNSP&#xff09;模拟器。原因就是华三HCL 的老版本如v2及以下使用VirtualBox v5版本&#xff0c;可以直接和eNSP兼容Oracle VirtualBox&#xff0c;而其他版本均使用Oracle VirtualBox v6以上的版本&#xff0c;…...

信息学奥赛一本通 1448:【例题1】电路维修 | 洛谷 P4667 [BalticOI 2011 Day1] Switch the Lamp On 电路维修

【题目链接】 ybt 1448&#xff1a;【例题1】电路维修 洛谷 P4667 [BalticOI 2011 Day1] Switch the Lamp On 电路维修 【题目考点】 1. 双端队列广搜&#xff08;0-1BFS&#xff09; 【解题思路】 整个电路是由一个个的正方形的电路元件组成&#xff0c;每个正方形有四个…...

k8s删除网络组件错误

k8s集群删除calico网络组件重新部署flannel网络组件&#xff0c;再部署pod后出现报错不能分配ip地址 plugin type"calico" failed (add): error getting ClusterInformation: connection is unauthorized: Unauthorized 出现该问题是因为删除网络组件后&#xff0c;网…...

MySQL之JDBC

我们在学习完了数据库的基本操作后&#xff0c;希望和我们的Java程序建立连接&#xff0c;那么我们今天就来一探究竟JDBC是如何让Java程序与数据库建立连接的 1. 什么是JDBC JDBC&#xff08;Java Data Base Connectivity, Java数据库连接&#xff09; 是Java程序和数据库之间…...

音视频入门基础:MPEG2-TS专题(10)——PAT简介

一、引言 当某个transport packet的TS Header中的PID属性的值为0x0000时&#xff0c;该transport packet的payload为Program association table &#xff0c;即 PAT表。PAT表包含所有PMT表的目录列表&#xff0c;将program_number和PMT表的PID相关联&#xff0c;获取数据的起始…...

ElementUI:el-drawer实现在父组件区域内打开抽屉组件非全屏

我们在开发ElementUI的时候遇到抽屉组件全屏的问题&#xff0c;但是我们需要在指定div中展示出来&#xff0c;上代码&#xff1a; 1、在el-drawer中增加属性 el-drawerstyle"position: absolute"z-index"-1":append-to-body"false">// do s…...

Vue教程|搭建vue项目|Vue-CLI2.x 模板脚手架

一、项目构建环境准备 在构建Vue项目之前&#xff0c;需要搭建Node环境以及Vue-CLI脚手架&#xff0c;由于本篇文章为上一篇文章的补充&#xff0c;也是为了给大家分享更为完整的搭建vue项目方式&#xff0c;所以环境准备部分采用Vue教程&#xff5c;搭建vue项目&#xff5c;V…...

php 手机网站cms系统/网络营销与网站推广的区别

IOS push消息的数字不减少的问题&#xff0c;在做这个问题的时候。发现设置数字为0不能用&#xff0c;这时这个设置为0是写在应用程序加载的函数里面。只有双击Home键出现减号的时候删掉运行才会数字清零。 因此我把这个清零的数字写在 - (void)applicationDidEnterBackground:…...

公司网站维护建设的通知/营销策划

The Fctory Pattern 处理对象创建&#xff0c;客户端可以申请一个对象而不用知道对象被那个class创建。可以方便地解耦对象的使用和创建&#xff0c;有两种实现&#xff0c;工厂方法和抽象工厂。 Method(工厂方法): 执行单独的函数&#xff0c;通过传参提供需要的对象信息。 cl…...

建设购物网站的方案/厦门人才网个人登录

题目链接 分析 可以把每艘战舰进入队列时的顺序作为 属性值,表示为这艘战舰到队列头部战舰的距离,用d[i]表示i号战舰到头部战舰的距离,每次把一个战舰队列接到另一个战舰队列的尾部时, 把前者头部战舰的d[i]改为后者整个队列的长度, 然后后者队列长度 再加上前者队列长度 代…...

品牌网站建设定位/腾讯中国联通

Java反射机制Java反射(Reflection)是Java非常重要的动态特性&#xff0c;通过使用反射我们不仅可以获取到任何类的成员方法(Methods)、成员变量(Fields)、构造方法(Constructors)等信息&#xff0c;还可以动态创建Java类实例、调用任意的类方法、修改任意的类成员变量值等。Jav…...

如何做一个商城类型的网站/电脑优化软件

参考&#xff1a;函数参数 Note 1.Python的函数定义非常简单&#xff0c;但灵活度却非常大。除了正常定义的必选参数外&#xff0c;还可以使用默认参数、可变参数和关键字参数&#xff0c;使得函数定义出来的接口&#xff0c;不但能处理复杂的参数&#xff0c;还可以简化调用者…...

北京网站设计网站设计公司价格/网站关键词优化排名公司

01-反馈_ 02-web应用程序的处理流程_ 03-django简介_ 04-MVC和MVT_ 05-学习简介_ 06-虚拟环境_ 可百度搜索&#xff0c;搭建py虚拟环境&#xff0c; 07-创建django工程_ ctrlc&#xff0c;停止&#xff0c; 08-创建子应用_ py名尽量都小写&#xff0c; 09-模型的迁移_ 11-视图…...