tomcat配置详解


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应用程序 ,替换web.xml在全局定义唯一常量,可以是类,也可是是具体的值,tomcat中定义可以在tomcat下多个服务都共享这个常量
   -->

<!--JNDI是java命名目录接口,也就是和配置文件交互的规范-->
  <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">

   
    <!-- 默认情况下,每个连接器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;(请求处理线程的最大数量。默认值是200(Tomcat7和8都是的)。如果该Connector绑定了Executor,这个值会被忽略,因为该Connector将使用绑定的Executor,而不是内置的线程池来执行任务。maxThreads规定的是最大的线程数目,并不是实际running的CPU数量;实际上,maxThreads的大小比CPU核心数量要大得多。这是因为,处理请求的线程真正用于计算的时间可能很少,大多数时间可能在阻塞,如等待数据库返回数据、等待硬盘读写数据等。因此,在某一时刻,只有少数的线程真正的在使用物理CPU,大多数线程都在等待;因此线程数远大于物理核心数才是合理的。

换句话说,Tomcat通过使用比CPU核心数量多得多的线程数,可以使CPU忙碌起来,大大提高CPU的利用率。)
          - redirectPort:如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,
                          则转发至此属性定义的端口;
          - enableLookups:是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名;
                           默认为true;
          - acceptCount:设置等待队列的最大长度;(accept队列的长度;当accept队列中连接的个数达到acceptCount时,队列满,进来的请求一律被拒绝。默认值是100。)
          - executor:指定共享的线程池组件;
          -maxConnections:    Tomcat在任意时刻接收和处理的最大连接数。当Tomcat接收的连接数达到maxConnections时,Acceptor线程不会读取accept队列中的连接;这时accept队列中的线程会一直阻塞着,直到Tomcat接收的连接数小于maxConnections。如果设置为-1,则连接数不受限制。默认值与连接器使用的协议有关:NIO的默认值是10000(HTTP/1.1默认使用NIO,也支持BIO),APR/native的默认值是8192,而BIO的默认值为maxThreads(如果配置了Executor,则默认值是Executor的maxThreads)。在windows下,APR/native的maxConnections值会自动调整为设置值以下最大的1024的整数倍;如设置为2000,则最大值实际是1024。

参数设置补充说明:1)maxThreads的设置既与应用的特点有关,也与服务器的CPU核心数量有关。通过前面介绍可以知道,maxThreads数量应该远大于CPU核心数量;而且CPU核心数越大,maxThreads应该越大;应用中CPU越不密集(IO越密集),maxThreads应该越大,以便能够充分利用CPU。当然,maxThreads的值并不是越大越好,如果maxThreads过大,那么CPU会花费大量的时间用于线程的切换,整体效率会降低。

(2)maxConnections的设置与Tomcat的运行模式有关。如果tomcat使用的是BIO,那么maxConnections的值应该与maxThreads一致;如果tomcat使用的是NIO,那么类似于Tomcat的默认值,maxConnections值应该远大于maxThreads。

(3)虽然tomcat同时可以处理的连接数目是maxConnections,但服务器中可以同时接收的连接数为maxConnections+acceptCount 。acceptCount的设置,与应用在连接过高情况下希望做出什么反应有关系。如果设置过大,后面进入的请求等待时间会很长;如果设置过小,后面进入的请求立马返回connection refused。
     -->
    <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>

web.xml配置#

Tomcat的conf目录下面的web.xml配置文件和我们平时应用中WEB-INF下面的配置web.xml功能一致,只是Tomcat下面的这个配置文件用来配置所有应用通用的配置,对所用应用生效。

配置默认servlet,Jsp处理器和一些其他的filter;
为所有的Web应用程序提供包括MIME映射;
并设置欢迎页面。
通常Tomcat下面的这个配置文件不需要我们自己另行做额外配置。

context.xml配置#
context组件是host组件的子组件。context.xml中的配置是所有host组件的通用配置,Tomcat的conf目录下的context.xml的内容,如下。(通常,这个配置文件也不需要我们做另外的配置)

