(转)Tomcat配置调优与安全总结

tomcat配置调优与安全总结javascript

      做为运维,避免不了与tomcat打交道,然而做者发现网络上关于tomcat配置和调优安全的文章很是散,经过参考各位大神的相关技术文档,根据做者对tomcat的运维经验,总结了一些tomcat的基础运维注意事项,但愿对广大技术兄弟们有些帮助。css

    本篇文章只是对tomcat模板的基础调优,除了部署tomcat的各系统环境和配置,影响tomcat并发和性能的另外一大重要因素,就是java的代码工程,而如何在生产中优化java工程,这个就须要运维与开发共同配合,尤为是运维须要有开发与运维是同一个团队的意识,只有双方配合默契才能发挥最大战力,要知道一我的的力量永远是有限的,只有团队合做才能爆发出真正力量!html

     而包含了Java工程的总体优化就设计到总体的架构优化,这个更加是一个细致而有趣的过程,也是运维通向架构师的一个必经之路!前端

    

一、功能优化

  1.一、硬件资源对tomcat的影响

  做者实测,在阿里云的不一样区域部署相同系统应用配置的tomcat,在压测时会出现吞吐量差别达到1/4,通过对比发现,两个区域的cpu频率2.2GHz和2.6Ghz。系统硬件性能直接影响tomcat的并发量,起决定做用的是CPU和MEM,CPU运行速度提高,会带来tomcat响应时间的缩短,mem大小决定工程须要内存的大小和工程的并发数量。java

  1.2     Java虚拟机调优

    1.2.1     JDK版本选择

       若是新手请选择SUN的JVM,在知足项目须要的前提下,尽可能选用版本较高的JVM,通常来讲高版本产品在速度和效率上比低版本会有改进。 JDK1.4比JDK1.3性能提升了近10%-20%,JDK1.5比JDK1.4性能提升25%-75%。 所以对性能要求较高的状况推荐使用 JDK1.6nginx

     这里须要补充的是,各位在打算升级JVM时,必定要先让开发先试用高版本的JVM,调试高版本JVM对工程的影响,通过测试后逐步部署到测试环境,通过必定时间的验证,发现没有问题后再谨慎的更换到生产。JVM版本不一致,很容易出现各种异常,对待生产,谨慎永远是第一原则!web

   JVM调优参见:http://vekergu.blog.51cto.com/9966832/1626733shell

    1.2.2     JDK参数优化

        Tomcat内存优化主要是对 tomcat 启动参数优化,咱们能够在 tomcat 的启动脚本 catalina.sh 中设置 JAVA_OPTS参数。apache

    1.   JAVA_OPTS参数说明      

 1 -server 启用jdk 的 server 版; 
 2 -Xms   java虚拟机初始化时的最小内存; 
 3 -Xmx  java虚拟机可以使用的最大内存; 
 4 -XX:PermSize    内存永久保留区域 
 5 -XX:MaxPermSize   内存最大永久保留区域 
 6 -Xms=-Xmx=服务器内存*70%,如部署tomcat,jboss在同一台服务器-Xms=-Xmx=服务器内存*80%*1/4,现公司服务器内存通常均可以加到最大4G,因此能够采起如下配置,把如下参数添加到catalina.sh里面,
 7  JAVA_OPTS='-Xms1024m -Xmx4096m -XX:PermSize=256M -XX:MaxNewSize=256m-XX:MaxPermSize=256m'
 8   
 9 #-Xmx6000m                        :设置JVM最大可用内存为6000MB
