Tomcat安全配置与性能优化

本文转载:http://nolinux.blog.51cto.com/4824967/1608940 

Tomcat 是 Apache软件基金会下的一个免费、开源的WEB应用服务器,它可以运行在 Linux 和 Windows 等多个平台上,由于其性能稳定、扩展性好、免费等特点深受广大用户喜爱。目前,很多互联网应用和企业应用都部署在 Tomcat 服务器上

一、版本安全

       升级当前的tomcat版本为最新稳定版本。故名思议,最新稳定版本就要兼顾最新和稳定这两个概念。一个稳定的版本,是需要时间沉淀的,而最新又是相对于稳定版而言的最新。因此我们一般会选择当前大版本中,最新版本往前推几个版本或者往前推几个月出的版本。

       目前,企业常用的tomcat大版本为6.0和7.0版本,8.0版本虽然已经出了很久了,但是仍然不建议使用。

       在升级版本中,需要注意的事情有两点:

       1、尽量避免跨大版本的升级

       2、将当前老版本 tomcat 的server.xml、catalina.sh、web.xml和tomcat-users.xml文件进行备份,然后部署完新版本的 tomcat 之后,将这些配置文件覆盖过去即可,然后停掉旧版本,启动新版本即可完成升级操作。


二、隐藏版本信息

       为了避免***针对某些版本进行***,因此我们需要隐藏或者伪装 Tomcat 的版本信息。

       默认 Tomcat 的版本信息如下:

wKioL1WX7dHyA_9kAACOAD7Ko2A995.jpg

针对该信息的显示是由一个jar包控制的,该jar包存放在 Tomcat 安装目录下的lib目录下,名称为 catalina.jar。

我们可以通过 jar xf 命令解压这个 jar 包会得到两个目录 META-INF 和 org ,通过修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo 字段来实现来更改我们tomcat的版本信息。

文件信息如下:

[root@localhost ~]#  cat org/apache/catalina/util/ServerInfo.properties |grep -v '^$|#'
server.info=Apache Tomcat/7.0.53
server.number=7.0.53.0
server.built=Mar 25 2014 06:20:16
当然,还有另外一种方法来实现隐藏或伪装Tomcat的版本信息,不过本质和上面一样,操作如下:
[root@localhost ~]# cd /usr/local/apache-tomcat-7.0.53/lib
[root@localhost lib]# mkdir -p org/apache/catalina/util
[root@localhost lib]# cd org/apache/catalina/util
[root@localhost util]# vim ServerInfo.properties
server.info=nolinux        # 如果想修改成其它版本号,把这个地方的值改成其它值就行了

修改完毕之后,重启 Tomcat即可看到效果!

效果如下:

wKioL1WX7jeyM1WaAAB8P0rAUVE465.jpg

三、优化 web.xml

        servlet与其它适用于整个Web应用程序设置的配置文件,必须符合servlet规范的标准格式。通过它可以配置你web应用的相关选项,tomcat在启动的时候会读取这个文件,完成你开发的系统的一些初始化操作。

它可以做如下事情: 

        1、提供基于 servlet 的相关配置

        2、增加监听器,监控session或在tomcat启动时,加载一些你希望加载的资源。比如创建数据库连接池等等

        3、设置session过期时间,tomcat默认是30分钟

        4、更改应用的默认网页,常用为index.html/index.jsp等

        5、增加过滤器,做一些你希望的过滤操作,比如敏感词汇的过滤

        6、增加一些 jstl(标准标签库)的定义,方便在jsp中直接includ进来,直接使用这些标签

        7、struts,spring或hibernate的一些配置等等

   如果没有WEB-INF/web.xml文件,tomcat会输出找不到的消息,但仍然会部署并使用web应用程序,不过通常最好还是让每一个上线的web应用程序都有一个自己的 WEB-INF/web.xml,即使它只用做识别,但这是一个好的习惯。

       由于Servlet规范主要是对于web程序员,而非系统管理员使用的。因此,对于运维来讲,我们可能更关心的是站点的默认网页、自定义错误页面、禁止列目录等功能。

       在正常生产环境中,肯定不会直接由tomcat对公网提供服务,前端肯定放的有apache或者nginx。因此,针对站点的默认主页和自定义错误页面,我们均在前端的apache或者nginx中做。另外,公司也可能交由程序猿在项目内的WEB-INF/web.xml中去做定义。

       在tomcat新版本中,自动默认已经禁止列目录功能。

       下面,我列出几种常见功能,在web.xml中的表现形式:

站点默认主页:

wKiom1THgX2yR-5kAACrCs_ImBs054.jpg

自定义错误页面:

spacer.gifwKioL1THglzzidkDAACeimCxejE470.jpg

定义会话超时时间:

spacer.gifwKiom1THgX7gU_c9AABUIfdPmYE558.jpg

禁止列目录:

spacer.gifwKioL1THgl2goCXFAAFWSl0ysxs201.jpg


四、优化 tomcat-user.xml

       该文件含有用户名、角色以及密码的清单文件。负责提供webapps下manager项目的登录认证管理。

       在生产环境中,我们需要将该文件全部注释。

       注释效果如下:

spacer.gifwKiom1THgX6zBiIKAAI3e77oT-w339.jpg



五、优化 server.xml

       Tomcat的主配置文件,该文件中包含很多主要元素,比如Service、Connector、Host等,这些元素都会创建软件"对象"、排序及进程管道中设置的这些元素嵌套方,使我们可以执行过滤、分组等工作。

       如果要对改文件做优化,我们需要先了解该文件的结构!

       server.xml的结构图:

wKiom1THgX6CdvJRAADYw0nW4Dw501.jpg

    该文件描述了如何启动Tomcat Serve

<Server>
    <Listener />
    <GlobaNamingResources>
    </GlobaNamingResources
    <Service>
        <Connector />
        <Engine>
            <Logger />
            <Realm />
               <host>
                   <Logger />
                   <Context />
               </host>
        </Engine>
    </Service>
</Server>

1、maxThreads 连接数限制

       maxThreads 是 Tomcat 所能接受最大连接数。一般设置不要超过8000以上,如果你的网站访问量非常大可能使用运行多个Tomcat实例的方法,即,在一个服务器上启动多个tomcat然后做负载均衡处理。

这里还需要注意的一点是,tomcat 和 php 不同。php可以按照cpu和内存的情况去配置连接数,上万很正常。而 java 还需要注意 jvm 的参数配置。如果不注意就会因为jvm参数过小而崩溃。

2、多虚拟主机

       强烈建议不要使用 Tomcat 的虚拟主机,推荐每个站点使用一个实例。即,可以启动多个 Tomcat实例,而不是启动一个 Tomcat 里面包含多个虚拟主机。因为 Tomcat是多线程,共享内存,任何一个虚拟主机中的应用崩溃,都会影响到所有应用程序。虽然采用多实例的方式会产生过多的开销,但至少保障了应用程序 的隔离和安全。

3、压错传输

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

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

提示:

       Tomcat 的压缩是在客户端请求服务器对应资源后,从服务器端将资源文件压缩,再输出到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程 HTML、CSS、Javascript和Text,它可以节省40% 左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等输出的网页也能进行压缩,压缩效率也很高。但是,压缩会增加 Tomcat 的负担,因此最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,将压缩的任务交由 Nginx/Apache 去做。

4、管理AJP端口

       AJP是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能提供较高的通信速度和效率。如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。由于我们公司前端 是由nginx做的反向代理,因此不使用此连接器,因此需要注销掉该连接器。

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

5、更改关闭 Tomcat 实例的指令

       server.xml中定义了可以直接关闭 Tomcat 实例的管理端口。我们通过 telnet 连接上该端口之后,输入 SHUTDOWN (此为默认关闭指令)即可关闭 Tomcat 实例(注意,此时虽然实例关闭了,但是进程还是存在的)。由于默认关闭 Tomcat 的端口和指令都很简单。默认端口为8005,指令为SHUTDOWN 。因此我们需要将关闭指令修改复杂一点。

       当然,在新版的 Tomcat 中该端口仅监听在127.0.0.1上,因此大家也不必担心。除非***登陆到tomcat本机去执行关闭操作。

       修改实例:

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

6、更改 Tomcat 的服务监听端口

       一般公司的 Tomcat 都是放在内网的,因此我们针对 Tomcat 服务的监听地址都是内网地址。

       修改实例:

<Connector port="8080" address="172.16.100.1" />

7、关闭war自动部署

       默认 Tomcat 是开启了对war包的热部署的。为了防止被植入***等恶意程序,因此我们要关闭自动部署。

       修改实例:

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

六、禁用 Tomcat 管理页面

       一般线上是不使用 Tomcat 默认提供的管理页面的,因此都会在初始化的时候就把这些页面删掉。这些页面是存放在 Tomcat 安装目录下的webapps目录下的。

       我们只需要删除该目录下的所有文件即可。

       当然,还有涉及管理页面的2个配置文件 host-manager.xml 和 manager.xml 也需要一并删掉。这两个文件存放在 Tomcat 安装目录下的conf/Catalina/localhost目录下。

