【WEB】【Tomcat】详解server.xml配置文件

举报
huahua.Dr 发表于 2022/10/31 23:44:30 2022/10/31
【摘要】 一、目前tomcat8的server.xml配置:该配置文件描述了如何启动Tomcat 服务以及怎么处理请求服务。<?xml version="1.0" encoding="UTF-8"?><Server port="8005" shutdown="SHUTDOWN">  <Listener className="org.apache.catalina.startup.VersionLogg...

一、目前tomcat8的server.xml配置:

该配置文件描述了如何启动Tomcat 服务以及怎么处理请求服务。

<?xml version="1.0" encoding="UTF-8"?>

<Server port="8005" shutdown="SHUTDOWN">

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

  <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 name="Catalina">

    <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

               resourceName="UserDatabase"/>

      </Realm>

      <Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true">

<Logger>

<Context>

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

    </Engine>

  </Service>

</Server>

二、根据上面的配置文件,tomcat server的结构图如下:

C text 
IO eaIhOst 
Setvice 
etvice 2 
one 
OYoee Frrp,'l. 
coyote JE2 
8080 
8009

三、配置文件的各个标签及属性说明

标签名

属性

说明

Server

Port

 

Shutdown

指定一个端口,该端口负责建通关闭tomcat的请求

当有关闭tomcat请求时,会指定端口发送命令字符串

Service

name

指定service的名字

Connector

(表示客户端

与service

之间的连接)

port

 

 

minProcessor

 

maxProcessor

enablesLookups

 

 

 

redirectPort

 

acceptCount

 

connectionTimeout

指定服务端要创建的端口号,并在这个端口监听来自客户端的请求

服务器启动时创建处理请求的最小线程数

 

服务器启动时创建处理请求的最大线程数

如果为true,则可以通过调用reques.getRemoteHost()进行DNS查询来获得远程客户端的实际主机名,若为false则不进行DNS查询,而是返回客户端的ip地址。

指定服务器正在处理http请求时收到一个SSL传输请求后重定向的端口号

当前所有处理请求的线程数都被使用时,再进来的请求会进到处理队列中,acceptCount表示能进来到处理队列中的最大请求数,超过这个数将不会被处理。

指定连接超时的时间数(单位为毫秒)

Engine(表示指定service中的请求处理机,接受和处理来自Connector的请求)

defaultHost

指定默认的处理请求的主机名,至少与其中的一个Host标签的name属性名相同

Context(表示一个web应用程序,通常为WAR文件)

docBase

Path

 

 

Reloadable

 

 

 

web应用程序或者WAR文件存放的路径

表示web应用程序的url的前缀,如请求的url:http://lcoalhost:8080/path/*

这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib和WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以不重启tomcat的情况下改变应用程序

 

 

Host(表示一个虚拟主机)

Name

appBase

 

 

unpackWARs

指定主机名

应用程序的基本目录,即存放应用程序的目录

如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序

 

Logger(表示日志,调试和错误信息)

className

 

Prefix

Suffix

 

timestamp

指定logger使用的类名,此类必须实现org.apache.catalina.Logger接口

指定log文件的前缀

指定log文件的后缀

如果为true,则log文件名中要加入时间,如:test.2019-04-01.txt

 

Realm(表示存放用户名,密码及role的数据库)

className

指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口

Valve(功能与Logger差不多)

prefix

suffix

className

 

 

 

directory

pattern

log文件的前缀

log文件的后缀

指定valve使用的类名,如使用org.apache.catalina.valves.AccessLogValv类可以记录应用程序的访问信息

存放log路径的位置

有两中方式:

common方式记录远程之际名或IP地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。

combine方式比common方式记录的值更多。


四、server.xml标签元素详解

<Server>标签元素

server标签代表着这个容器,但自身并不是一个"container"容器,不能在里面定义其他像Loggers等组件,它是tomcat实例的顶层元素,由org.apache.catalina.Server接口定义,其使用的默认className是:org.apache.catalina.core.StandarServer类。它包含<Service>元素,并且它不能作为任何元素的子元素。

一个server是一个提供完整的JVM的独立组件,它可以包含一个或者多个Service实例。server服务器再指定的端口上监听shutdown命令。

<Server port="8005" shutdown="SHUTDOWN">

上面表示:启动server,在端口8005处等待关闭命令,如果接收到“SHUTDOWN”字符串则关闭服务器。

测试一下:

我们先启动tomcat服务器:

