Tomcat 是 Apache软件基金会下的一个免费、开源的WEB应用服务器,它能够运行在 Linux 和 Windows 等多个平台上,因为其性能稳定、扩展性好、免费等特色深受广大用户喜好。目前,不少互联网应用和企业应用都部署在 Tomcat 服务器上,好比咱们公司,哈。javascript
以前咱们 tomcat 都采用的是默认的配置,所以在安全方面仍是有所隐患的。上周对测试环境的全部服务器的tomcat都作了安全优化,其间也粗略作了一些性能优化,这里就简单记录分享下!php
1、版本安全css
升级当前的tomcat版本为最新稳定版本。故名思议,最新稳定版本就要兼顾最新和稳定这两个概念。一个稳定的版本,是须要时间沉淀的,而最新又是相对于稳定版而言的最新。所以咱们通常会选择当前大版本中,最新版本往前推几个版本或者往前推几个月出的版本。html
目前,企业经常使用的tomcat大版本为6.0和7.0版本,8.0版本虽然已经出了好久了,可是仍然不建议使用。前端
在升级版本中,须要注意的事情有两点:java
一、尽可能避免跨大版本的升级linux
二、将当前老版本 tomcat 的server.xml、catalina.sh、web.xml和tomcat-users.xml文件进行备份,而后部署完新版本的 tomcat 以后,将这些配置文件覆盖过去便可,而后停掉旧版本,启动新版本便可完成升级操做。nginx
2、隐藏版本信息程序员
为了不***针对某些版本进行***,所以咱们须要隐藏或者假装 Tomcat 的版本信息。web
默认 Tomcat 的版本信息以下:
针对该信息的显示是由一个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便可看到效果!
效果以下:
3、优化 web.xml
servlet与其它适用于整个Web应用程序设置的配置文件,必须符合servlet规范的标准格式。经过它能够配置你web应用的相关选项,tomcat在启动的时候会读取这个文件,完成你开发的系统的一些初始化操做。
它能够作以下事情:
一、提供基于 servlet 的相关配置
二、增长监听器,监控session或在tomcat启动时,加载一些你但愿加载的资源。好比建立数据库链接池等等
三、设置session过时时间,tomcat默认是30分钟
四、更改应用的默认网页,经常使用为index.html/index.jsp等
五、增长过滤器,作一些你但愿的过滤操做,好比敏感词汇的过滤
六、增长一些 jstl(标准标签库)的定义,方便在jsp中直接includ进来,直接使用这些标签
七、struts,spring或hibernate的一些配置等等
下面摘录下O'REILLY 的《Tomcat 权威指南》中的一段话:
web.xml 的文件格式定义在 Servlet 规范中,所以全部符合 Servlet 规范的 Java Servlet Container 都会用到它。当 Tomcat 部署应用程序时(在激活过程当中,或加载应用程序后),它都会读取通用的conf/web.xml,而后再读取web应用程序中的WEB-INF/web.xml。其实根据他们的位置,咱们就能够知道,conf/web.xml文件中的设定会应用于全部的web应用程序,而某些web应用程序的WEB-INF/web.xml中的设定只应用于该应用程序自己。
若是没有WEB-INF/web.xml文件,tomcat会输出找不到的消息,但仍然会部署并使用web应用程序,servlet规范的做者想要实现一种能迅速并简易设定新范围的方法,以用做测试,所以,这个web.xml并非必要的,不过一般最好仍是让每个上线的web应用程序都有一个本身的WEB-INF/web.xml,即便它只用作识别,但我想这是一个好的习惯。
因为Servlet规范主要是对于web程序员,而非系统管理员使用的。所以,对于运维来说,咱们可能更关心的是站点的默认网页、自定义错误页面、禁止列目录等功能。
因为,正常生产环境中,确定不会直接由tomcat对公网提供服务,前端确定放的有apache或者nginx。所以,针对站点的默认主页和自定义错误页面,咱们均在前端的apache或者nginx中作。另外,公司也可能交由程序猿在项目内的WEB-INF/web.xml中去作定义。
在tomcat新版本中,自动默认已经禁止列目录功能。
下面,我列出几种常见功能,在web.xml中的表现形式:
站点默认主页:
自定义错误页面:
定义会话超时时间:
禁止列目录:
4、优化 tomcat-user.xml
该文件含有用户名、角色以及密码的清单文件。负责提供webapps下manager项目的登陆认证管理。
在生产环境中,咱们须要将该文件所有注释。
注释效果以下:
5、优化 server.xml
Tomcat的主配置文件,该文件中包含不少主要元素,好比Service、Connector、Host等,这些元素都会建立软件"对象"、排序及进程管道中设置的这些元素嵌套方,使咱们能够执行过滤、分组等工做。
若是要对改文件作优化,咱们须要先了解该文件的结构!
server.xml的结构图:
该文件描述了如何启动Tomcat Server
<Server> <Listener /> <GlobaNamingResources> </GlobaNamingResources <Service> <Connector /> <Engine> <Logger /> <Realm /> <host> <Logger /> <Context /> </host> </Engine> </Service> </Server>
针对该文件,咱们须要优化的点有以下:
一、maxThreads 链接数限制
maxThreads 是 Tomcat 所能接受最大链接数。通常设置不要超过8000以上,若是你的网站访问量很是大可能使用运行多个Tomcat实例的方法,即,在一个服务器上启动多个tomcat而后作负载均衡处理。
这里还须要注意的一点是,tomcat 和 php 不一样。php能够按照cpu和内存的状况去配置链接数,上万很正常。而 java 还须要注意 jvm 的参数配置。若是不注意就会由于jvm参数太小而崩溃。
二、多虚拟主机
强烈建议不要使用 Tomcat 的虚拟主机,推荐每一个站点使用一个实例。即,能够启动多个 Tomcat,而不是启动一个 Tomcat 里面包含多个虚拟主机。由于 Tomcat是多线程,共享内存,任何一个虚拟主机中的应用崩溃,都会影响到全部应用程序。虽然采用多实例的方式会产生过多的开销,但至少保障了应用程序的隔离和安全。
三、压错传输
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 去作。
四、管理AJP端口
AJP是为 Tomcat 与 HTTP 服务器之间通讯而定制的协议,能提供较高的通讯速度和效率。若是tomcat前端放的是apache的时候,会使用到AJP这个链接器。因为咱们公司前端是由nginx作的反向代理,所以不使用此链接器,所以须要注销掉该链接器。
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
五、更改关闭 Tomcat 实例的指令
server.xml中定义了能够直接关闭 Tomcat 实例的管理端口。咱们经过 telnet 链接上该端口以后,输入 SHUTDOWN (此为默认关闭指令)便可关闭 Tomcat 实例(注意,此时虽然实例关闭了,可是进程仍是存在的)。因为默认关闭 Tomcat 的端口和指令都很简单。默认端口为8005,指令为SHUTDOWN 。所以咱们须要将关闭指令修改复杂一点。
固然,在新版的 Tomcat 中该端口仅监听在127.0.0.1上,所以你们也没必要担忧。除非***登录到tomcat本机去执行关闭操做。
修改实例:
<Server port="8005" shutdown="9SDKJ29jksjf23sjf0LSDF92JKS9DKkjsd">
六、更改 Tomcat 的服务监听端口
通常公司的 Tomcat 都是放在内网的,所以咱们针对 Tomcat 服务的监听地址都是内网地址。
修改实例:
<Connector port="8080" address="172.16.100.1" />
七、关闭war自动部署
默认 Tomcat 是开启了对war包的热部署的。为了防止被植入***等恶意程序,所以咱们要关闭自动部署。
修改实例:
<Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false">
6、禁用 Tomcat 管理页面
咱们线上是不使用 Tomcat 默认提供的管理页面的,所以都会在初始化的时候就把这些页面删掉。这些页面是存放在 Tomcat 安装目录下的webapps目录下的。
咱们只须要删除该目录下的全部文件便可。
固然,还有涉及管理页面的2个配置文件 host-manager.xml 和 manager.xml 也须要一并删掉。这两个文件存放在 Tomcat 安装目录下的conf/Catalina/localhost目录下。
7、用普通用户启动 Tomcat
为了进一步安全,咱们不建议使用 root 来启动 Tomcat。这边建议使用专用用户 tomcat 或者 nobody 用户来启动 Tomcat。
在启动以前,须要对咱们的tomcat 安装目录下全部文件的属主和属组都设置为指定用户。
8、分离 Tomcat 和项目的用户
为了防止 Tomcat 被植入 web shell 程序后,能够修改项目文件。所以咱们要将 Tomcat 和项目的属主作分离,这样子,即使被搞,他也没法建立和编辑项目文件。