第十三章 Tomcat优化

本文详细介绍了Tomcat的源码导入、Web容器和Servlet容器的工作原理,重点探讨了server.xml配置文件的作用,以及内存优化、线程池调整和启动速度提升的策略。
摘要由CSDN通过智能技术生成

一、Tomcat 优化

   
1.1 源码导入
1. 下载对应的 tomcat 版本源码(Tomcat8.0.11)
2. 源码根目录下创建 pom.xml 文件
3. 将源码导入 idea 中
  
1.2 Web 容器
- Connector.initInternal()->
- protocolHandler.init()->
- AbstractProtocol.init()->
- endpoint.init()->
- bind()->
- Apr,JIo,NIO,NIO2->
- JIo 即 Socket 实现方式
  
1.3 Servlet 容器
- 加 载 : ContextConfig.webConfig() — >getContextWebXmlSource() —>Constants.ApplicationWebXml
- 解 析 : ContextConfig.webConfig() — >configureContext(webXml) —>context.createWrapper()
  
1.4 Tomcat 组件
- Server 就是一个 Tomcat
- Service 容器
- Connector 连接器(多个)
- Engin 引擎(一个)
- Host 虚拟主机
- Context 发布的应用
- Wrapper 包装内容的盒子
- Servlet 应用
  
1.5 server.xml
Server.xml 文件说明:
- Server
- 代表整个 Catalina Server 容器,是 Tomcat 实例的顶层元素,由org.apach.catalina,Server 接口定义,其下可以包含一个或多个 Service 元素。
- 实现类:实现 org.apache.catalina.Server 接口的类,默认值为org.apache.catalina.core.StandardServer。
- port:服务器监听 shutdown 命令的端口,必须设置。
- shutdown:停止 tomcat 时发送给 shutdown 监听端口的字符串。
- port 和 shutdown 是关闭的端口号和命令,建议改掉,要不然别人远程可以改掉。
    
- Service
- 由 org.apache.catalina.Service 接口定义,它包含一个元素,以及一个或多个元素,这些元素共享一个元素。
- 实现类:实现 org.apache.catalina.Service 接口的类,默认值为org.apache.catalina.core.StandardService。
  
- Engine
- 由org.apahe.catalina.Engine接口定义.每个元素只能包括一个元素. 元素处理在同一个中所有元素接收到的客户请求。
- 相关实现类:org.apache.catalina.Engine接口的类,默认值为org.apache.catalina.core.StandardEngine。
- name 定义Engine的名字。
- defaultHost 默认处理请求的主机名,必须与其中的一个Host元素的名称一样。
- 默认的虚拟机是localhost。
  
- Host
- 由org.apache.catalina.Host接口定义.一个元素可以包含多个元素.每个元素定义了一个虚拟主机,它可以包含一个或多个Web应用。
- 实现类 实现org.apache.catalina.Host接口的类,默认值为org.apache.catalina.core.StandardHost。
- appBase 指定虚拟主机的对应的目录(即虚拟主机的部署目录),可以是绝对路径,也可以是相对于tomcat安装目录的相对路径,默认的部署目录为webapps。
- unpackWARs 配置为true,表示tomcat会自动解压部署目录中的war包,如果配置为false,则不会解压,直接运行war文件,默认为false,建议保持默认值。
- autoDeploy 配置为true,表示tomcat处于运行状态时可以监测部署目录中的文件状态,如果有新的web应用部署进来则自动发布这个web应用。
- 是可以搞出多个虚拟主机。
  
- Context
- 最常配置的元素,每一个Context代表一个运行在tomcat中的web应用,一个Host下可以配置多个Context。
- 实现类: 实现org.apache.catalina.Context接口的类,默认值为org.apache.catalina.core.StandardContext。
- path 指定访问web应用的url路径。
- docBase 发布的web应用的文件路径,可以时绝对路径,也可以是相对与发布目录的相对路径。
- reloadable 设置为true,tomcat在运行期间会监测发布应用的WEB-INF/classes和WEB-INF/lib目录中的文件改动,当检测到文件变动后,tomcat会自动重新加载应用。
- cookies 是否可以通过cookie来支持Session,默认为true。
- 虽然可以使用Context节点来部署应用,但自tomcat5.5之后就不再建议这么做,可以在/conf/Catalina/{hostname}/xxx.xml进行独立部署,最简单的方式是直接将要发布的应用放到webapps下。
   