Tomcat 
15, 2020 11:05:42 T org. apache. catalina. startup. HostConfig deployDirectory 
Deployment of web application directory D: 0. 82-windows-x64\apache-to 
-7. 0. 82\webapps\requestTest has finished in 719 ms 
cat 
15, 2020 11:05:42 org. apache. catalina. startup. HostConfig deployDirectory 
Deploying web application directory D: 0. 82-windows-x64\apache-tomcat 
82\webapps\ROOT 
15, 2020 
com. sum. faces. config. ConfigureListener contextlnitialized 
: " 2. 2. 8-28 ( 20180621-0320 15c5e0359aac6ce2e9a30dfb6269fe083b9c8cf5) 
15, 2020 
com. sum. faces. spi. InjectionFroviderFactory createlnstance 
: JSF1048: PostConstruct/PreDestroy ManagedBeans 
15, 2020 11:05:43 org. apache. catalina. startup. HostConfig deployDirectory 
Deployment of web application directory D: 0. 82-windows-x64\apache-to 
-7. 0. 82\webapps\ROOT has finished in 828 ms 
cat 
15, 2020 11:05:43 org. apache. catalina. startup. HostConfig deployDirectory 
Deploying web application directory D: 0. 82-windows-x64\apache-tomcat 
82 on 
15, 2020 
com. sum. faces. config. ConfigureListener contextlnitialized 
: ' /session 
2. 2. 8-28 ( 20180621-0320 15c5e0359aac6ce2e9a30dfb6269fe083b9c8cf5) 
15, 2020 
com. sum. faces. spi. InjectionFroviderFactory createlnstance 
: JSF1048: PostConstruct/PreDestroy ManagedBeans 
15, 2020 11:05:43 org. apache. catalina. startup. HostConfig deployDirectory 
Deployment of web application directory D: 0. 82-windows-x64\apache-to 
-7. 0. 82\webapps\session has finished in 672 ms 
cat 
15, 2020 11:05:43 org. apache. coyote. AbstractProtoc01 start 
: Starting ProtocolHand1er C"http-bio-8080"] 
15, 2020 11:05:43 org. apache. coyote. AbstractProtoc01 start 
: Starting ProtocolHand1er C' ajp-bio-8009"] 
15, 2020 11:05:43 org. apache. catalina. startup. Catalina start 
= * : Server startup in 11690 ms

然后在cmd命令控制台上连接8005端口:telnet localhost 8005

然后输入:SHUTDOWN 按回车就会发现启动的tomcat被关闭了。

<Service>标签元素

该元素由org.apache.catalina.Service接口定义,默认实现类是org.apache.catalina.StandardService类;它包含一个<Engine>元素以及多个<connector>元素,这些connector元素共享同一个Engine元素。

<Service name="Catalina">:表示处理所有直接由tomcat服务器接收到的web客户请求。

<Service name="Apache">:表示处理所有由Apache服务器转发过来的web客户请求。

<Connector>标签元素

由connector接口定义,该元素代表与客户端实际交互的组件,它负责接受客户端请求,以及向客户端返回响应结果。

<!-- 一个“Connector”(连接器)代表一个请求被接收和应答所需要的端点。每个连接器通过相关的“Container”(容器)处理请求。

           默认情况下,一个非SSL的HTTP/1.1的连接器被绑定在端口8080。你也可以通过

         根据后面的使用说明并取消第二个连接器入口的注释,在端口8443上建立一个

         SSL HTTP/1.1的连接器。开放SSL支持需要下面几步(参见Tomcat 5文档中怎样

         配置SSL的说明以取得更多的详细信息):

         * 如果你的JDK是1.3或1.3以前的版本,下载安装JSSE 1.0.2或以后版本,并放

           置JAR文件到“$JAVA_HOME/jre/lib/ext”目录下。

         * 带一个“changeit”的口令值执行:

             %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)

             $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA (UNIX)

           来生成它自己的证书私钥。

         默认情况下,当一个web应用程序调用请求时,DNS查询是可行的。这将对性能造

         成一些不利的影响,因此,你可以将“enableLookups”设置为“false”来关闭DNS

         查询。当DNS查询被关闭时,request.getRemoteHost()将返回包含远程客户IP地

         址的字符串。

  -->

<!-- Coyote HTTP/1.1 Connector

(1)className : 该Connector的实现类是org.apache.coyote.tomcat4.CoyoteConnector

(2)port : 在端口号8080处侦听来自客户browser的HTTP1.1请求.如果把8080改成80,则只要输入http://localhost/即可

(3)protocol:设定Http协议,默认值为HTTP/1.1

