热门标签 | 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编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 在PHP后端开发中遇到一个难题:通过第三方类文件发送短信功能返回的JSON字符串无法解析。本文将探讨可能的原因并提供解决方案。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文详细介绍了如何正确配置Java环境变量PATH,以确保JDK安装完成后能够正常运行。文章不仅涵盖了基本的环境变量设置步骤,还提供了针对不同操作系统下的具体操作指南。 ... [详细]
  • 洞态IAST Java Agent 实现AOP技术详解
    本文深入探讨了洞态IAST Java Agent如何通过AOP技术实现方法调用链和污点值传播等功能,为读者提供了详细的源码分析。 ... [详细]
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社区 版权所有