10 #-Xms6000m                        :设置JVM初始可用内存为6000MB
11 #-Xmn2g                              :设置年轻代大小为2G
12 #-Xss128k                             :设置每一个线程的堆栈大小为128k
13 #-XX:NewRatio=4                 :设置年轻代与年老代的比值为4
14 #-XX:SurvivorRatio=4            :设置年轻代中Eden区与Survivor区的大小比值为4
15 #-XX:PermSize=512m                    :设置堆栈永久区起始大小为512m
16 #-XX:MaxPermSize=512m             :设置堆栈永久区最大大小为512m
17 #-XX:MaxTenuringThreshold=0     :设置垃圾最大年龄为0
18 #-XX:+UseParallelGC                     :选择垃圾收集器为并行收集器
19 #-XX:ParallelGCThreads=8             :配置并行收集器的线程数
20 #-XX:+UseParallelOldGC                :配置年老代垃圾收集方式为并行收集
21 #-XX:+UseAdaptiveSizePolicy     :并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低响应时>间或者收集频率等,此值建议使用并行收集器时,一直打开。

 

 

 

    1.2.3     生产案例

        根据做者本人的经验,生产环境须要肯定对JVM的设置,仍是须要根据java的运行状态,经过监控后,不断的调试的一个过程,没有那个配置一上来就能够适应全部的场景。如下就举列做者经常使用的一个JVM配置方式:浏览器

 1 JAVA_OPTS="
 2 -server 
 3 -Xms1024m
 4 -Xmx1024m
 5 -Xmn384m
 6 -XX:PermSize=64m
 7 -XX:MaxPermSize=128m
 8 -XX:+UseParallelOldGC
 9 -XX:+PrintGCDateStamps
10 -XX:+PrintGCDetails
11 -Xloggc:/opt/tomcat/log/gc.log
12 -XX:+HeapDumpOnOutOfMemoryError
13 -XX:HeapDumpPath=/opt/tomcat/heap.bin"

 


说明:

 

 

1.   Xms与Xmx广泛选择配置相同的大小,实际大小根据实际状况调整,由小向大增长,不必一开始就增长到很大的内存。

2.   XX:PermSize设置堆栈永久区起始大小,XX:MaxPermSize设置堆栈永久区最大大,其实设置比默认值大写便可,或者默认也能够。做者这个这两个值,是由于出现过永久区内存溢出,才进行设定的。

3.   UseParallelOldGC、PrintGCDateStamps、PrintGCDetails、Xloggc:/opt/tomcat/log/gc.log设置GClog日志,这个对分析tomcat中JVM内存使用状况很是有效。

4.   XX:+HeapDumpOnOutOfMemoryError、XX:HeapDumpPath=/opt/tomcat/heap.bin"设置内存溢出时,输出HeapDump,具体如何使用分析HeapDump文件,请参考:http://vekergu.blog.51cto.com/9966832/1619640

5.   做者对JVM参数设置的作法,调整合适的JVM内存大小,开启GClog和HeapDump便可。

  1.三、tomcat集群之session共享

    1.3.1     基于tomcat集群的session共享

       在{TOMCST_HOME}/conf/server.xml取消下面代码注释便可:

 

         

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

 

 

 

    1.3.2     基于memcached存储session共享

       具体配置方法见:http://vekergu.blog.51cto.com/9966832/1672833

  1.4     站点的默认网页、自定义错误页面、禁止列目录等功能

      这些功能开发会在工程的WEB-INF目录下的web.xml中设置,运维了解下就好,者遇到相似问题能够找到解决思路。

      1.4.1     默认主页

1 <welcome-file-list>
2     <welcome-file>index.html</welcome-file>
3     <welcome-file>index.htm</welcome-file>
4     <welcome-file>index.jsp</welcome-file>
5 </welcome-file-list>

 

 

 

      1.4.2     自定义错误页面

 
1 <error-page> 
2     <error-code>404</error-code> 
3     <location>/404.htm</location> 
4 </error-page>

 

 

      1.4.3     定义会话超时时间

 

1 <session-config>
2     <session-timeout>30</session-timeout>
3 </session-config>

 

 

 

 

      1.4.4     禁止列目录

 

1 <init-param>
2     <param-name>listings</param-name>
3     <param-value>false</param-value>
4 </init-param

 

 

 

 

  1.5     管理AJP端口

        AJP是为 Tomcat 与 HTTP 服务器之间通讯而定制的协议,能提供较高的通讯速度和效率。若是tomcat前端放的是apache的时候,会使用到AJP这个链接器。因为咱们公司前端是由nginx作的反向代理,所以不使用此链接器,所以须要注销掉该链接器。在          {TOMCST_HOME}/conf/server.xml中找到下列代码,注释便可

