当咱们公司使用tomcat做为web应用服务器的规模愈来愈大,为保证Tomcat配置安全,防止信息泄露,恶意攻击以及配置的安全规范,特制定此Tomcat安全配置规范.本文章从别处转载并作了补充
javascript
useradd -d /tomcat -u 501 tomcat echo "123" |passwd --stdin tomcat su - tomcat id tomcat # uid=501(tomcat) gid=1000(tomcat) groups=1000(tomcat) pwd # /tomcat
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.55/bin/apache-tomcat-8.5.55.tar.gz tail -5 .bash_profile JAVA_HOME=/usr/local/jdk export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export CATALINA_HOME=/usr/local/tomcat
mkdir webapps tar xvf apache-tomcat-8.5.55.tar.gz -C /tomcat/webapps/ /tomcat/webapps/apache-tomcat-8.5.55/bin/startup.sh
tomcat/webapps/* tomcat/conf/tomcat-user.xml
chmod 744 –R tomcat/bin/*
enableLookups: 调用request,getRemoteHost()执行DNS查询,以返回远程主机的主机名,若是设置为false,css
<Connector enableLookups="false"/>
tomcat做为一个应用服务器,也是支持 gzip 压缩功能的。咱们能够在 server.xml 配置文件中的 Connector 节点中配置以下参数,来实现对指定资源类型进行压缩。 前端使用nginx做为反向代理,通常不须要启用tomcat压缩功能。html
compression="on" # 打开压缩功能 compressionMinSize="50" # 启用压缩的输出内容大小,默认为2KB noCompressionUserAgents="gozilla, traviata" # 对于如下的浏览器,不启用压缩 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" # 哪些资源类型须要压缩
<Server port="8527" shutdown=" dangerous"> <!--Define a non-SSL HTTP/1.1Connector on port 8080--> <Connector port="8080" server="webserver"/> <!--Define an AJP 1.3Connector on port 8528--> <!--Define an accesslog --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i %D" resolveHosts="false"/> <Connector port="8528" protocol="AJP/1.3"/> <Context path="" docBase="/home/work/local/tomcat_webapps" debug="0" reloadable="false" crossContext="true"/>
<init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <error-page> <error-code>403</error-code> <location>/forbidden.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/notfound.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/systembusy.jsp</location> </error-page>
# 降权启动 # telnet管理端口保护 # ajp连接端口保护 # 禁用管理端 # 能够看上面
Tomcat自己优化前端
# 1.首先对代码进行动静分离,让Tomcat只负责Jsp文件的解析工做。 # 2.Connector链接器配置: # Bio,Nio和APR,三种方式性能差异很大,APR性能最好;
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="6000" enableLookups="false" acceptCount="800" redirectPort="8443" />
Tomcat最吃内存,只要内存足够,就跑的快, 可是据说超过32G可能性能有些不稳定,能够开多实例java
.nginx
若是系统资源有限,那就须要条鱼哦,提升资源使用率web
.shell
优化catalina.sh配置文件,再catlina.sh配置文件添加以下代码apache
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
server:必定要做为第一个参数,在多个CPU时性能佳 -Xms:初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些 -Xmx:初始堆内存heap最大值,使用的最大内存 上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。 -XX:PermSize:设定内存的永久保存区域 -XX:MaxPermSize:设定最大内存的永久保存区域 -XX:MaxNewSize: -Xss 15120 这使得JBoss每增长一个线程(thread)就会当即消耗15M内存,而最佳值应该是128K,默认值好像是512k. +XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。 -Xss:每一个线程的Stack大小 -verbose:gc 现实垃圾收集信息 -Xloggc:gc.log 指定垃圾收集日志文件 -Xmn:young generation的heap大小,通常设置为Xmx的三、4分之一 -XX:+UseParNewGC :缩短minor收集的时间 -XX:+UseConcMarkSweepGC :缩短major收集的时间
设置JVM相关运行的参数
浏览器
1.32位系统jvm对内存限制不能突破2G,
2.-server: 第一个参数,多个CPU时性能佳,还有一种-client的模式,特色是启动速度比较快,但运行时性能和内存管理效率不高,一般用于客户端应用程序或者开发调试,32位环境默认该模式。 server模式特色: 启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境,64位jdk环境默认该模式;
3.-Xms: 表示java初始化堆的大小,-Xms与-Xmx设定同样的值,避免JVM反复申请内存,致使性能大起大落,默认为物理内存物理内存1/64,,默认空闲堆内存小于40%,jvm就会增大堆直到-Xmx的最大限制;
4.-Xmx: 表示最大java堆大小,当应用程序须要的内存超过堆的最大值就会提示内存溢出,而且致使应用服务器崩溃,所以通常建议最大值设置为可用内存最大值的80%;
使用java -Xmx512M -version命令测试,逐步增大512值,执行正常就表示指定的内存大小可用,不然打印错误信息;5.-Xss: 表示每一个java线程堆栈大小,JDK5.0之后每一个线程堆栈大小为1M,之前每一个线程堆栈大小为256k,根据应用线程所需内存大小进行调整,相同物理内存下,减小这个值能生成更多的线程,可是操做系统对一个进程内的线程数有限制,通常小的应用,若是栈不是很深,128k够用的,大的256或512,通常不易超过1M,要否则容易出现out ofmemory,性能影响很大,须要严格测试;
Tomcat内存优化主要是对tomcat启动参数优化,咱们能够在tomcat的启动脚本 catalina.sh设置java_OPTS参数
JAVA_OPTS参数说明
-server 启用jdk 的 server 版; -Xms java虚拟机初始化时的最小内存; -Xmx java虚拟机可以使用的最大内存; -XX: PermSize 内存永久保留区域 -XX:MaxPermSize 内存最大永久保留区域
server.xml优化,大大提升Tomcat处理请求的能力
1.默认配置下,Tomcat会为每一个链接器建立一个绑定的线程池,最大200,服务器启动默认建立5个空闲进程随时等待用户请求。
2.Tomcat7在开启线程池前,必定要安装Apr库,并能够启用,不然有错误报出,shutdown.sh脚本没法关闭进程;
3.最大线程500,根据本身实际状况合理设置,越大越耗费内存和CPU,由于CPU疲于线程上下文切换,没有精力提供服务了,最小空闲线程数20,线程最大空闲时间60秒,容许最大线程数还受制于操做系统的内核参数设置,根据本身需求和环境;
4.Connection<肯莱克行> Timeout; 网络链接超时,设置为0表示永不超时,有隐患,一般30000毫秒,根据实际状况,适当修改;
5.DisableUploadTimout: <滴虽播,啊谱楼的,> 上传时是否启用超时机制;
6.ConnectionUploadTimeout: <>上传超时时间,根据业务本身调,
7.keepalive<K普林>timeout: 表示下次请求过来以前,Tomcat保持该链接多久,通常使用Connection Timeout时间8.compression: 是否对响应数据进行Gzip压缩,压缩后数据能够有效减小页面大小,通常能够减小1/3左右,节省宽带;
9.compression<肯坡逊 >MinSize: 表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩;指定压缩类型,对那些类型文件进行数据压缩,可是配置了动静分离,也就不须要配置压缩了;由于静态页面和图片录音数据不须要Tomcat处理了;
服务器参数配置
现公司服务器内存通常能够加到最大2G,因此能够采起如下配置:
JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’
1 . Tomcat链接相关参数
在Tomcat配置文件的server.xml中的
<Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192" minProcessors="100" maxProcessors="1000" acceptCount="1000" redirectPort="8443" disableUploadTimeout="true"/>
2 . 调整链接器connector的并发链接能力
1>参数说明 maxThreads 客户请求最大线程数 minSpareThreads Tomcat初始化时建立的 socket 线程数 maxSpareThreads Tomcat链接器的最大空闲 socket 线程数 enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名 redirectPort 在须要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口 acceptAccount 监听端口队列最大数,满了以后客户请求会被拒绝(不能小于maxSpareThreads ) connectionTimeout 链接超时 minProcessors 服务器建立时的最小处理线程数 maxProcessors 服务器同时最大处理线程数 URIEncoding URL统一编码 2>Tomcat中的配置示例 <Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192" maxThreads="1000" minSpareThreads="100" maxSpareThreads="1000" minProcessors="100" maxProcessors="1000" enableLookups="false" URIEncoding="utf-8" acceptCount="1000" redirectPort="8443" disableUploadTimeout="true"/>
3 . Tomcat缓存优化
1>参数说明 c ompression 打开压缩功能 compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB compressableMimeType 压缩类型 connectionTimeout 定义创建客户链接超时的时间. 若是为 -1, 表示不限制创建客户链接的时间 2>Tomcat中的配置示例 <Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192" maxThreads="1000" minSpareThreads="100" maxSpareThreads="1000" minProcessors="100" maxProcessors="1000" enableLookups="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" connectionTimeout="20000" URIEncoding="utf-8" acceptCount="1000" redirectPort="8443" disableUploadTimeout="true"/>
参考旧的配置
<Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192" maxThreads="1000" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" connectionTimeout="20000" URIEncoding="utf-8" acceptCount="200" redirectPort="8443" disableUploadTimeout="true" /> 后来发如今访问量达到3 百万多的时候出现性能瓶颈。 2>更改后的配置 <Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192" maxThreads="1000" minSpareThreads="100" maxSpareThreads="1000" minProcessors="100" maxProcessors="1000" enableLookups="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" connectionTimeout="20000" URIEncoding="utf-8" acceptCount="1000" redirectPort="8443" disableUploadTimeout="true"/>