logging.properties配置#
Tomcat日志相关的配置文件,不是重点。

tomcat-users.xml配置#
Tomcat提供了一个管理控制台,在控制台的manager的管理页面,我们能够查看到所有部署的应用的运行状态、也能管理应用的运行。当然,我们也能通过这个界面进行应用部署。

当然,想要通过这个界面进行应用管理和部署,需要用户进行登陆。这些配置就是在tomcat-users.xml中进行配置的。

Tomcat中支持的所有的用户管理角色有:

<!-- 相当于admin角色,网站管理员角色 -->
<role rolename="admin-gui"/> 
<role rolename="admin-script"/>
<!--允许访问html接口(即URL路径为/manager/html/*)-->
<role rolename="manager-gui"/>
<!-- 允许访问纯文本接口(即URL路径为/manager/text/*) -->
<role rolename="manager-script"/>
<!-- 允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*)-->
<role rolename="manager-jmx"/>
<!-- 允许访问Tomcat只读状态页面(即URL路径为/manager/status/*)-->
<role rolename="manager-status"/>

配置用户的角色、登录名和密码,需要在tomcat-users.xml中进行配置。

如果想要访问manager页面需要配置:

<role rolename="manager-gui"/>
<user username="admin" password="password" roles="manager-gui"/>
如果需要使用到远程部署等功能,需要添加上:

<role rolename="manager-script" />
<user username="admin" password="password" roles="manager-gui,manager-script"/>
下面给出一个比较完整的配置列子,生产环境需要根据具体需求配置用户和角色。

  <!-- 相当于admin角色,网站管理员角色 -->
  <role rolename="admin-gui"/> 
  <role rolename="admin-script"/>
  <!--允许访问html接口(即URL路径为/manager/html/*)-->
  <role rolename="manager-gui"/>
  <!-- 允许访问纯文本接口(即URL路径为/manager/text/*) -->
  <role rolename="manager-script"/>
  <!-- 允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*)-->
  <role rolename="manager-jmx"/>
  <!-- 允许访问Tomcat只读状态页面(即URL路径为/manager/status/*)-->
  <role rolename="manager-status"/>
  <user username="admin" password="admin123" roles="admin-gui,admin-script"/>
  <user username="manager" password="manager123" roles="manager-gui,manager-script"/>
 

jaspic-providers.xml配置#
关于jaspic-providers.xml配置,作用和tomcat-user.xml类似,都是实现用户认证的。Tomcat 实现了 JASPIC 1.1 Maintenance Release B 标准,并通过这个配置文件集成第三方 JASPIC 身份验证。

但是这个认证方式不怎么使用,大家不用太关注这个配置。

catalina.properties和catalina.policy配置#
这里面的很多配置是在Tomcat以安全模式启动时才会生效的,平时我们大多情况下都不会以安全模式启动Tomcat,所有很多配置可能用不太到。关于对Java中SecurityManager的介绍,大家可以参考下这边文章,比较浅显易懂。(这边留个问题,是否需要使用安全模式启动Java应用?)

不过catalina.properties中关于公共组件的配置,还是比较有用的,我们可以看下。

catalina.properties中的配置分为四个部分:

Tomcat加载类的顺序是:

Bootstrap--->System--->/WEB-INF/classes---> /WEB-INF/lib/*.jar---> Common--->Server--->Shared(先加载引入的包,在加载部署的应用)

所以加载完项目的WEB-INF的lib下面的Jar包后回来加载common下面的包。关于common loader,tomcat已经做了相关配置:

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"
 

上面的配置表示,common loader会加载catalina.base和catalina.home下面的class类和Jar包中的类。

关于server.loader和shared.loader,Tomcat并没有做出明确的配置,我们可以自己进行配置。比如:

server.loader=${catalina.base}/server/classes,${catalina.base}/server/lib/*.jar
shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar
 

上面的含义和common loader的含义一致。

平时我们的一些组件假如需要让所有Web应用依赖的话,我们就可以放在common.loader、server.loader和shared.loader指定的目录下面。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值