一、清理Tomcat
1、清理 webapps下的应用
清理webapps目录下不需要的应用,一般是host-manager、example、doc等默认的应用,也有可能是之前添加而现在不再使用的应用。这些项目最好都删掉,Tomcat在每次启动的使用都会加载webapps目录下的应用。如果使用Springboot这样嵌入式Tomcat的话,不用考虑这些问题。
2、清理 XML 配置文件
Tomcat在启动的时候需要解析 XML 配置文件,我们都知道 XML 文件解析是一个重量级的操作,所以应该尽量保持 XML 配置文件的简洁。
3、清理 jar 文件
删除不需要的 jar 包。Tomcat 启动的时候类加载器在加载类时,会去每一个 jar 包查找需要的类。
Web 应用中的 lib 目录下不应该出现 Servlet API 或者 Tomcat 自身的 JAR,这些 JAR 由 Tomcat 负责提供。如果你是使用 Maven 来构建你的应用,对 Servlet API 的依赖应该指定为<scope>provided</scope>
。
4、清理其他文件
及时清理日志,删除 logs 文件夹下不需要的日志文件。同样还有 work 文件夹下的 catalina 文件夹,它其实是 Tomcat 把 JSP 转换为 Class 文件的工作目录。有时候我们也许会遇到修改了代码,重启了 Tomcat,但是仍没效果,这时候便可以删除掉这个文件夹,Tomcat 下次启动的时候会重新生成。
二、禁止 TLD 扫描
Tomcat 为了支持 JSP,在启动应用的时候会扫描 jar 包里面的 TLD 文件,加载里面定义的标签库,所以在 Tomcat 启动的时候在启动日志里面可能会看到:
At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
意思是Tomcat扫描到了 jar 包没有 TLD 文件。建议配置一下 Tomcat 不要去扫描这些 jar 包。这样可以提高 Tomcat 的启动速度和编译时间,因为 JSP 文件是需要编译的。现在的Web应用应该是很少用 JSP 来写页面了,除了历史遗留的老项目。
如果没有使用 JSP 写页面,完全可以禁止扫描 TLD。在 Tomcat 的conf目录下的context.xml文件的context标签下加上:
|
|
如果确实是用了 JSP,那么 TLD 扫描是无法避免的,但是可以通过配置来让 Tomcat 只扫描那些包含 TLD 的 jar 包。在 conf 目录下的 catalina.properties 文件加上配置:
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=xxx.jar
三、关闭 WebSocket 支持
Tomcat 会扫描 WebSocket 注解的视线,比如:@ServerEndpoint
注解的类。注解臊面一般是比较慢的,如果不需要使用 WebSockets 可以关闭它。在conf 目录下的 context.xml 配置文件,给Context标签加上containerSciFilter
属性:
|
|
甚至如果不需要 WebSockets 功能,可以把 Tomcat lib 目录下的 websocket-api.jar
和tomcat-websocket.jar
给剔除掉,
三、关闭 JSP 支持
和关闭 WebSockets 一样都是修改 context.xml 配置文件的Context标签的containerSciFilter
属性:
|
|
四、禁止 Servlet 注解扫描
Servlet 3.0 引入了注解 Servlet,Tomcat 为了支持这个特性,在web应用启动的时候会扫描类文件,如果没有使用Servlet注解的话,可以配置不去扫描。在web应用的web.xml中设置:
|
|
metadata-complete
的意思是,在web.xml配置的 Servlet 是完整的,不需要再去库类中查找 Servlet 的定义。
五、配置 Web-Fragment 扫描
Servlet 3.0 还引入了“Web 模块部署描述符片段”的web-fragment.xml
,这是一个部署描述文件,可以完成web.xml
的配置功能。而这个web-fragment.xml
文件必须存放在 JAR 文件的META-INF
目录下,而 JAR 包通常放在WEB-INF/lib
目录下,因此 Tomcat 需要对 JAR 文件进行扫描才能支持这个功能。
你可以通过配置web.xml
里面的<absolute-ordering>
元素直接指定了哪些 JAR 包需要扫描web fragment
,如果<absolute-ordering/>
元素是空的, 则表示不需要扫描:
|
|
六、随机数熵源优化
Tomcat 7 以上版本依赖了 Java 的 SecureRandom 类来生成随机数,例如 SessionID。JVM默认使用阻塞是熵源(/dev/random),在某些情况下就会导致 Tomcat 启动变慢。当阻塞事件较长是,会看到日志警告:
<DATE>
org.apache.catalina.util.SessionIdGenerator createSecureRandom INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [8152] milliseconds.
解决方案就通过配置,让JVM使用非阻塞式的熵源:
-Djava.security.egd=file:/dev/./urandom
或者是设置java.security文件,位于$JAVA_HOME/jre/lib/security
目录之下: securerandom.source=file:/dev/./urandom
。
注意:/dev/./urandom
中间有个./
的原因是 Oracle JRE 中的 Bug,Java 8 里面的 SecureRandom 类已经修正这个 Bug。 阻塞式的熵源(/dev/random
)安全性较高, 非阻塞式的熵源(/dev/./urandom
)安全性会低一些,因为如果你对随机数的要求比较高, 可以考虑使用硬件方式生成熵源。
七、并行启动多个 Web 应用
Tomcat 启动的时候,默认情况下 Web 应用都是一个个启动的,等所有 Web 应用全部启动完成,Tomcat 才算启动完成。如果在一个 Tomcat 下启动多个 Web 应用,要优化启动速度,可以配置多个应用并行启动。通过修改 server.xml 文件中 Host 元素的 startStopThreads 属性来完成,意思是想用多少个线程来启动 Web 应用,如果设置成 0 表示要并行启动 Web 应用:
|
|
还有一个注意点是,如果Tomcat的Engine标签也可以配置该属性,如果配置了为0,那么就意味着配置了多个Host,Tomcat 会并行的方式启动多个Host。