七、linux内核的优化

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 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 6553

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


八、服务器资源配置优化

九、配置参数优化

tomcat中如何禁止和允许主机或IP地址访问

<Host name="localhost" ...> 
  ... 
  <Valve className="org.apache.catalina.valves.RemoteHostValve" 
         allow="*.mycompany.com,www.yourcompany.com"/> 
  <Valve className="org.apache.catalina.valves.RemoteAddrValve" 
         deny="192.168.1.*"/> 
  ... 
</Host>

编辑tomcat安装目录下的conf目录下的server.xml文件

enableLookups: 是否反查域名,默认值为true。为了提高处理能力,应配置为false

在tomcat配置文件server.xml中的<Connector />配置中,和连接数相关的参数有:

maxThreads="150"    #表示最多同时处理150个连接线程请求。这个值表示Tomcat可创建最大的线程数。默认值200。   
minSpareThreads="25"     表示即使没有人使用也开这么多空线程等待。
maxSpareThreads="75"     表示如果最多可以空75个线程,例如某时刻有80人访问,之后没有人访问了,则tomcat不会保留80个空线程,而是关闭5个空的。 (一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值50)
acceptCount="100"   当同时连接的人数达到maxThreads时,还可以接收排队的连接数量,超过这个连接的则直接返回拒绝连接。(默认值100 )

其中和最大连接数相关的参数为maxThreads和acceptCount。如果要加大并发连接数,应同时加大这两个参数。
web server允许的最大连接数还受制于操作系统内核参数设置,通常Windows是2000个左右,Linux是1000个左右。

当然这些值都不是越大越好,需要根据实际情况来设定。可以基于测试的基础上来不断的调优分析。

<Connectorport="8080"   
          protocol="org.apache.coyote.http11.Http11NioProtocol"  
          connectionTimeout="20000"
           redirectPort="8443"   
           maxThreads="5000"   
           minSpareThreads="20"  
           acceptCount="1000"
          disableUploadTimeout="true"
           enableLookups="false"   
           URIEncoding="UTF-8" />

bufferSize: 输入流缓冲大小,默认值2048 bytes。 
compression: 压缩传输,取值on/off/force,默认值off。

connnectionTimeout: 网络连接超时,默认值60000,单位:毫秒。配置为0表示永不超时,这样配置有隐患的。通常可配置为30000毫秒。 

maxKeepAliveRequests:nginx动态的转给tomcat,nginx是不能keepalive的,而tomcat端默认开启了keepalive,会等待keepalive的timeout,默认不设置就是使用connectionTimeout。
所以必须设置tomcat的超时时间,并关闭tomcat的keepalive。否则会产生大量tomcat的socket timewait。

vim /tomcat/conf/server.xml

<Connector executor="tomcatThreadPool"
           port="8080" protocol="HTTP/1.1" 
           connectionTimeout="30000" maxKeepAliveRequests="1" 
           redirectPort="8443" bufferSize="8192" sockedBuffer="65536" acceptCount="200"/>
           
           其中maxKeepAliveRequests="1" 表示每个连接只响应一次就关闭,这样就不会等待timeout了。

Catalina.sh JVM参数优化

linux 下编辑tomcat安装目录下的bin目录下的catalina.sh文件,windows下为catalina.bat

Catalina.sh添加如下内容:

CATALINA_OPTS="$CATALINA_OPTS–Xms 4000M –Xmx 4000M –Xmn 1000M -
XX:SurvivorRatio=4-XX:+UseConcMarkSweepGC -
XX:CMSInitiatingOccupancyFraction=82-DLOCALE=UTF-16LE  -DRAMDISK=/-
DUSE_RAM_DISK=ture -DRAM_DISK=true"

- Xms为tomcat启动初始内存,一般为服务器开机后可用空闲内存减去100M

- Xmx为tomcat最大占用内存,一般为服务器开机后可用空闲内存减去50M

一般说来,您应该使用物理内存的 80% 作为堆大小。Tomcat默认能够使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。 

说明:以上两个参数关系到tomcat承受的访问性能,但也要根据服务器实际内存情况设定。


配置多个tomcat实例,方法也很简单,只需要在服务器上cp多个tomcat,然后修改三个端口和发布目录即可,然后分别启动即可。

为了提升整个网站的性能,还需要在tomcat前面架设nginx 或者apache反向代理服务器,用以提高用户高速访问。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章