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=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.配置文件介绍

  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 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 &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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928078.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pycharm 安装两种不同版本的解释器

背景 Pycharm使用的解释器是python3.11&#xff0c;python3.9.x之后不支持win7&#xff1b;有同事需要在win7上使用python制作的exe&#xff0c;而了“win7环境下运行python打包exe提示找不到api-ms-win-core-path-l1-1-0.dll”。 过程 查找了一些资料&#xff0c;发现直接将…

【python自动化一】pytest的基础使用

1.pytest简述 pytest‌ 是一个功能强大且灵活的Python测试框架&#xff0c;其主要是用于流程控制&#xff0c;具体用于UI还是接口自动化根据个人需要而定。且其具有丰富插件&#xff0c;使用时较为方便。咱们具体看下方的内容&#xff0c;本文按照使用场景展开&#xff0c;不完…

基于米尔全志T527开发板的FacenetPytorch人脸识别方案

本篇测评由优秀测评者“小火苗”提供。 本文将介绍基于米尔电子MYD-LT527开发板&#xff08;米尔基于全志 T527开发板&#xff09;的FacenetPytorch人脸识别方案测试。 一、facenet_pytorch算法实现人脸识别 深度神经网络 1.简介 Facenet-PyTorch 是一个基于 PyTorch 框架实…

ECharts柱状图-交错正负轴标签,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

【Linux】线程池设计 + 策略模式

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 线程池 1-1 ⽇志与策略模式1-2 线程池设计1-3 线程安全的单例模式1-3-1 什么是单例模式1-3-2 单例模式的特点1-3-3 饿汉实现⽅式和懒汉实现⽅式1-3-4 饿汉…

Spring Boot 3 集成 Spring Security + JWT

文章目录 Spring Boot 3 集成 Spring Security JWT准备工作引入依赖设计表结构生成基本代码白名单配置 JWT配置配置参数jwt密码、过期时间等自定义未授权和未登录结果返回创建JWT过滤器 改写SecurityConfig登录验证启动查看接口未登录登录 总结 Spring Boot 3 集成 Spring Sec…

tauri使用github action打包编译多个平台arm架构和inter架构包踩坑记录

这些error的坑&#xff0c;肯定是很多人不想看到的&#xff0c;我的开源软件PakePlus是使用tauri开发的&#xff0c;PakePlus是一个界面化将任何网站打包为轻量级跨平台软件的程序&#xff0c;利用Tauri轻松构建轻量级多端桌面应用和多端手机应用&#xff0c;为了实现发布的时候…

【娱乐项目】竖式算术器

Demo介绍 一个加减法随机数生成器&#xff0c;它能够生成随机的加减法题目&#xff0c;并且支持用户输入答案。系统会根据用户输入的答案判断是否正确&#xff0c;统计正确和错误的次数&#xff0c;并显示历史记录和错题记录。该工具适合用于数学练习&#xff0c;尤其适合练习基…

D86【python 接口自动化学习】- pytest基础用法

day86 pytest配置testpaths 学习日期&#xff1a;20241202 学习目标&#xff1a;pytest基础用法 -- pytest配置testpaths 学习笔记&#xff1a; pytest配置项 主目录创建pytest.ini文件 [pytest] testpaths./testRule 然后Terminal里直接命令&#xff1a;pytest&#xff…

LeetCode1556. 千位分隔数 LeetCode9. 回文数

题目一、1556. 千位分隔数 给你一个整数 n&#xff0c;请你每隔三位添加点&#xff08;即 "." 符号&#xff09;作为千位分隔符&#xff0c;并将结果以字符串格式返回。 示例 1&#xff1a; 输入&#xff1a;n 987 输出&#xff1a;"987"示例 2&#xff…

网络编程(UDP\TCP回显服务器)

目录 套接字socket TCP和UDP特点比较 特点 比较 UDP回显服务器/客户端的编写 UDP的socket api 回显服务器 客户端 TCP回显服务器/客户端的编写 TCP的socket api 回显服务器 客户端 优化服务器 1.关闭服务器创建的socket对象 2.引入线程池&#xff0c;为多个客户…

