Tomcat--服务器配置

Tomcat服务器配置

Tomcat服务器的配置主要集中于tomcat/conf下的catalina.policy、catalina.properties、context.xml、server.xml、tomcat-users.xml、web.xml文件

1 server.xml

server.xml是tomcat服务器的核心配置文件,包含了tomcat的Servlet容器(Catalina)的所有配置。由于配置的属性特别多,只介绍部分重要配置:

1.1 Server

Server是server.xml的根元素,用于创建一个Server实例,默认使用的实现类是org.apache.catalina.core.StandardServer

<Server port="8005" shutdown="SHUTDOWN">
	...
</Server>
  • port: Tomcat监听的关闭服务器的端口
  • shutdown:关闭服务器的指令字符串

Server内嵌的子元素为Listener、GlobalNamingResources、Service

默认配置的5个Listener的含义:

  <!-- 用于以日志形式输出服务器、操作系统、JVM的版本信息 -->
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- 用于加载(服务器启动)和销毁(服务器停止)APR。如果找不到APR库,则会输出日志,并不影响Tomcat启动 -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!-- 用于避免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" />

GolbalNamingResources中定义了全局命名服务:

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <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>
1.2 Service

该元素用来创建Service实例,默认使用org.apache.catalina.core.StandardService。默认情况下,Tomcat仅指定了Service的名称,值为Catalina。Service可以内嵌的元素为:Listener、Executor、Connector、Engine,其中Listener用于为Service添加生命周期监听器,Executor用于配置Service共享线程池,Connector用于配置Service包含的链接器,Engine用于配置Service中链接器对应的Servlet容器引擎。

<Service name="Catalina">
	...
</Service>

一个Server服务器,可以包含多个Service服务。

1.3 Executor

默认情况下,Service并未添加共享线程池配置。如果我们想添加一个线程池,可以在<Service>下添加如下配置:

<Executor name="tomcatThreadPool"
	namePrefix="cataline-exec-"
	maxThreads="1000"
	minSpareThreads="100"
	maxIdleTime="60000"
	maxQueueSize="Integer.MAX_VALUE"
	prestartminSpareThreads="false"
	threadPriority="5"
	className="org.apache.catalina.core.StandardThreadExecutor"
属性 含义
name 线程池名称,用于Connetor中指定
namePrefix 所创建的每个线程的名称前缀,一个单独的线程名称为namePrefix+threadNumber
maxThreads 池中最大线程数
minSpareThreads 活跃线程数,也就是核心线程数,这些线程不会被销毁,会一直存在
maxIdleTime 线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(一分钟),单位毫秒
maxQueueSize 在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无线。除非特殊情况,这个值不需要修改,否则会有请求不会被处理的情况发生
prestartminSpareThreads 启动线程池时是否启动minSpareThreads部分线程。默认值为false,即不启动
threadPriority 线程池中线程优先级,默认为5,值从1到10
className 线程池类,未指定的情况下,默认实现类为
org.apache.catalina.core.StandardThreadExecutor。
如果想要使用自定义线程池首先要实现
org.apache.catalina.Executor接口

注意如果不配置共享线程池,tomcat会在各组件用到的时候自动创建。

1.4 Connector

Connector用于创建连接器实例,默认情况下,server.xml配置了两个链接器,一个支持HTTP协议,一个支持AJP协议。因此大多数情况下,我们并不需要新增链接器配置,只是根据需要对已有的链接器进行优化。

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  • port:端口号,Connector用于创建服务端Socket并进行监听,以等待客户端请求链接。如果该属性为0,Tomcat会随机选择一个可用的端口号给当前Connector使用
  • protocol:当前Connector支持的访问协议。默认为HTTP/1.1,并采用自动切换机制选择一个基于JAVA NIO的链接器或者基于本地APR的链接器(根据本地是否含有Tomcat本地库判定)

如果不希望采用上述自动切换的机制,而是明确指定协议,可以使用以下值:

Http协议:

org.apache.coyote.http11.Http11NioProtocol  //非阻塞式 Java NIO 链接器
org.apache.coyote.http11.Http11Nio2Protocol  //非阻塞式 Java NIO2 链接器
org.apache.coyote.http11.Http11AprProtocol  //APR链接器

AJP协议:

org.apache.coote.ajp.AjpNioProtocol  //非阻塞 Java NIO 链接器
org.apache.coote.ajp.AjpNio2Protocol  //非阻塞 Java NIO2 链接器
org.apache.coote.ajp.AjpAprProtocol  //APR链接器
  • connectionTimeOut:Connector接收链接后的等待超时时间,单位为毫秒。-1表示不超时
  • redirectPort:当前Connector不支持SSL请求,接收到了一个请求,并且也符合security-constraint约束,需要SSL传输,Catalina自动将请求重定向到指定的端口
  • executor:指定共享线程池的名称,也可以通过maxThreads、minSpareThreads等属性配置内部线程池
  • URIEncoding:用于指定编码URI的字符编码,Tomcat8.x 版本的默认编码为UTF-8

完成配置如下:
在这里插入图片描述

1.5 Engine

Engine作为Servlet引擎的顶级元素,内部可以嵌入Cluster、Listener、Realm、Valve和Host

<Engine name="Catalina" defaultHost="localhost">
	...
</Engine>
  • name:用于指定Engine的名称,默认为Catalina。改名称会影响一部分Tomcat的存储路径(临时文件等)
  • defaultHost:默认使用的虚拟主机名称,当客户端请求指向的主机无效时,将交由默认的虚拟主机处理,默认为localhost
1.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">
	...
</Host>
- name:当前Host通用的网络名称,必须与DNS服务器上的注册信息一致,Engine中包含的Host必须存在一个名称于Engine的defaultHost设置一致
- appBase:当前Host的应用基础目录,当前Host上部署的Web应用均在该目录下(可以是绝对路径,相对路径)。默认为webapps
- unpackWARs:设置为true,Host在启动时将会将appBase目录下war包解压为目录。设置为false,Host将直接从war文件启动
- autoDeploy:控制tomcat是否在运行时定期检测并自动部署新增或变更的web应用


通过给Host添加别名,可以实现同一个Host拥有多个网络名称,配置如下:
```xml
<Host name="www.xxx.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
	<Alias>www.xxx2.com</Alias>
</Host>

这个时候,我们就可以通过两个域名范文当前Host下的应用(需要确保DNS或host中添加了域名的映射配置)

1.7 Context

Context用于配置一个Web应用,默认的配置如下:

<Context docBase="myApp" path="/myApp">
	...
</Context>
  • docBase:Web应用目录或者War包的部署路径。可以是绝对路径,也可以时相对于Host appBase的相对路径
  • path:Web应用的Context路径。如果我们Host名为localhost,则该Web应用的根路径为:http:localhost:8080/myApp

它支持的内嵌元素为:CookieProcessor、Loader、Manager、Resources、WatchedResource、JarScanner、Valve

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

		<Context docBase="D:\servlet_project-3" path="/myApp"></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>
发布了892 篇原创文章 · 获赞 2314 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/cold___play/article/details/105150870