<!--
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->

 

 

 

 

  1.6     取消默认gc监听

        若是开启了GClog,再开启GC监听,会影响GClog输出,功能重复,能够选择取消。

1 <!--
2     <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
3 -->

  1.7   自定义tomcat代码路径

1 <Context docBase="/code_path/code_file"path="/code_file " reloadable="false" />

 

 

 

其中:

docBase这个是你代码的路径

path这个是你访问网站的URL路径,要区别path的意义,请看下面的举例

 

    举例:

 

1 访问www.aaa.com
2 <Context docBase="/code_path/code_file"path=" " reloadable="false" />
3   
4 访问www.aaa.com/code_file
5 <Context docBase="/code_path/code_file"path="/code_file " reloadable="fasle" />

 

 

 

    reloadable若是为true,会自动加载变化的动态文件,看起来挺智能的,可是,tomcat加载变化代码的时候有可能会出现内存溢出,tomcat服务不正常等异常,建议仍是false掉,更新完代码脚本重启tomcat才是王道。

     此前看到一些文章,在讲解自定义tomcat代码路径时,reloadable所有是true,可能能多小伙伴都设置为true,建议对这个参数认真对待,不然一不当心就是一个坑。。。。

 

2性能优化

  2.1     屏蔽DNS查询

      Web应用程序能够经过Web容器提供的getRemoteHost()方法得到访问Web应用客户的IP地址和名称,可是这样会消耗Web容器的资源,而且还须要经过IP地址和DNS服务器反查用户的名字。所以当系统上线时,能够将这个属性关闭,从而减小资源消耗,那么Web应用也就只能记录下IP地址。修改的属性是enableLoopups="false"

  2.2     调整线程数

      Tomcat经过线程池来为用户访问提供响应,对于上线的系统初步估计用户并发数量后,再调整线程池容量。例如,用户并发数量在100左右时,能够设置minProcessors="100",maxProcessors="100"。将最大和最小设置为同样后,线程池不会再释放空闲的线程,当用户访问忽然增长时,不须要再消耗系统资源去建立新的线程。

  2.3     调整最大链接数

     这个其实最复杂,即便用户并发量大,可是系统反应速度快,也不必把这个值设置过高,高了系统须要消耗大量的资源去切换线程,可是若是设置过低也会形成应用没法知足用户并发须要。所以设置这个最好可以结合整个系统的跟踪与调优,使系统达到最好的平稳状态,通常设置为maxProcessors的1.5倍便可。

  2.4     调整网络超时

      主要是HTTP协议也有个链接过程,客户端链接到服务器上后,若是长时间没有获得处理就会被释放。若是服务器处理速度较慢,可是但愿每一个用户都能获得有效处理,或者网络环境很差,须要保证用户不会由于超时中断,也能够把时间加长。可是通常设置成connectionTimeout="30000"便可。太长对系统来讲价值不大,反而会浪费系统资源在无谓的长链接上。

  2.5     压缩管理

      tomcat做为一个应用服务器,也是支持 gzip 压缩功能的。咱们能够在 server.xml 配置文件中的 Connector 节点中配置以下参数,来实现对指定资源类型进行压缩。

 

1 compression="on"            # 打开压缩功能
2 compressionMinSize="50"     # 启用压缩的输出内容大小,默认为2KB
3 noCompressionUserAgents="gozilla, traviata"      # 对于如下的浏览器,不启用压缩
4 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"# 哪些资源类型须要压缩

 

 

 

 

  若是使用apache/nginx代理,因此tomcat自身不须要进行压缩,会给服务器增长压力

  2.6     tomcat的三种运行模式选择

    2.6.1     Bio

      默认的模式,性能很是低下,没有通过任何优化处理和支持。

    2.6.2     Nio

      利用java的异步io护理技术,no blocking IO技术.

      想运行在该模式下,直接修改server.xml里的Connector节点,修改protocol

 