(4)minSpareThreads: 该Connector先创建5个线程等待客户请求,每个请求由一个线程负责

(5)maxSpareThread:设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目.默认值为200

(6)acceptCount : 当现有线程已经达到最大数75时,为客户请求排队.当队列中请求数超过100时,后来的请求返回Connection refused错误

(7)redirectport : 当客户请求是https时,把该请求转发到端口8443去

(8)enableLookups:如果设为true,表示支持域名解析,可以把IP地址解析为主机名.WEB应用中调用request.getRemoteHost方法返回客户机主机名.默认值为true

(9)connectionTimeout:定义建立客户连接超时的时间.如果为-1,表示不限制建立客户连接的时间

(10)allowTrace:是否允许HTTP的TRACE方法,默认为false

(11)emptySessionPath:如果设置为true,用户的所有路径都将设置为/,默认为false。

(12)enableLookups:调用request、getRemoteHost()执行DNS查询,以返回远程主机的主机名,如果设置为false,则直接返回IP地址。

(13)maxPostSize:指定POST方式请求的最大量,没有指定默认为2097152。

(14)protocol:值必须为HTTP1.1,如果使用AJP处理器,该值必须为AJP/1.3

(15)proxyName:如这个连接器正在一个代理配置中被使用,指定这个属性,在request.getServerName()时返回

(16)redirectPort:如连接器不支持SSL请求,如收到SSL请求,Catalina容器将会自动重定向指定的端口号,让其进行处理。

(17)scheme:设置协议的名字,在request.getScheme()时返回,SSL连接器设为”https”,默认为”http”

(18)secure:在SSL连接器可将其设置为true,默认为false

(19)URIEncoding:用于解码URL的字符编码,没有指定默认值为ISO-8859-1

(20)useBodyEncodingForURI:主要用于Tomcat4.1.x中,指示是否使用在contentType中指定的编码来取代URIEncoding,用于解码URI查询参数,默认为false

(21)xpoweredBy:为true时,Tomcat使用规范建议的报头表明支持Servlet的规范版本,默认为false

(22)acceptCount:当所有的可能处理的线程都正在使用时,在队列中排队请求的最大数目。当队列已满,任何接收到的请求都会被拒绝,默认值为10

(23)bufferSize:设由连接器创建输入流缓冲区的大小,以字节为单位。默认情况下,缓存区大的大小为2048字节

(24)compressableMimeType:MIME的列表,默认以逗号分隔。默认值是text/html,text/xml,text/plain

(25)compression:指定是否对响应的数据进行压缩。off:表示禁止压缩、on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off

(26)connectionTimeout:设置连接的超时值,以毫秒为单位。默认值为60000=60秒

(27)disableUploadTimeOut:允许Servlet容器,正在执行使用一个较长的连接超时值,以使Servlet有较长的时间来完成它的执行,默认值为false

(28)maxHttpHeaderSize:HTTP请求和响应头的最大量,以字节为单位,默认值为4096字节

(29)maxKeepAliveRequest:服务器关闭之前,客户端发送的流水线最大数目。默认值为100

(30)maxSpareThreads:允许存在空闲线程的最大数目,默认值为50

(31)minSpareThreads:设当连接器第一次启协创建线程的数目,确保至少有这么多的空闲线程可用。默认值为4

(32)port:服务端套接字监听的TCP端口号,默认值为8080(必须)

(33)socketBuffer:设Socket输出缓冲区的大小(以字节为单位),-1表示禁止缓冲,默认值为9000字节

(34)toNoDelay:为true时,可以提高性能。默认值为true

(35)threadPriority:设JVM中请求处理线程优先级。默认值为NORMAL-PRIORITY

例:<Connector

port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false"

redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />

(36)AJP连接器:

用于将Apache与Tomcat集成在一起,当Apache接收到动态内容请求时,通过在配置中指定的端口号将请求发送给在此端口号上监听的AJP连接器组件。

属性:

  • backlog:当所有可能的请求处理线程都在使用时,队列中排队的请求最大数目。默认为10,当队列已满,任何请求都将被拒绝
  • maxSpareThread:允许存在空闲线程的最大数目,默认值为50
  • maxThread:最大线程数,默认值为200
  • minSpareThreads:设当连接器第一次启动时创建线程的数目,确保至少有这么多的空闲线程可用,默认值为4
  • port:服务端套接字的TCP端口号,默认值为8089(必须)
  • topNoDelay:为true时,可以提高性能,默认值为true
  • soTimeout:超时值

