线上生成环境Tomcat安全优化和性能优化
根据之前线上tomcat部署和经验以及其他运维分享的优化经验,总结了该文章,便于后续直接上手操作。特此记录。
一,Tomcat安全优化
1,降权启动。
毫无疑问,这里是服务器安装部署tomcat的第一步,tomcat这种容器最好不要用root运行,项目一旦被攻破会被拿到root权限,存在安全隐患。这里以非root用户tomcat为例部署和启动:
useradd tomcat passwd tomcat #设置一个较为复杂的密码。 chown -R tomcat.tomcat /usr/local/tomcat/ su - tomcat /usr/local/tomcat/bin/startup.sh #启动tomcat echo 'su - tomcat /usr/local/tomcat/bin/startup.sh' >> /etc/rc.local #设置开机启动
现在可以ps查看java进程,则是以tomcat这个非root用户启动,降权启动完成。
2,shutdown管理端口以及AJP端口设定。
修改tomcat的shutdown管理端口以及指令:
Server port="8573" shutdown="DASADFASDG89as8dfasd"
说明:设置一个8000~8999之前的端口,并将shutdown指令更改,避免其服务器上其他用户猜测关闭。
AJP端口设定:如果服务器用不到apache,直接关闭。ajp用来tomcat和apache通信,现在一般都是用nginx+tomcat做动静分离,很少用apache,下边的这句话可以直接删除:
Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
3,禁用管理端以及清理默认站点
线上的服务器一般是用不到主机管理这些,包括tomcat自带的一些文档,都可以清理,提升服务器安全。删除tomcat自带webapp下的如下目录 :
docs examples host-manager manager
同时清理ROOT下的默认内容。
4,war包自动解压和自动部署功能。这里根据实际需要设置是否war包自动解压和自动部署,war包自动解压和自动部署存在的风险在于 网站被拿下,如果被上传了他人的数据,他人的东西就会运行了。
5,tomcat版本修改隐藏以及header头信息修改。
tomcat版本修改或隐藏:
[[email protected] ~]# cd /usr/local/tomcat/lib [[email protected] lib]# mkdir -p org/apache/catalina/util [[email protected] lib]# cd org/apache/catalina/util [[email protected] util]# vim ServerInfo.properties
header信息添加,修改server.xml 添加server属性:
Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" server="appserver 7.0"
二,Tomcat性能优化
调整的方向主要如下:tomcat性能参数优化、JVM内存优化
1、性能参数优化:调整工作模式,线程数设置,禁用dns解析,启用压缩等。举例参数如下:
Connectorport="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="1000" minSpareThreads="100" maxSpareThreads="200" acceptCount="900" disableUploadTimeout="true" connectionTimeout="20000" URIEncoding="UTF-8" enableLookups="false" redirectPort="8443" compression="on" compressionMinSize="1024" compressableMimeType="text/html,text/xml,text/css,text/javascript"
参数说明:
org.apache.coyote.http11.Http11NioProtocol:调整工作模式为Nio
maxThreads:最大线程数,默认150。增大值避免队列请求过多,导致响应缓慢。
minSpareThreads:最小空闲线程数。
maxSpareThreads:最大空闲线程数,如果超过这个值,会关闭无用的线程。
acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。
disableUploadTimeout:禁用上传超时时间
connectionTimeout:连接超时,单位毫秒,0代表不限制。默认20s。
URIEncoding:URI地址编码使用UTF-8
enableLookups:关闭dns解析,提高响应时间
compression:启用压缩功能
compressionMinSize:最小压缩大小,单位Byte
compressableMimeType:压缩的文件类型
2,JVM内存优化。
JVM内存优化根据实际的服务器配置以及应用配置需求进行内存参数设置,这个设置加入到catalina.sh中:
JAVA_OPTS="-server-Xms1536m -Xmx1536m -XX:PermSize=256m -XX:MaxPermSize=512m-XX:+UseConcMarkSweepGC -XX:+UseParallelGCThreads=8XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection-XX:CMSFullGCsBeforeCompaction=0 -XX:-PrintGC -XX:-PrintGCDetails-XX:-PrintGCTimeStamps -Xloggc:../logs/gc.log"
注意:不是JVM内存设置越大越好,具体还是根据项目对象实际占用内存大小而定,可以通过Java自带的分析工具来查看。如果设置过大,会增加回收时间,从而增加暂停应用时间。
参数 | 描述 |
-Xms | 堆内存初始大小,单位m、g |
-Xmx | 堆内存最大允许大小,一般不要大于物理内存的80% |
-XX:PermSize | 非堆内存初始大小,一般应用设置初始化200m,最大1024m就够了 |
-XX:MaxPermSize | 非堆内存最大允许大小 |
-XX:+UseParallelGCThreads=8 | 并行收集器线程数,同时有多少个线程进行垃圾回收,一般与CPU数量相等 |
-XX:+UseParallelOldGC | 指定老年代为并行收集 |
-XX:+UseConcMarkSweepGC | CMS收集器(并发收集器) |
-XX:+UseCMSCompactAtFullCollection | 开启内存空间压缩和整理,防止过多内存碎片 |
-XX:CMSFullGCsBeforeCompaction=0 | 表示多少次Full GC后开始压缩和整理,0表示每次Full GC后立即执行压缩和整理 |
-XX:CMSInitiatingOccupancyFraction=80% | 表示老年代内存空间使用80%时开始执行CMS收集,防止过多的Full GC |