<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol"
     connectionTimeout="20000"
     URIEncoding="UTF-8"
     useBodyEncodingForURI="true"
     enableLookups="false"
     redirectPort="8443"/>

 

 

 

  启动后,就能够生效。

    2.6.3     Apr

      安装起来最困难,可是从操做系统级别来解决异步的IO问题,大幅度的提升性能.。必需要安装apr和native,直接启动就支持apr

      安装APR

sudo yum -y install apr  apr-devel
tar zxvf tomcat-native.tar.gz //该文件在tomcat的bin目录下面
cd tomcat-native-1.1.24-src/jni/native
./configure--with-apr=/usr/bin/apr-1-config
make
make install

    安装完成以后 会出现以下提示信息

Libraries have been installed in:

/usr/local/apr/lib

安装成功后还须要对tomcat设置环境变量,方法是在catalina.sh文件中增长一 行:

 

CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
修改8080端对应的
protocol="org.apache.coyote.http11.Http11AprProtocol"

 

 

 

 

  2.7     Tomcat链接相关参数总结

在Tomcat 配置文件 server.xml 中的 <Connector ... /> 配置中

maxThreads 客户请求最大线程数
minSpareThreads    Tomcat初始化时建立的 socket 线程数
maxSpareThreads   Tomcat链接器的最大空闲 socket 线程数
enableLookups      若设为true, 则支持域名解析,可把 ip 地址解析为主机名
redirectPort        在须要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort端口
acceptAccount       监听端口队列最大数,满了以后客户请求会被拒绝(不能小于maxSpareThreads  )
connectionTimeout   链接超时
minProcessors         服务器建立时的最小处理线程数
maxProcessors        服务器同时最大处理线程数
URIEncoding    URL统一编码
compression 打开压缩功能  
compressionMinSize   启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType 压缩类型
connectionTimeout 定义创建客户链接超时的时间. 若是为 -1, 表示不限制创建客户链接的时间

  2.8     生产配置实例

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"   #nio  利用java的异步io护理技术,noblocking IO技术.
        URIEncoding="UTF-8"    #设置编码
        minSpareThreads="25"  #Tomcat初始化时建立的 socket线程数
        maxSpareThreads="75"  #Tomcat链接器的最大空闲socket 线程数,一旦建立的线程超过这个值,Tomcat就会关闭再也不须要的socket线程。默认值50
        enableLookups="false"  #屏蔽DNS查询
        disableUploadTimeout="true"  #该标志位代表当执行servlet时,是否容许servlet容器使用一个不一样的、更长的链接超时。启用该标志位将致使在上传数据时,要么使用更长的时间完成上传,要么出现更长的超时。若是不指定,该属性为“false”。       
        connectionTimeout="20000"   #网络超时时间
        acceptCount="300"     #允许的最大链接数,通常设置为maxProcessors的1.5倍便可,满了以后客户请求会被拒绝(不能小于maxSpareThreads  )
        maxThreads="300"     #客户请求最大线程数,默认值为“200”
        maxProcessors="1000"   #最大链接线程数,即:并发处理的最大请求数,默认值为75 ,一旦建立的线程超过这个值,Tomcat就会关闭再也不须要的socket线程
        minProcessors="5"      #最小空闲链接线程数,用于提升系统处理性能,默认值为10
        useURIValidationHack="false"
        <!--   前端使用nginx做为反向代理,不须要启用tomcat压缩功能。
        compression="on"   #打开压缩功能
        compressionMinSize="2048" #启用压缩的输出内容大小,这里面默认为2KB
        compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"   #压缩类型
        -->
        redirectPort="8443"/>

3     安全优化

  3.1     tomcat隐藏版本信息

Tomcat 安装目录下的lib目录下,名称为 catalina.jar,直接修改catalina.jar中的文件,org/apache/catalina/util/ServerInfo.properties

server.info=Apache Tomcat/7.0.53

3.2     禁用 Tomcat 管理页面

    咱们线上是不使用 Tomcat 默认提供的管理页面的,所以都会在初始化的时候就把这些页面删掉。这些页面是存放在 Tomcat 安装目录下的webapps目录下的。咱们只须要删除该目录下的全部文件便可。固然,还有涉及管理页面的2个配置文件host-manager.xml 和 manager.xml 也须要一并删掉。这两个文件存放在 Tomcat 安装目录下的conf/Catalina/localhost目录下。

