《Tomcat架构解析》读书笔记——tomcat优化及安全配置
1:部署包名通过#或者##分隔,可以实现对不同webapp实现统一的请求路径
#用于连接目录,##用于连接版本号
例:app#a 、app#b两个war包发布,请求路径默认为:/app/a和/app/b
app##1 app##2 :访问/app时:
(1)request中没有session信息:使用新版本
(2)request中包含session信息:在每个app的会话管理器中寻找。如果没找到,使用新版本
2:filter-mapping中可以不使用url-pattern,直接用servlet-name:只针对该servlet的请求进行处理(相当于使用和该servlet相同的url-pattern)
3:安全性:
3.1:不使用manager时可以将名称为UserDatabase的Resource删掉
3.2:关闭shutdown端口:设置为-1
3.3:connector的server属性:包含在HTTP头中,默认为coyote,可以修改为其他值
3.4:避免webapp下的所有应用自动启动:修改host的autoDeploy和deployOnStartup为false(此时只有host下配置了context的应用会部署,并且变更应用的class时需要手动重启)
3.5:context的crossContext属性:是否可以访问其他context的资源,默认为false
3.6:context的allowLinking属性:是否允许符号链接,默认为false。为true时可以访问Web-inf
3.7:定制化ErrorReportValve类,修改showReport(异常栈)和showServerInfo(隐藏服务器信息)为false。错误页面推荐直接web.xml配置error-page
4:添加https连接器及证书
ssl证书生成:
windows: keytool -genkey -alias td -keyalg RSA -keystore d:\key.store
linux:./keytool -genkey -alias td -keyalg RSA -keystore d:\key.store
生成后放入conf文件夹中。
对于https的端口:必须要与http连接器的redirectPort一致
redirectPort的作用:
当用户用http请求某个资源,而该资源本身又被设置了必须要https方式访问,此时Tomcat会自动重定向到这个redirectPort设置的https端口。
放开server.xml中的https连接器:
对于8.5以后:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/tdkey.keystore" certificateKeystorePassword="123456"
type="RSA" />
</SSLHostConfig>
</Connector>
对于8.5之前:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="d:\key.keystore" keystorePass="123456" clientAuth="false"
sslProtocol="TLS"
/>
5:JVM的gc收集器:
HotSpotJVM(sun的官方jvm)包含3种辣鸡收集器:
吞吐量:工作时间(排除gc时间)占比
暂停:gc导致的应用停止响应时间
(1)串行收集器 SC:SerialCollector
单线程操作,适用于100m以下的应用
(2)并行收集器 PC:ParallelCollector
又称为吞吐量收集器,并行方式回收,适用于多线程或多核的服务器
优先考虑应用峰值性能,对于暂停时间没要求
(3)并发收集器CC: ConcurrentCollector
并发执行大部分gc工作,适用于中性、大型应用,响应时间优先于吞吐量。
6:server.xml配置项优化
(1)connector的maxConnections指定并发的最大链接数,默认为10000
(2)connector的tcpNoDelay设置为true,开启socket的tcpNoDelay选项,从而禁用Nagle算法,默认为true无需调整。
Nagle算法:小块数据积攒之后一起发送,降低发送包的数量,提升传输效率,但是实时性很低。
(3)connector的maxKeepAliveRequest属性值:http请求最大长连接个数(连接被服务器关闭之前可以接受的最大请求数目),默认100.
设置为1:禁用http1.0和http1.1的长连接
设置为-1:不禁用
(4)connector的socketBuffer属性,调整socket缓冲区大小有助于提升服务性能
(5)connector的enableLooksUp设置为false,可以禁用request.getRemoteHost的DNS域名解析,减少查找时间
(6)http协议下的connector开启静态文件压缩功能,通过compression属性设置是否开启,默认关闭(选项有 off,on,force或数字,数字代表压缩文件的阈值)。,compressionableMimeType设置需要压缩的文档类型,compressionMinSize设置开启压缩的文件阈值。
与nginx或者ApacheHttpServer集成时可以不用考虑。
(7)关闭自动部署,提升性能:host元素的autoDeploy属性设置为false。
7:conf/web.xml配置jsp相关的优化
(1)jsp的servlet配置,通过配置servlet的初始化参数完成:
development表示是否开发模式,默认为true,可设置为false,tomcat将不再检测jsp的改动和更新。
在开发环境下可以将development设置为true,此时的检测频率由modificationTestInterval属性决定(单位秒,默认为4)
生产环境中development设置为false,此时通过checkInterval配置后台编译触发频率。
trimSpace参数:
用于移除相应中无用的空格
(2)标签池
org.apache.jasper.runtime.JspFactoryImpl.USE_POOL:布尔值,是否启用JSP标签body池,默认启用
org.apache.jasper.runtime.JspFactoryImpl.POOL_SIZE:整数,JSP标签body池大小,默认8
org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER:布尔值,输出jsp标签时会否进行字符缓冲,默认false
使用方式:在catalina.sh或catalina.bat中启用参数:
CATALINA_OPS = "-Dorg.apache.jasper.runtime.JspFactoryImpl.USE_POOL=true"
注意:
大多数情况下开启之后可以提升性能,但是如果jsp或者标签body很大推荐关闭该属性,否则会占用过多内存。
如果发现内存被大量的BodyContentImpl对象占用,可以考虑关闭该属性