例:

<!—Define an AJP1.3 Connector on port 8089-->

<Connector port=”8089” enableLookups=”false” redirectPort=”8443” protocol=”AJP/1.3” />

-->

<Connector port="8080" maxThread="50" minSpareThreads="25" maxSpareThread="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" />

<Connection port="8009" enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3" />

第一个Connector元素定义了一个HTTP Connector,它通过8080端口接收HTTP请求;第二个Connector元素定义了一个JD Connector,它通过8009端口接收由其它服务器转发过来的请求.

<Engine>标签元素

每个service元素只能有一个Engine元素,处理同一个<Service>中所有<Connector>元素接收到的客户请求,由Engine接口定义。

<!-- Engine用来处理Connector收到的Http请求

         它将匹配请求和自己的虚拟主机,并把请求转交给对应的Host来处理

         默认虚拟主机是localhost

         -->

<Engine name="Catalina" defaultHost="localhost" debug="0">

(1)className指定实现Engine接口的类,默认值为StandardEngine

(2)defaultHost指定处理客户的默认主机名,在<Engine>中的<Host>子元素中必须定义这一主机

(3)name定义Engine的名字

在<Engine>可以包含如下元素<Logger>, <Realm>, <Value>, <Host>

<Host>标签元素

它由Host接口定义,一个Engine元素可以包含多个Host元素,每个Host元素定义了一个虚拟机主机,它包含一个或多个web应用。

<!-- 

 appBase : 指 定虚拟主机的目录,可以指定绝对目录,也可以指定相对于<CATALINA_HOME>的相对目录.如果没有此项,默认 为<CATALINA_HOME>/webapps. 它将匹配请求和自己的Context的路径,并把请求转交给对应的Context来处 理

              autoDeploy:如果此项设为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,如果有新有web应用加入进来,会自运发布这个WEB应用

              unpackWARs:如果此项设置为true,表示把WEB应用的WAR文件先展开为开放目录结构后再运行.如果设为false将直接运行为WAR文件

              alias:指定主机别名,可以指定多个别名

              deployOnStartup:如果此项设为true,表示Tomcat服务器启动时会自动发布appBase目录下所有的Web应用.如果Web应用 中的server.xml没有相应的<Context>元素,将采用Tomcat默认的Context

           -->

<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">

在<Host>元素中可以包含如下子元素

<Logger>, <Realm>, <Value>, <Context>

<Context>标签元素

它是由Context接口定义,是使用最频繁的元素,每个<Context>元素代表了运行在虚拟主机上的单个web应用,一个<Host>可以包含多个<Context>元素,每一个web应用都有唯一一个相对应的<context>元素,servlet容器就是作为第一个web应用被创建的。

<!-- Context,对应于一个Web App

 path : 该Context的路径名是"",故该Context是该Host的默认Context

 docBase : 该Context的根目录是webapps/mycontext/

 reloadable:如果这个属性设为true, Tomcat服务器在运行状态下会监视在WEB-INF/classes和Web-INF/lib目录CLASS文件的改运.如果监视到有class文件 被更新,服务器自重新加载Web应用

 useNaming:指定是否支持JNDI,默认值为了true 

 cookies指定是否通过Cookies来支持Session,默认值为true

 ->

<Context path="" docBase="mycontext" debug="0"/>

五、tomcat处理一个http请求的过程

假设来自客户端的请求:http://localhost:8080/index/index.html.jsp

  1. 请求被发送到本机端口8080上,并被监听8080端口、HTTP/1.1协议的Connector获取到。
  2. Connector把该请求交给它所在Service的Engine来处理,并等待来自Engine的响应
  3. Engine获得该请求后,匹配它所拥有的所有虚拟主机Host.
  4. Engine匹配到名为localhost的主机Host(即使匹配不到也会交给localhost主机来处理,因为Engine的默认主机就是localhost)
  5. localhost的主机解析获取到请求/index/index.jsp,匹配它所拥有的所有Context。
  6. Host匹配到路径为/index的Context。
  7. Path="/index"的Context获取到请求index.jsp,在它的mapping table中寻找对应的servlet
  8. Context匹配到URL为.jsp的servlet类(其实就是JspServlet类做处理)
  9. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用servlet类的doGet或doPost方法
  10. Context把执行完的HttpServletResponse对象返回给Host
  11. Host把HttpServletResponse对象返回给Engine
  12. Engine把HttpServletRespongse对象返回给Connector
  13. Connector把HttpServletResponse对象返回给客户端。

 

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。