3.3     用普通用户启动 Tomcat

    为了进一步安全,咱们不建议使用 root 来启动 Tomcat。这边建议使用专用用户 tomcat 或者 nobody 用户来启动 Tomcat。在启动以前,须要对咱们的tomcat 安装目录下全部文件的属主和属组都设置为指定用户。

3.4     分离 Tomcat 和项目的用户

为了防止 Tomcat 被植入 web shell 程序后,能够修改项目文件。所以咱们要将 Tomcat 和项目的属主作分离,这样子,即使被搞,他也没法建立和编辑项目文件。

3.5     关闭war自动部署

默认 Tomcat 是开启了对war包的热部署的。为了防止被植入木马等恶意程序,所以咱们要关闭自动部署。

修改实例:

 
<Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false">

 

3.6     更改关闭 Tomcat 实例的指令

    server.xml中定义了能够直接关闭 Tomcat 实例的管理端口。咱们经过 telnet 链接上该端口以后,输入 SHUTDOWN (此为默认关闭指令)便可关闭 Tomcat 实例(注意,此时虽然实例关闭了,可是进程仍是存在的)。因为默认关闭Tomcat 的端口和指令都很简单。默认端口为8005,指令为SHUTDOWN 。所以咱们须要将关闭指令修改复杂一点。

    固然,在新版的 Tomcat 中该端口仅监听在127.0.0.1上,所以你们也没必要担忧。除非黑客登录到tomcat本机去执行关闭操做。

      修改实例:

<Server port="8005"shutdown="9SDfjsd29jf24sdff0LSDdfJKS9DKkjsd">

 

 

 

 

4 内核优化

   在修改内核参数的时候,建议你们逐个设置,而后反复试验,切勿图方便直接拿上就用,一次所有替换。

优化网络参数

修改/etc/sysctl.cnf文件,在最后追加以下内容:

net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 65536

保存退出,执行sysctl-p生效

内核参数详细做用,能够参考:http://blog.chinaunix.net/uid-21505614-id-2181210.html

 

5 tomcat监控

  5.1     配置tomcat的status状态页

步骤1:修改%tomcat安装路径%\conf \tomcat-users文件,配置admin设置权限。在<tomcat-users>中增长部份内容。具体以下:

 

<role rolename="manager-gui"/>
<user username="manager"password="1234" roles="manager-gui"/>

 

 

 

 

 注:用户名:manager,密码:1234

步骤2:完成后,启动tomcat,输入:http://localhost:8080  --(IP,端口号,可远程访问)

点击status,输入帐号,密码(manager,1234),进入status,时时刷新页面,查看当前tomcat状态。 或者直接访问:http://localhost:8080/manager/status页面。

备注1:若但愿整个服务器的性能数据以一个单行的xml文件形式表示,则进入以下界面:http://localhost:8080/manager/status?XML=true

备注2:若服务器中存在几个项目,单独对某个项目进行监控,则须要另行增长代码。

Free memory: 304.84 MB Total memory: 903.00MB Max memory: 7273.00 MB
Free memory:空闲内存大小。
Total memory:总内存大小。
Max memory:最大内存大小。
  
Max threads: 200 Current thread count: 10Current thread busy: 1 Keeped alive sockets count: 1Max processing time: 187 msProcessing time: 0.281 s Request count: 32 Error count: 3 Bytes received: 0.00MB Bytes sent: 0.12 MB
Max threads:最大线程数。
Current thread count:最近运行的线程数。
Max processing time:最大CPU时间。
Processing time:CPU消耗总时间
Request count:请求总数。
Error count:错误的请求数。
Bytes received:接收字节数。
Bytes sent:发送字节数。

 

 

访问地址:

curl --user manager:1234   http://you_tomcat_ip:port/manager/status?XML=true

http://vekergu.blog.51cto.com/9966832/1672931

相关文章
相关标签/搜索