一、Tomcat简介
二、Tomcat安全设置
三、Tomcat优化
四、参考文章
![](https://i-blog.csdnimg.cn/blog_migrate/a3f4cb109c3de2a853bdb72c202547a8.webp?x-image-process=image/format,png)
一、Tomcat简介
Tomcat 是 Apache软件基金会下的一个免费、开源的WEB应用服务器,它可以运行在 Linux 和 Windows 等多个平台上,由于其性能稳定、扩展性好、免费等特点深受广大用户喜爱。目前,很多互联网应用和企业应用都部署在 Tomcat 服务器上, 之前我们 tomcat 都采用的是默认的配置,因此在安全方面还是有所隐患的。tomcat默认参数是为开发环境制定,而非适合生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈。
Tomcat基础操作包括以下内容
二、Tomcat安全设置
1. 版本安全
升级当前的tomcat版本为最新稳定版本。故名思议,最新稳定版本就要兼顾最新和稳定这两个概念。一个稳定的版本,是需要时间沉淀的,而最新又是相对于稳定版而言的最新。因此我们一般会选择当前大版本中,最新版本往前推几个版本或者往前推几个月出的版本。
目前,企业常用的tomcat大版本为6.0和7.0版本,8.0版本虽然已经出了很久了,但是仍然不建议使用。
在升级版本中,需要注意的事情有两点:
(1)尽量避免跨大版本的升级
(2)将当前老版本 tomcat 的server.xml、catalina.sh、web.xml和tomcat-users.xml文件进行备份,然后部署完新版本的 tomcat 之后,将这些配置文件覆盖过去即可,然后停掉旧版本,启动新版本即可完成升级操作。
2. 隐藏版本信息
为了避免黑客针对某些版本进行攻击,因此我们需要隐藏或者伪装 Tomcat 的版本信息。默认 Tomcat 的版本信息如下:
![](https://i-blog.csdnimg.cn/blog_migrate/d3b67a29b78de520ab4138c1ba6be7d8.webp?x-image-process=image/format,png)
针对该信息的显示是由一个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即可看到效果!效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/4101225f81c104b978bdecf180cba719.webp?x-image-process=image/format,png)
3. 账户安全管理
优化配置之前,我们需要配置一个tomcat管理员账户,来登录查看Tomcat控制台提高的各种参数。
在conf/ tomcat-users.xml下添加用户:
<role rolename="manager"/>
<role rolename="manager-gui"/> <role rolename="admin"/> <role rolename="admin-gui"/> <user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>
启动tomcat,登录查看信息:http://127.0.0.1:8080/
![](https://i-blog.csdnimg.cn/blog_migrate/245fdb516548a8c3db550d298b09f232.webp?x-image-process=image/format,png)
三、Tomcat优化
1. 简介
服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响,所以说服务器性能牛B,Tomcat也不会太差。当然提高服务器的硬件配置,是需要大量RMB的支持的。所以不到万不得已不会采用这种方式,一般公司会采取下面这种通过优化配置,来提升Tomcat性能的方式。
2. tomcat的3种运行模式
2.1 bio
默认的模式,性能非常低下,没有经过任何优化处理和支持.
2.2 nio
nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。
2.3 apr
安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能
Tomcat apr模式也是Tomcat在高并发下的首选运行模式。
3. 并发优化(线程池)
在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。开启并且使用配置:
![](https://i-blog.csdnimg.cn/blog_migrate/99497d6f6d2c3da933c7fd81afa7fa8c.webp?x-image-process=image/format,png)
在Connector中指定使用共享线程池
![](https://i-blog.csdnimg.cn/blog_migrate/80a3974dfe748067f3a79548cd65dec4.webp?x-image-process=image/format,png)
查看Tomcat控制台
![](https://i-blog.csdnimg.cn/blog_migrate/c3f7edce2fc3f2d3ad8b8f80dce2ff95.webp?x-image-process=image/format,png)
Executor重要参数说明
(1)name:共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。默认值:None;
(2)namePrefix:在JVM上,每个运行线程都可以有一个name 字符串。这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。默认值:tomcat-exec-;
(3)maxThreads:该线程池可以容纳的最大线程数。默认值:200;
(4)maxIdleTime:在Tomcat关闭一个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。只有当前活跃的线程数大于minSpareThread的值,才会关闭空闲线程。默认值:60000(一分钟)。
(5)minSpareThreads:Tomcat应该始终打开的最小不活跃线程数。默认值:25。
(6)threadPriority:线程的等级。默认是Thread.NORM_PRIORITY
(7)executor:表示使用该参数值对应的线程池;
(8)minProcessors:服务器启动时创建的处理请求的线程数;
(9)maxProcessors:最大可以创建的处理请求的线程数;
(10)acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
参数最佳实践一
![](https://i-blog.csdnimg.cn/blog_migrate/03af2a17489da384955097dd8ad98179.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/6c2988e081d9e0df0f6b5d8744c3bc8f.webp?x-image-process=image/format,png)
注意:线程池指定Web请求负载的数量,因此,为获得更好的性能这部分应小心处理。可以通过调整连接器属性“maxThreads”完成设置。maxThreads的值应该根据流量的大小,如果值过低,将有没有足够的线程来处理所有的请求,请求将进入等待状态,只有当一个的处理线程释放后才被处理;如果设置的太大,Tomcat的启动将花费更多时间。因此它取决于我们给maxThreads设置一个正确的值下载地址。
在上述配置中,maxThreads值设定为“250”,这指定可以由服务器处理的并发请求的最大数量。如果没有指定,这个属性的默认值为“200”。任何多出的并发请求将收到“拒绝连接”的错误提示,直到另一个处理请求进程被释放。错误看起来如下,
如果应用提示上述错误,务必检查上述错误是否是由于单个请求花费太长时间造成的,这个问题的原因是这样的,有时候如果数据库连接不释放的话,进程将不会处理其它请求。
注意: 如果请求的数量超过了“750”,这将不是意味着将maxThreads属性值设置为“750”,它意外着最好使用“Tomcat集群”的多个实例。也就是说,如果有“1000”请求,两个Tomcat实例设置“maxThreads= 500”,而不在单Tomcat实例的情况下设置maxThreads=1000。
参数最佳实践二
<Connector port="8080" protocol="HTTP/1.1" maxThreads="1000" minProcessors="100" maxProcessors="1000" minSpareThreads="100" maxSpareThreads="1000" enableLookups="false" URIEncoding="utf-8" acceptCount="1000" connectionTimeout="20000" disableUploadTimeout="ture" redirectPort="8443" />
4. 禁用AJP连接器
AJP(Apache JServer Protocol)AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。
![](https://i-blog.csdnimg.cn/blog_migrate/f7cbe543d675aa2ec0133dfa87c03258.webp?x-image-process=image/format,png)
我们一般是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用。
![](https://i-blog.csdnimg.cn/blog_migrate/d9b9589b437cbc75397463218ccd71a3.webp?x-image-process=image/format,png)
在管理界面中看不到ajp了:
![](https://i-blog.csdnimg.cn/blog_migrate/bef7c0f40574883f9e7fedbe68809449.webp?x-image-process=image/format,png)
当用nginx和tomcat做企业级集群的时候,需要禁用掉AJP协议,不是时候,最好不要关闭,因为当tomcat与其他服务器集成时候,需要用到AJP。
5. 提高JVM栈内存
你使用过tomcat的话,简单的说就是“内存溢出”. 通常情况下,这种问题出现在实际的生产环境中.产生这种问题的原因是tomcat使用较少的内存给进程,通过配置TOmcat的配置文件(Windows 下的catalina.bat或Linux下的catalina.sh)可以解决这种问题.这种解决方法是通过增加JVM的栈内存实现的.也就是说,JVM通常不去调用垃圾回收器,所以服务器可以更多关注处理web下载地址请求,并要求尽快完成。要更改文件(catalina.sh) 位于"\tomcat server folder\bin\catalina.sh",下面,给出这个文件的配置信息。
-Xms – 指定初始化时化的栈内存
-Xmx – 指定最大栈内存
在重启你的Tomcat服务器之后,这些配置的更改才会有效。
6. 压缩文件
(1)Tomcat有一个通过在server.xml配置文件中设置压缩的选项。压缩可以在connector像如下设置中完成下载地址
(2)在前面的配置中,当文件的大小大于等于500bytes时才会压缩。如果当文件达到了大小但是却没有被压缩,那么设置属性compression="on"。否则Tomcat默认设置是“off”。
7. 分离 Tomcat 和项目的用户
为了防止 Tomcat 被植入 web shell 程序后,可以修改项目文件。因此我们要将 Tomcat 和项目的属主做分离,这样子,即便被搞,他也无法创建和编辑项目文件。
8. 禁用DNS查询
当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名 转换为IP地址。
DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。
修改server.xml文件中的Connector元素,修改属性enableLookups参数值: enableLookups="false"
如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
9. 其他选项
(1)开启浏览器的缓存,这样读取存放在webapps文件夹里的静态内容会更快,大大推动整体性能。
(2)每当开机时,Tomcat服务器应当自动地重启。
(3)一般情况下HTTPS请求会比HTTP请求慢。如果你想要更好的安全性,即使慢一点我们还是要选择HTTPS。