tomcat安全设置与优化详解(非原创)(代码片段)

wuxiaochang wuxiaochang     2022-12-15     695

关键词:

一、Tomcat简介
二、Tomcat安全设置
三、Tomcat优化
四、参考文章

 
技术图片

一、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 的版本信息如下:

 
技术图片

针对该信息的显示是由一个jar包控制的,该jar包存放在 Tomcat 安装目录下的lib目录下,名称为 catalina.jar。我们可以通过 jar xf 命令解压这个 jar 包会得到两个目录 META-INF 和 org ,通过修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo 字段来实现来更改我们tomcat的版本信息。文件信息如下:

[[email protected] ~]#  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的版本信息,不过本质和上面一样,操作如下:
[[email protected] ~]# cd /usr/local/apache-tomcat-7.0.53/lib
[[email protected] lib]# mkdir -p org/apache/catalina/util
[[email protected] lib]# cd org/apache/catalina/util
[[email protected] util]# vim ServerInfo.properties
server.info=nolinux        # 如果想修改成其它版本号,把这个地方的值改成其它值就行了

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

 
技术图片

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/

 
技术图片

三、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中每一个用户请求都是一个线程,所以可以使用线程池提高性能。开启并且使用配置:

 
技术图片

在Connector中指定使用共享线程池

 
技术图片

查看Tomcat控制台

 
技术图片

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:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

参数最佳实践一

 
技术图片
 
技术图片

注意:线程池指定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容器,并且在多个请求和响应周期过程会重用连接。

 
技术图片

我们一般是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用。

 
技术图片

在管理界面中看不到ajp了:

 
技术图片

当用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。

四、参考文章

    1. https://www.cnblogs.com/xyd51cto/p/7718462.html
    2. https://blog.csdn.net/u010195563/article/details/80966025
    3. https://blog.csdn.net/huiyunfei/article/details/79165120

javaionio并发锁详解(代码片段)

...态其他概念CPU密集型vsIO密集型并发深入并发优缺点线程安全并发实战CAS锁并发集合和工具多线程优化总结IOIO的定义与类型I/O,即Input/Output(输入/输出)的简称。指的是计算机与外部世界或者一个程序与计算机的其余部分的之... 查看详情

tomcat安装配置优化及负载均衡详解(代码片段)

...的产品、JBossAS:红帽公司的产品,可以自行了解 2、Tomcat服务器:Sun公司在推出的小型Servlet/JSP调试工具的基础上发展起来的一个优秀的Servlet容器,Tomcat本身完全用java语言编写,所以tomcat的运行需要java的支持,所以要先安... 查看详情

jvm虚拟机详解+tomcat性能优化(代码片段)

1.JVM(javavirtualmechinal)(1)JVM有完善的硬件架构,如处理器、堆栈、寄存器当,还具有相应的指令系统。(2)JVM的主要工作时解释自己的指令集(即字节码),并映射到本地的cpu的指令集或OS系统调用。  2.JVM虚拟机主要有堆... 查看详情

网络知识详解之:网络攻击与安全防护(代码片段)

网络知识详解之:网络攻击与安全防护计算机网络相关知识体系详解网络知识详解之:TCP连接原理详解网络知识详解之:HTTP协议基础网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字... 查看详情

[乐意黎原创]array.prototype.find()与array.prototype.findindex()使用详解(代码片段)

Array.prototype.find()find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。constarray1=[5,12,8,130,44];constfound=array1.find(element=>element>10);console.log(found);//expectedoutput:12语法a 查看详情

codeforces1029etreewithsmalldistances思维+贪心非原创(代码片段)

题目:戳这里学习博客:戳这里题意:给一个树加最少的边,使得1到所有点的距离小于等于2. 解题思路:分析样例3可以看出,如果一个点到1的距离大于2,那么建立1到该点的父亲节点的边将比直接与该点建边更优。官方题... 查看详情

tomcat常用配置详解及优化(代码片段)