1.6 两个核心组件
- Connector:主要负责处理 Socket 连接,以及 Request 与 Response 的转化。
- Container:包括 Engine、Host、Context 和 Wrapper,主要负责内部的处理以及 Servlet 的管理。
   
1.7 性能优化常用配置
1.7.1 内存空间优化
JAVA_OPTS="-server -Xms4g -Xmx4g -XX:NewSize= -XX:MaxNewSize= "
  
-server:服务器模式
-Xms:堆内存初始化大小
-Xmx:堆内存空间上限
-XX:NewSize=:新生代空间初始化大小
-XX:MaxNewSize=:新生代空间最大值
  
生产案例:
[root@centos7 ~]#vim /usr/local/tomcat/bin/catalina.sh
# OS specific support.  $var _must_ be set to either true or false.
JAVA_OPTS="-server -Xms4g -Xmx4g -Xss512k -Xmn1g -XX:CMSInitiatingOccupancyFraction=65 -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:PermSize=128m -XX:MaxPermSize=512m -XX:CMSFullGCsBeforeCompaction=5 -XX:+ExplicitGCInvokesConcurrent -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods"
   
cygwin=false
darwin=false
#一台tomcat服务器并发连接数不高,生产环境建议分配物理内存通常4G到8G较多,如果需要更多连接,一般会利用虚拟化技术实现多台tomcat
  
1.7.2 线程池调整
[root@centos7 ~]#vim /usr/local/tomcat/conf/server.xml
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
  
常用属性:
- connectionTimeout :连接超时时长,单位 ms。
- maxThreads:最大线程数,默认 200。
- minSpareThreads:最小空闲线程数。
- maxSpareThreads:最大空闲线程数。
- acceptCount:当启动线程满了之后,等待队列的最大长度,默认 100。
- URIEncoding:URI 地址编码格式,建议使用 UTF-8。
- enableLookups:是否启用客户端主机名的 DNS 反向解析,缺省禁用,建议禁用,就使用客户端 IP 就行。
- compression:是否启用传输压缩机制,建议 “on”,CPU 和流量的平衡。
- compressionMinSize:启用压缩传输的数据流最小值,单位是字节。
- compressableMimeType:定义启用压缩功能的 MIME 类型 text/html,text/xml,text/css,text/javascript。
   
1.7.3 启动速度优化
1. jars
将一些不必要的 jar 包去掉,当 tomcat 启动加载 jar 包的时候,会去搜寻每个 jar 包里的 class 文件,这些都会耗费一些时间,如果你把不必要的 jar 包去掉了,很显然会节省时间。
2. 缓存
可以在 bin/catalina.sh 中设置 jvm 所能使用到的缓存大小,如:JAVA_OPTS=’-Xms1024m -Xmx1024m’。
3. 配置文件
Tomcat 的配置比如 server.xml 是 xml 文件,而 xml 的解析也是要花时间的,如果我们能将 xml 配置文件尽可能地弄得简洁一些,比如去掉一些没有用到的节点,这也有助于减少启动的时间,虽然这个节省的时间看来很少。
4. 应用程序
- 确保程序在启动的时候没有一些处理很耗时的地方;
- 删除掉 tomcat 自带的目录 webapps 及下面的所有内容,不然的话每次启动的时候都会加载这些自带的例子;
- 修改 WEB-INF/web.xml 文件,在默认的情况下中的属性 metadata-complete 的值为 false,这种情况下,tomcat 在启动时会去自动扫描是否有注解及网络碎片,如果你不想 tomcat 这样做,你可以将 metadata-complete 的值设为 true。
5. 并行启动多个应用程序
默认情况下,假设在一个 tomcat 下你有多个应用,那么启动的时候,这些应用程序都是依次启动的,除非所有应用全部启动完毕,tomcat 才会启动完成,但从 Tomcat 7.0.23+开始,你可以配置多个应用程序并行启动了!你可以通过修改配置文件中 Host 里面的 startStopThreads 这个属性的值来达到这个目的,将多个应用 startStopThreads 的值设为不同即可。
  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方寸之间不太闲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值