基于python的某音乐网站热门歌曲的采集与分析,包括聚类和Lda主题分析

一项目背景 在当前竞争激烈的市场环境下&#xff0c;分析酷狗音乐上的热门歌曲及其用户行为趋势&#xff0c;对平台运营、歌曲推荐和音乐创作具有重要意义。尤其是通过对酷狗音乐平台热门歌曲的数据采集与分析&#xff0c;可以深入理解用户偏好、歌曲流行的规律以及市场需求的…

论文阅读之方法: Single-cell transcriptomics of 20 mouse organs creates a Tabula Muris

The Tabula Muris Consortium., Overall coordination., Logistical coordination. et al. Single-cell transcriptomics of 20 mouse organs creates a Tabula Muris. Nature 562, 367–372 (2018). 论文地址&#xff1a;https://doi.org/10.1038/s41586-018-0590-4 代码地址…

国产多点低压差分(M-LVDS)线路驱动器和接收器,可替代DS91D176/SN65MLVD201

MS2111 是多点低压差分 (M-LVDS) 线路驱动器和接收器。经过优化&#xff0c;可运行在高达 200Mbps 的信号速率下。所有部件均符合 MLVDS 标准 TIA / EIA-899 。该驱动器的输出支持负载低至 30Ω 的多点总线。 MS2111 的接收器属于 Type-2 &#xff0c; 可在 -1V 至 …

【推荐算法】推荐系统的评估

这篇文章是笔者阅读《深度学习推荐系统》第五章推荐系统的评估的学习笔记&#xff0c;在原文的基础上增加了自己的理解以及内容的补充&#xff0c;在未来的日子里会不断完善这篇文章的相关工作。 文章目录 离线评估划分数据集方法客观评价指标P-R曲线ROC/AUCmAPNDCG A/B 测试分…

专题1:AI大模型在汽车行业的应用现状与展望

前言&#xff1a; 本文是《大模型在汽车行业的典型应用实践》100w字长文预告的一篇&#xff0c;本文没有泛泛的去做行业应用现状的介绍&#xff0c;而是通过引入行业调研报告的方式&#xff0c;进行详解&#xff0c;用事事和数据来说话&#xff0c;具有很好的参考意义。 一、…

开源ISP介绍(1)——开源ISP的Vivado框架搭建

开源github链接&#xff1a;bxinquan/zynq_cam_isp_demo: 基于verilog实现了ISP图像处理IP 国内Gitee链接&#xff1a;zynq_cam_isp: 开源ISP项目 基于以上开源链接移植项目到正点原子领航者Zynq7020开发板&#xff0c;并对该项目的Vivddo工程进行架构详解&#xff0c;后续会…

【Java基础面试题009】Java的I/O流是什么?

相关知识补充&#xff1a;黑马-字符集、IO流&#xff08;一&#xff09;.pdf Autism_Btkrsr/Blog_md_to_pdf - 码云 - 开源中国 (gitee.com) 黑马-IO流&#xff08;二&#xff09;.pdf Autism_Btkrsr/Blog_md_to_pdf - 码云 - 开源中国 (gitee.com) 回答重点 Java的I/O&…

Python Tkinter 模块

Python 支持多种图形界面的第三方库&#xff0c;包括 TkQtwxWidgets… Python 提供的 Tkinter 模块&#xff0c;就是 Tk GUI 工具包的接口。 Tkinter Tk 是图形库&#xff0c;支持多种操作系统&#xff0c;使用 Tcl 语言开发&#xff1b; Tk 会调用操作系统提供的本地 GUI …

详细介绍下oracle建库过程中核心脚本dbcore.bsq

在我们搭建oracle 11g数据库过程中&#xff0c;当我们设置好安装参数后&#xff0c;最后一步进行数据库安装时&#xff0c;oracle安装进程实际上调用的是$ORACLE_HOME/rdbms/admin/sql.bsq脚本进行建库。今天我们将详细介绍下其中的核心脚本dbcore.bsq。 一、建库脚本 我们先看…