跳至主要內容

tomcat

chanchaw大约 5 分钟languagejava

错误与提示

部署多项目出错

一个 tomcat 下部署多个项目,A项目访问正常,B项目访问404,找到B项目下的 web.xml 修改 webAppRootKey 的值,保证多个项目在该属性下不同

<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>tianli</param-value>
</context-param>

因为在清除过期缓存条目后可用空间仍不足

修改配置文件 apache-tomcat-8.5.99\conf\context.xml 标签 <Context> 下的子标签 Resources 如果没有则新建该标签,完整代码如下

<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
	<Resources cachingAllowed="true" cacheMaxSize="1024000" />
    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
</Context>

属性 cacheMaxSize 的单位是 KB 默认1024,当提示不足就增加该数值,上面代码设置为1G

配置文件 conf/server.xml

文件 Tomcat 8.5\conf\server.xml 是 tomcat 主要参数配置文件,找到本文件的 <Connector port="8080"... 标签,其中的N多属性是对 tomcat 做配置的参数 URIEncoding="UTF-8" 表示 tomcat 使用的字符集,本配置文件的最简配置只要有 Server 节点下的 Connector,Engine,Host 即可。注意自定义的项目所在的根目录的路径要填写绝对路径,如下图:
tomcat.server.xml最简配置 线程池参数的介绍看下面代码

    <!--
         2024年2月15日 15:34:11 下面讲的线程是业务线程,指用于处理自己开发的业务逻辑的线程
         minSpareThreads:最小空闲线程数量,线程池会保持的最小线程数量,即使长时间没有客户端请求服务器也会保持该数量的线程,初始化线程池时会创建该数量的线程
         maxThreads:最大线程数,当同时处理的请求数量超过 minSpareThreads 时每个新的请求都会导致创建新的线程,逐渐达到本 maxThreads 设定的数量
                     此后继续过来新的请求时线程池依然会创建新的连接,但是不会创建新的线程,即tomcat线程池在达到 maxThreads 之后再有新的请求依然会创建新的连接
                     但是不会在线程池中创建新的线程,新的连接在线程池的队列中等待有繁忙的线程结束任务后从任务队列中取出排队的连接进行处理,
                     直到达到 maxConnections,超过 maxConnections 后整个 tomcat 不再创建新的连接。
                     此后再有新的请求过来会挂起连接,能够挂起的数量就是 acceptCount
         acceptCount:请求队列保存的最大任务数量,超过该数量的请求被拒绝
         maxConnections:最大连接数,即同时保持的连接的最大数量,如果是BIO模式则应等于 maxThreads,因为BIO是阻塞模式
         enableLookups:false表示禁用DSN查询
         disableUploadTimeout:上传文件永不超时
         protocol:使用NIO模式访问本地文件(html文件)
         总结:将tomcat的线程池机制比作医院的话,minSpareThreads是常年都有该数量的医生在值班,即使一直没有病人也保证有minSpareThreads个医生在上班
               当病人多出来,超过了minSpareThreads,则每新增一个病人就多创建一个线程(召休息的医生来上班)直到达到maxThreads个医生就不再召
               休假医生来上班了。maxConnections相当于挂号数量,即使现在maxThreads个医生在上班了,也可以有新的病人来挂号,直到达到 maxConnections 个挂号数量
               超过了 maxConnections 继续有病人来则要到等候室等待不能挂号了(挂号相当于建立连接)
    -->
    <Connector port="8080" connectionTimeout="20000" redirectPort="8443" 
               protocol="org.apache.coyote.http11.Http11NioProtocol"
               URIEncoding="UTF-8"
               minSpareThreads="50"
               maxThreads="1000"
               maxConnections="2000"
               acceptCount="100"
               enableLookups="false"
               disableUploadTimeout="true"
               />

配置参数

在标签 <Connector port="8080"... 中设置多个属性的数值

maxThreads

最大线程数,每一次HTTP请求到达Web服务器,tomcat都会创建一个线程来处理该请求,那么最大线程数决定了Web服务器可以同时处理多少个请求。maxThreads默认200。增加线程是有成本的,更多的线程,不仅仅会带来更多的线程上下文切换成本,而且意味着带来更多的内存消耗。JVM中默认情况下在创建新线程时会分配大小为1M的线程栈,所以,更多的线程意味着需要更多的内存。线程数的经验值为:1核2g内存,线程数经验值200;4核8g内存,线程数经验值800。

maxConnections

这个参数是指在同一时间,tomcat能够接受的最大连接数。对于Java的阻塞式BIO,默认值是maxthreads的值;如果在BIO模式使用定制的Executor执行器,默认值将是执行器中maxthreads的值。对于Java 新的NIO模式,maxConnections 默认值是10000。 对于windows上APR/native IO模式,maxConnections默认值为8192,这是出于性能原因,如果配置的值不是1024的倍数,maxConnections 的实际值将减少到1024的最大倍数。 如果设置为-1,则禁用maxconnections功能,表示不限制tomcat容器的连接数。 maxConnections 和 accept-count 的关系为:当连接数达到最大值maxConnections后,系统会继续接收连接,但不会超过acceptCount的值。换一种说法:超过 maxConnections 的数量被排队累计到 accept-count 中,当排队的数量超过了 accept-count 则超出的连接都会被拒绝。

KeepAlive, KeepAliveTimeout, MaxKeepAliveRequests

KeepAlive 是在 HTTP1.1 中定义的,用来保持客户机和服务器的长连接,通过减少建立 TCP Session 的次数来提高性能。常用的配置参数有{KeepAlive, KeepAliveTimeout, MaxKeepAliveRequests}。逐个说来: KeepAlive是决定开启KeepAlive支持; KeepAliveTimeout决定一 个KeepAlive的连接能保持多少时间,超过该时长则会被断开,若再次请求则必须再建立新的连接。MaxKeepAliveRequests 于 KeepAliveTimeout 相似,意思是 web 服务器可以接受的最多的保持长连接的数量。