....xml。 /logs:存放日志文件。 /server/webapps:来管理Tomcat-web服务用的。仅对TOMCAT可见,对所有的WEBAPP都不可见(使用Catalina类加载器加载)。 /shared/lib:仅对所有WEBAPP可见,对TOMCAT不可见(使用Shared类加载器加载)。&nbs... 查看详情

pytorch优化器与学习率设置详解(代码片段)

...者|小新来源| https://a.3durl.cn/YrcZbc编辑丨极市平台学习率设置对于学习过程来说相当重要。学习率过低会导致学习速度太慢,学习率过高又容易导致难以收敛。在很多学习过程中,都会采用动态调整学习率的方法。刚开始... 查看详情

tomcat记录-tomcat常用配置详解和优化方法(代码片段)

....xml。 /logs:存放日志文件。 /server/webapps:来管理Tomcat-web服务用的。仅对TOMCAT可见,对所有的WEBAPP都不可见(使用Catalina类加载器加载)。 /shared/lib:仅对所有WEBAPP可见,对TOMCAT不可见(使用Shared类加载器加载)。&nbs... 查看详情

linux下jvm与tomcat的安全与优化

上一节我们部署了tomcat服务,大家可以看到这个服务部署起来真的是非常的容易,但前提是你要学好前面的命令基础。今天我打算在上节的基础上给大家加深点儿,给大家讲讲tomcat服务的安全与优化!我们为什么不是把服务搭建... 查看详情

详解jdbc的实现与优化(万字详解)(代码片段)

JDBC详解简介JDBC指Java数据库连接,是一种标准Java应用编程接口(JAVAAPI),用来连接Java编程语言和广泛的数据库。从根本上来说,JDBC是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据... 查看详情

setstate详解与react性能优化(代码片段)

setState的同步和异步1.为什么使用setState开发中我们并不能直接通过修改state的值来让界面发生更新:因为我们修改了state之后,希望React根据最新的Stete来重新渲染界面,但是这种方式的修改React并不知道数据发生了变化React并没有实... 查看详情

redis安装配置与相关优化(代码片段)

Redis配置与优化一、关系数据库与非关系型数据库1关系型数据库2非关系型数据库二、关系型数据库和非关系型数据库区别1数据存储方式不同2扩展方式不同3对事务性的支持不同三、非关系型数据库产生背景1.可用于应对Web2.0纯动... 查看详情

redis配置与优化(代码片段)

Redis配置与优化关系数据库与非关系型数据库关系型数据库非关系型数据库关系型数据库和非关系型数据库区别1.数据存储方式不同2.扩展方式不同3.对事务性的支持不同非关系型数据库产生背景Redis简介redis的优点redis安装部署Redi... 查看详情

redis配置与优化(代码片段)

Redis配置与优化关系数据库与非关系型数据库关系型数据库非关系型数据库关系型数据库和非关系型数据库区别1.数据存储方式不同2.扩展方式不同3.对事务性的支持不同非关系型数据库产生背景Redis简介redis的优点redis安装部署Redi... 查看详情

遗传算法详解与实验(代码片段)

  遗传算法(GeneticAlgorithm,GA)是一种通用的优化算法,属于进化算法簇中一个比较实用又有名的算法。进化算法融合了自然生物进化中共有的一些行为:繁殖、变异、竞争、选择等。基本流程  GA通过迭代来优化目标函数的... 查看详情

tomcat配置文件server.xml详解(代码片段)

...修改$CATALINA_HOME/conf/server.xml文件为如下内容即可,本文的tomcat安装在/application/tomcat下,因此$CATALINA_HOME=/application/tomcat。其中大部分都采用了默认设置,只是在engine容器中添加了两个 查看详情

线程安全与锁优化(代码片段)

...的行为都可以获得正确的结果,那么这个对象时线程安全的。——BrianGoetzJava语言中的线程安全按照线程安全的“安全程度”由强至弱来排序,我们可以将Java语言中 查看详情