热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Tomcat优化及安全配置

1、Tomcat优化Tomcat优化分为对Tomcat本身的优化以及对JVM进行优化,本文针对Tomcat自身的优化进行阐述,JVM优化参考其他文档。1.1优化连接数tomcat连

1、Tomcat优化

Tomcat优化分为对Tomcat本身的优化以及对JVM进行优化,本文针对Tomcat自身的优化进行阐述,JVM优化参考其他文档。


1.1 优化连接数

tomcat 连接数分为最大连接数,最大排队数等,配置时需要根据部署的程序是计算型还是内存型还是IO型,不同类型的应用的配置参数略有差异,通用的配置参考:

maxThreads="1000" minSpareThreads="100" prestartminSpareThreads="true"
maxQueueSize="100" enableLookups="false" URIEncoding="utf-8" acceptCount="500"/>

参数说明:



  • maxThreads: 客户请求最大线程数

  • minSpareThreads: Tomcat初始化时创建的 socket 线程数

  • maxSpareThreads: Tomcat连接器的最大空闲 socket 线程数

  • prestartminSpareThreads: 在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了

  • maxQueueSize: 最大的等待队列数,超过则拒绝请求

  • enableLookups: 设为true, 则支持域名解析,可把 ip 地址解析为主机名

  • acceptAccount: 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads)

  • URIEncoding: URL统一编码


1.2 使用线程池

port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
cOnnectionTimeout="2000" disableUploadTimeout="ture"
redirectPort="8443" />

参数说明



  • connectionTimeout: 主要是HTTP协议也有个连接过程,客户端连接到服务器上后,如果长时间没有得到处理就会被释放。如果服务器处理速度较慢,但是希望每个用户都能得到有效处理,或者网络环境不好,需要保证用户不会因为超时中断,也可以把时间加长。但是一般设置成cOnnectionTimeout="30000"即可。太长对系统来说价值不大,反而会浪费系统资源在无谓的长连接上。

  • disableUploadTimeout: 允许Servlet容器,正在执行使用一个较长的连接超时值,以使Servlet有较长的时间来完成它的执行,默认值为false。

  • executor: 使用executor连接器对Tomcat进行优化


1.3 session共享

基于tomcat集群的session共享

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

此种方式目前已经很少使用了,更多的是结合redis缓存来配置Tomcat集群中的各应用节点的session共享。


1.4 错误页面自定义

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

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


404
/404.htm


1.5 禁止列目录

listings

false


1.6 管理AJP端口

AJP是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能提供较高的通信速度和效率。

如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。

由于我们公司前端是由nginx做的反向代理,因此不使用此连接器,因此需要注销掉该连接器。在{TOMCST_HOME}/conf/server.xml中找到下列代码,注释即可:



1.7 取消默认GC监听

如果开启了GClog,再开启GC监听,会影响GClog输出,功能重复,可以选择取消。



1.8 自定义代码路径


其中:

docBase这个是你代码的路径

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

举例:访问www.aaa.com



访问www.aaa.com/code_file

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


1.9 屏蔽DNS查询

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


1.10 文件压缩管理

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

compression="on" # 打开压缩功能

compressiOnMinSize="50" # 启用压缩的输出内容大小,默认为2KB

noCompressiOnUserAgents="gozilla, traviata" # 对于以下的浏览器,不启用压缩

compressableMimeType="text/html,text/xml,text/Javascript,text/css,text/plain" # 哪些资源类型需要压缩

如果使用apache/nginx代理,所以tomcat自身不需要进行压缩,会给服务器增加压力


1.11 调整运行模式

tomcat的三种运行模式选择: Bio, Nio, Apr



  • Bio: 默认的模式,性能非常低下,没有经过任何优化处理和支持。

  • Nio: 利用java的异步io护理技术,no blocking IO技术.想运行在该模式下,直接修改server.xml里的Connector节点,修改protocol为 protocol="org.apache.coyote.http11.Http11NioProtocol"

  • Apr: 安装困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.。必须要安装apr和native,直接启动就支持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"

其他就是关于JVM的优化,如GCC算法,对内存大小等,请参考另外的JVM调优文档。


2、Tomcat安全加固


2.1 Tomcat版本统一(必选)

生产环境中推荐将Tomcat版本进行统一,并且隐藏掉Tomcat版本号,这样一方面能够在Tomcat出现漏洞或bug时统一处理,另外一方面也减小了因为版本问题导致应用风险的增加。同时,避免因为应用错误,将Tomcat版本暴露给用户,导致因为该版本漏洞等问题被利用和攻击。


2.2 Tomcat帐号安全(必选)

将$CATALINA_HOME\conf\tomcat-users.xml中文件的所有用户都注释掉,配置如下:




如果业务需要内置的Tomcat用户【不推荐这种方式】,则需要给其分配合理的权限,密码设置符合密码策略(随机生成包含大小写字母、数字、特殊符号在内的不少于16位的密码),Tomcat角色类型如下:

role1:具有读权限;

tomcat:具有读和运行权限;

admin:具有读、运行和写权限;

manager:具有远程管理权限。

如果使用启用了Tomcat用户,则需要设置Tomcat定时登出。


2.3 默认webapps应用清理(必选)

除了需要部署上去的应用,其余位于$CATALINA_HOME\webapps文件夹中的应用如docs、examples、host-manager、manager和ROOT。

注:若无业务必要,请执行删除上述的应用包。

加固检查:

输入:http://localhost:8080/manager/html

出现的页面空白


2.4 禁止Tomcat目录列表(可选)

确保$CATALINA_HOME\conf\web.xml中listings的值为false:

避免项目目录及文件和配置泄漏,在早期的Tomcat版本中,该项为true,在无默认页面的情况下,用户可以浏览项目目录。新版本Tomcat该项默认是false。


2.5 配置shutdown端口(可选)

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

当然,在新版的 Tomcat 中该端口仅监听在127.0.0.1上,因此该项也可以不改。除非黑客登陆到tomcat本机去执行关闭操作。

修改方法:

在$CATALINA_HOME\conf\server.xml中“”,将shutdown的值改成其他的值,如stopapp等自定义的Tomcat关闭命令。或者其他较为复杂的字符串。



注:配置的端口需要大于1024。

加固检查:

使用telnet 127.0.0.1 8005进入,输入“SHUTDOWN”,Tomcat不会被关闭。


2.6 隐藏Tomcat版本信息(必选)

在默认配置下,当应用出现异常时,客户端会显示Tomcat的版本信息。攻击者可以根据Tomcat版本信息选择漏洞库攻击,所以需要将Tomcat的版本信息隐藏,将$CATALINA_HOME\lib\catalina.jar\org\apache\catalina\util中的配置ServerInfo.properties如下:

server.info=需要展现的信息如SmartCity

server.number=SmartCity

server.built=20201101

加固检测:

输入一个异常的URL看看出现的异常页面是否出现类似(无Tomcat的版本信息)


2.7 关闭war自动部署(必选)

默认的配置war放在$CATALINA_HOME\webapps中会自动部署,所以关闭war自动部署防止被植入木马等恶意程序。将$CATALINA_HOME\conf\server.xml配置如下:

appBase="webapps"
unpackWARs="false"
autoDeploy="false"
xmlValidation="false"
xmlNamespaceAware="false">

加固检查:

将一个war文件放进$CATALINA_HOME\webapps,启动Tomcat后,war文件不会被部署。


2.8 Tomcat启动权限(必选)

普通用户运行java程序


2.9 配置Tomcat pid(可选)

配置tomcat启动后将进程号保存至 ./bin/tomcat.pid 文件。

修改 catalina.sh 文件,在 PRGDIR 下面一行添加 CATALINAPID 参数行,如下:

PRGDIR=dirname "$PRG"
CATALINA_PID=$PRGDIR/tomcat.pid

启动tomcat在 ./bin 下生成PID文件tomcat.pid

[root@localhost bin]# ls tomcat.pid
tomcat.pid
[root@localhost bin]# cat tomcat.pid
12016
[root@localhost bin]# jps
12016 Bootstrap









人们永远没有足够的时间把它做好,但永远有足够的时间重新来过。

可是,因为并不是总有机会重做一遍,你必须做得更好,换句话说,

人们永远没有足够的时间去考虑到底是不是想要它,但永远有足够的时间去为之后悔。

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

浅掘千口井,不如深挖一口井!当知识支撑不了野心时,那就静下心来学习吧!运维技术交流QQ群:618354452

个人微信公众号,定期发布技术文章和运维感悟。欢迎大家关注交流。






原文链接:https://www.cnblogs.com/miaocbin/p/15245859.html



推荐阅读
  • 深入解析Java中的空指针异常及其预防策略
    空指针异常(NullPointerException,简称NPE)是Java编程中最常见的异常之一。尽管其成因显而易见,但开发人员往往容易忽视或未能及时采取措施。本文将详细介绍如何有效避免空指针异常,帮助开发者提升代码质量。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • SSM框架下的在线教育平台源代码与文档
    本文介绍了基于SSM(Spring, Spring MVC, MyBatis)框架开发的教务网络管理系统。该系统旨在有效管理学生各学年的成绩,支持快速查询学生成绩和班级信息。系统具备完善的需求分析、设计和实现方案,确保数据的安全性和系统的易用性。 ... [详细]
  • 古代城墙的高度究竟有多少?
    古代城墙是保护城市和国家的重要设施,常出现在影视剧中的壮观景象令人印象深刻。然而,这些城墙的实际高度是否如影视剧中所展现的那样高呢?本文将探讨古代城墙的真实高度及其建造背景。 ... [详细]
  • vsftpd配置(虚拟用户、匿名用户登录)
    一、ftp服务搭建(一)概述1.ftp连接及传输模式(1)控制连接TCP21,用于发送FTP命令信息 ... [详细]
  • 本文探讨了 TypeScript 中泛型的重要性和应用场景,通过多个实例详细解析了泛型如何提升代码的复用性和类型安全性。 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 解决MAC远程桌面连接证书无效问题
    本文介绍如何解决在使用MAC远程桌面连接时遇到的“证书或相关链无效”错误。通过详细步骤和专业建议,帮助用户顺利连接远程桌面。 ... [详细]
  • 原子操作是指在执行过程中不会被中断的操作。本文将探讨Java是如何通过不同的技术手段实现原子操作的,包括CPU层面的总线加锁和缓存行加锁,以及Java层面的锁机制和CAS操作。 ... [详细]
  • JVM钩子函数的应用场景详解
    本文详细介绍了JVM钩子函数的多种应用场景,包括正常关闭、异常关闭和强制关闭。通过具体示例和代码演示,帮助读者更好地理解和应用这一机制。适合对Java编程和JVM有一定基础的开发者阅读。 ... [详细]
  • 操作系统如何通过进程控制块管理进程
    本文详细介绍了操作系统如何通过进程控制块(PCB)来管理和控制进程。PCB是操作系统感知进程存在的重要数据结构,包含了进程的标识符、状态、资源清单等关键信息。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
author-avatar
张淑男尧珊肇玲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有