Tomcat安全加固与性能优化
作者:快盘下载 人气:[TOC]
修订控制页
版本 |修订日期 |修订人 |修订摘要
—|—|—|—
1.0| 2019年9月10日 09点00分 |WeiyiGeek |初稿
1.引言
1.1 目的
为了更好的指导部署Tomcat应用容器,保证服务的安全稳定高性能的运行,需要对其进行加固和优化; 本次进行Tomcat容器调优加固主要从以下几个部分:
内核参数优化性能参数优化安全加固配置1.2 目标范围
本文档仅供内部使用,禁止外传,帮助研发人员,运维人员对系统长期稳定的运行提供技术文档参考。
1.3 读者对象
1) 项目经理 2) 开发人员 3) 测试人员 4) 运维人员 5) 相关领导
2.参考说明
2.1 帮助参考
Apache Tomcat是美国Apache软件基金会的一款轻量级Web应用服务器,该程序实现了对Servlet和JSP的支持。 目前是Apache开源软件组织的一个软件项目它的官网 :http://tomcat.apache.org , 在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选,默认端口8080。
Tomcat8配置帮助文档: http://tomcat.apache.org/tomcat-8.0-doc/config/ Security Manage: http://tomcat.apache.org/tomcat-8.0-doc/security-manager-howto.html
Tomcat初始目录结构
/usr/local/tomcat #主目录即安装的目录 ├── bin #存放启动和关闭Tomcat的脚本文件 ├── conf #存放Tomcat服务器的各种配置文件(后面单介绍) ├── lib #存放tomcat服务器支撑的jar包 ├── logs #存放Tomcat的日志文件 ├── temp #存放Tomcat运行时产生的临时文件 ├── webapps #web应用虽在目录,即供外界访问的web资源的存放目录,就是Web发布目录 │ ├── docs #帮助文档目录 │ ├── examples #Servlet and JSP Examples案例目录 │ ├── host-manager #主机管理目录 │ ├── manager #应用程序管理目录 │ └── ROOT #应用程序放置地址 └── work #Tomcat的工作目录,存放jsp编译后产生的class文件
Tomcat全局配置目录结构:
[root@master conf]# tree ├── catalina.policy #权限控制配置文件 ├── catalina.properties #Tomcat属性配置文件 ├── context.xml #上下文配置文件(selinux) ├── jaspic-providers.xml ├── jaspic-providers.xsd ├── logging.properties #日志log相关配置文件 ├── server.xml #主配置文件(如修改监听端口,开启关闭额外的服务,设置网站根目录,虚拟主机,开启https等功能) ├── tomcat-users.xml #manager-gui管理用户配置文件(Tomcat安装后生成的管理界面,该文件可开启访问) ├── tomcat-users.xsd └── web.xml #Tomcat的servlet,servlet-mapping,filter,MIME等相关配置
Tomcat的JavaWeb应用的组成结构:
mail--- #-Web应用所在目录 |---- #html、jsp、css、js等文件,根目录下的文件外界可以直接访问 |---- #WEB-INF目录 (应用配置文件存放) |---------classes目录 #(java类) |---------lib目录 #(java类运行所需的jar包) |---------conf目录 #(数据库以及其他配置文件存放目录) |---------web.xml #(web应用的配置文件) #注意:WEB-INF 这个目录下的文件外界无法直接访问,由web服务器负责调用
Tomcat默认开发的端口介绍:
8005:用于SHUTDOWN指令来关闭Tomcat时使用;8009:用于Apache连接Tomcat时候专用端口采用AJP协议;8080:用于HTTP协议远程访问端口即Web页面访问端口;3.内核优化
需要进行调整的内核参数
cat >> /etc/sysctl.conf << EOF # cat /proc/sys/net/core/netdev_max_backlog # 默认值:1000 # 作用:网卡设备将请求放入队列的长度 net.core.netdev_max_backlog = 32768 # cat /proc/sys/net/core/somaxconn # 默认值:128 # 作用:已经成功建立连接的套接字将要进入队列的长度 net.core.somaxconn = 32768 # cat /proc/sys/net/core/rmem_default # 默认值:212992 # 作用:默认的TCP数据接收窗口大小(字节) net.core.rmem_default = 8388608 # cat /proc/sys/net/core/wmem_default # 默认值:212992 # 作用:默认的TCP数据发送窗口大小(字节) net.core.wmem_default = 8388608 # cat /proc/sys/net/core/rmem_max # 默认值:212992 # 作用:最大的TCP数据接收窗口大小(字节) net.core.rmem_max = 16777216 # cat /proc/sys/net/core/wmem_max # 默认值:212992 # 作用:最大的TCP数据发送窗口大小(字节) net.core.wmem_max = 16777216 # cat /proc/sys/net/ipv4/ip_local_port_range # 默认值:32768 61000 # 作用:可用端口的范围 net.ipv4.ip_local_port_range = 1024 65535 # cat /proc/sys/net/ipv4/route/gc_timeout # 默认值 300 # 作用:路由缓存刷新频率,当一个路由失败后多长时间跳到另一个路由 net.ipv4.route.gc_timeout = 100 # cat /proc/sys/net/ipv4/tcp_fin_timeout # 默认 60 # 作用:表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间 net.ipv4.tcp_fin_timeout = 30 # cat /proc/sys/net/ipv4/tcp_keepalive_time # 默认值:7200 # 作用:间隔多久发送1次keepalive探测包 net.ipv4.tcp_keepalive_time = 1200 # cat /proc/sys/net/ipv4/tcp_timestamps # 默认值:1 # 作用:TCP时间戳,时间戳必须要开启,否则下面的 TIME_WAIT 重用和快速回收无效 net.ipv4.tcp_timestamps = 1 # cat /proc/sys/net/ipv4/tcp_tw_recycle # 默认值:0 # 作用:表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。 net.ipv4.tcp_tw_recycle = 1 ######################## cat /proc/sys/net/ipv4/tcp_tw_reuse # 默认值:0 # 作用:针对 TIME-WAIT,做为客户端可以启用(例如,作为nginx-proxy前端代理,要访问后端的服务) net.ipv4.tcp_tw_reuse = 1 # cat /proc/sys/net/ipv4/tcp_syn_retries # 默认值 2 # 作用:在内核放弃建立连接之前发送SYN包的数量。 net.ipv4.tcp_syn_retries = 1 # cat /proc/sys/net/ipv4/tcp_synack_retries # 默认值 2 # 作用:为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。 net.ipv4.tcp_synack_retries = 1 # cat /proc/sys/net/ipv4/tcp_mem #确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB)。 #第一个值是内存使用的下限。 #第二个值是内存压力模式开始对缓冲区使用应用压力的上限。 #第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的 BDP 可以增大这些值(但是要记住,其单位是内存页,而不是字节)。 net.ipv4.tcp_mem = 94500000 915000000 927000000 # cat /proc/sys/net/ipv4/tcp_max_orphans # 默认值 16384 # 作用:系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单 的DoS攻击,你绝对不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。 net.ipv4.tcp_max_orphans = 3276800 # cat /proc/sys/net/ipv4/tcp_max_syn_backlog # 默认值:128 # 作用:增大SYN队列的长度,容纳更多连接 net.ipv4.tcp_max_syn_backlog = 65535 EOF #执行使内核参数生效 sysctl -p
4.性能优化
描述: 由于Tomcat的运行依赖于JVM,从虚拟机的角度我们把Tomcat的调整分为外部环境调优和自身调优两类来描述。
4.1 外部调优
主要调整Tomcat运行环境的操作系统参数和运行Tomcat的java虚拟机参数。
Tomcat需要依赖Java虚拟机运行,根据客户选用的主机的操作系统选择对应的JDK的版本建议使用最新的版本。 Tomcat的使用内存配置实质上是JVM的内存配置编辑 catalina.[sh / bat] 配置文件,注意这里区分Windows和Linux;
jvm 优化是我们要去调配置、调代码,需要充分利用JVM底层的内容进行设置, 注意整个堆heap大小 = 年轻代大小 + 年老代大小 + 持久代大小 之和。
(1) 尽可能将对象预留在新生代,减少老年代GC的次数(通常老年回收起来比较慢)(2) 实际工作中,通常将堆的初始值和最大值设置相等,这样可以减少程序运行时进行的垃圾回收次数和空间扩展,从而提高程序性能。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。(3) 年轻代:刚创建完对象放到里面去不用时等待jvm移除(可根据创建时间)。(4) 年老代:当空间不够时则将创建最早的对象挪过去。当又需要用到这个对象时,又将其挪入年轻但,挪来挪去影响效率。JVM调优之设置Java虚拟机运行生产环境参数配置:
参数 | 描述 | 备注 |
---|---|---|
-server | Server 模式启动应用慢但是极大程度提高运行性能,特别是在稳定期过后。 -client | Cliet 模式启动应用快。
内存调优 | 描述说明 | 备注 |
---|---|---|
-Xms2g | 堆的初始可用内存大小,单位 m、g 。如 -Xms2g -Xmx2g | 堆的最大可用内存大小,单位 m、g 。如 -Xmx2g (设置与Xms相同的内存大小 , 为减少程序运行时进行的垃圾回收次数和空间扩展) -Xmn256m | 设置年轻代内存大小,单位 m、g 。 如 -Xmn256m (此值对系统性能影响较大,推荐配置为整个堆的 3/8 或 1/4,一般在增大年轻代内存后,也会将会减小年老代大小。) -Xss128k | 设置每个线程的栈Stack大小,单位 m、g 。如 -Xss128k (越大我们能递归调用的方法数量越多,但是空间越大创建时间越长)。 每个线程栈大小为1M以前每个线程栈大小为256K, 更具应用的线程所需内存大小进行调整, 在相同物理内存下,减小这个值能生成更多的线程。 但是操作系统对一个进程内的线程数还是有限制的不能无限生成,经验值在3000~5000左右可以在Linux内核中进行配置。 -XX:NewRatio=4 | 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。如此时则年轻代与年老代所占比值为1:4, 年轻代占整个堆栈的 1/5。 -XX:SurvivorRatio=4 | 设置年轻代中Eden区与Survivor区的大小比值。如Eden区与两个Survivor区的比值为4:2, 一个Survivor区占整个年轻代的1/6。 -XX:PermSize=16m | 设置持久代大小为16m, 持久代一般固定的内存大小为64m。 (越大加载的类阅越多) | support was removed in 8.0 -XX:MaxPermSize=16m | 设置最大持久代大小为16m, 默认是物理内存的1/4最大1024m。| support was removed in 8.0 -XX:MaxTenuringThreshold=0 | 设置垃圾最大年龄存活。 如果设置为0的话则年轻代对象不经过Survivor区,直接进入年老代, 对于年老代比较多的应用可以提高效率。 如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
垃圾回收策略调优
描述: 我们都知道Java虚拟机都有默认的垃圾回收机制,但是不同的垃圾回收机制的效率是不同的,正是因为这点我们才经常对Java虚拟机的垃圾回收策略进行相应的调整。
Tips : Java虚拟机的垃圾回收策略一般分为串行收集器、并行收集器和并发收集器。
垃圾回收策略之串行收集器调优 | 描述说明 | 备注 |
---|---|---|
-XX:+UseSerialGc | 代表垃圾回收策略为串行收集器,即在整个扫描和复制过程采用单线程的方式来进行,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,主要在JDK1.5之前的垃圾回收方式。 | |
垃圾回收策略之并行收集器调优 | 描述说明 | 备注 |
---|---|---|
-XX:+UseParallelGC | 代表垃圾回收策略为并行收集器(吞吐量优先),即在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式。此配置仅对年轻代有效。该配置只能让年轻代使用并发收集,而年老代仍旧使用串行收集。| | -XX:ParallelGCThreads=4 | 配置并行收集器(Gc)的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。 | | -XX:+UseParallelGCThreads=8 | 并行收集器线程数同时有多少个线程进行垃圾回收一般与CPU数量相等 | support was removed in 8.0 -XX:+UseParallelOldGC | 配置年老代垃圾收集方式为并行收集, JDK6.0支持对年老代并行收集。| | -XX:MaxGCPauseMillis=100 | 设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。| | -XX:+UseAdaptiveSizePolicy | 设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时一直打开。 | |
垃圾回收策略之并发收集器调优 | 描述说明 | 备注 |
---|---|---|
-XX:+UseConcMarkSweepGC | 代表垃圾回收策略为并发收集器 |
垃圾回收策略之其它策略 | 描述说明 | 备注 |
---|---|---|
-XX:PrintGC | 每次触发GC的时候打印相关日志 | | -XX:+PrintGCDetails | 更详细的GC日志 | | -XX:+HeapDumpOnOutOfMemoryError| 堆异常报错输出 | | -XX:HeapDumpPath=path | 设置在dump heap时将文件dump到哪里。默认是当前目录下 java_pidpid.hprof这样形式的文件。| | -XX:+UseCMSCompactAtFullCollection | 开启内存空间压缩和整理,防止过多内存碎片 | tomcat 8.0 报警告 Headless=true | windows系统可不用设置,适用于Linux系统与图形操作有关,如生成验证码含义是当前的是无显示器的服务器,应用中如果获取系统显示有关的参数会抛出异常 || -Dfile.encoding=UTF-8 |设置字符集避免日志中出现乱码 | | -Dsun.jnu.encoding=UTF-8 | 设置字符集避免日志中出现乱码 || -Duser.timezone=GMT+08 |时区设置 ||
Tomcat 默认可以使用的内存为128MB,在较大型的应用项目中内存是不够的所以需要调大,一般设置初始化内存为256MB,可以使用的最大内存为512MB。
#Linux# $vim /usr/local/tomcat8/bin/catalina.sh #在OS specific support. $var _must_ be set to either true or false.110行下面添加 JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xmn256m -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:+UseParallelGC -XX:ParallelGCThreads=4 -XX:+UseParallelOldGC -XX:+UseParallelOldGC " #Windows# $vim /usr/local/tomcat8/bin/catalina.bat #在/bin目录下的catalina.bat可以直接通过Tomcat设置JVM内存参数 set "JAVA_OPTS=%JAVA_OPT% -server -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true"
WeiyiGeek.
java 8开始PermSize被MetaspaceSize代替,MetaspaceSize共享heap不会再有java.lang.OutOfMemoryError:PermGen space可以不设置java8 开始已经移除MaxPermSize/UseParallelGCThreads=8Java 提供的垃圾回收机制虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度并且收集垃圾可以接受的速度与应用有关如果堆(heap)的空间很大,那么完全垃圾收集(FULL GC)就会很慢,但是频度会降低。如果在客户系统中把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。推荐把-Xms设置为应用所需的最小值,这样会产生高效的垃圾回收。
描述: 虽然tomcat也可以作web服务器但其处理静态html的速度比不上Nginx服务,并且为了更好的进行设置负载均衡,还是得和Nginx进行联用;
因此我们可以把 Nginx 和 Tomcat 集成起来, 将html与jsp的功能部分进行明确分工, 让tomcat只处理jsp部分,或者也可以由其它的由 apache, IIS 等这些 web服务器处理,由此大大节省了tomcat有限的工作线程。
4.2 自身调优
禁用DNS查询
描述: 消除DNS查询对性能的影响我们可以关闭DNS查询优化: enableLookups="false"结果: 节省了网络带宽、查询时间和内存,而且更小的流量会使日志数据也会变得更少,显而易见也节省了硬盘空间调整线程数(需要根据压力测试进行调整)
描述: 可通过应用程序的连接器(Connector)进行性能控制的参数是创建的处理请求的线程数。在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。但是应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小;web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。优化: 修改 minProcessors 和maxProcessors 的值来控制线程数结果: 它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。NIO 配置
描述:NIO (No-blocking I/O)从JDK 1.4起,NIO API作为一个基于缓冲区,并能提供非阻塞I/O操作的API被引入[LD6];TOMCAT可以支持高并发的企业级应用,配置良好的tomcat都会使用APR(Apache Portable Runtime),APR是Apache HTTP Server2.x的核心,它是高度可移植的本地库,它使用高性能的UXIN I/O操作,低性能的java io操作。优化: protocol="org.apache.coyote.http11.Http11NioProtocol"结果: NIO使用单线程(单个CPU)或者只使用少量的多线程(多CPU)来接受Socket,而由线程池来处理堵塞在pipe或者队列里的请求。只要OS可以接受TCP的连接,web服务器就可以处理该请求。大大提高了web服务器的可伸缩性。ARP配置(推荐方式-但是需要安装额外的包):
描述: Tomcat APR 模式也是 Tomcat 在高并发下的首选运行模式优化: protocol="org.apache.coyote.http11.Http11AprProtocol"结果: 调用 httpd 核心链接库来读取或文件传输,从而提高 tomcat 对静态文件的处理性能Connector 属性 | 说明 | 值 |
---|---|---|
port|Tomcat启动监听端口| Default 8080 | protocol|Tomcat的3种运行状态协议| Default bio HTTP/1.1| acceptCount|监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads)| Default 100,建议设置1000| maxThreads|当前可以同时处理的最大用户访问数最大连接数配置(并发能力)| Default 200 ,建议设置1000| minSpareThreads| Tomcat初始化时创建的socket线程数,线程的最小运行数目 | Default 10 ,建议设置1000| maxSpareThreads| Tomcat连接器的最大空闲socket线程数,一旦创建的线程超过这个值将会关闭socket| 建议设置1000| minProcessors| 服务器创建时的最小处理线程数 | 建议设置 100| maxProcessors| 服务器同时最大处理线程数 | 建议设置 1000| enableLookups | 支持域名解析可把ip地址解析为主机名 | 建议设置false 关闭DNS反向查询| compression | 是否打开压缩功能 | on| compressionMinSize | 压缩的最小字节 | 2048| compressableMimeType | 压缩的MImeType类型 | text/html,text/xml,text/javascript,text/css,text/plain| connectionTimeout | 代表连接超时时间,单位为毫秒 | 默认值为60000。通常情况下设置为30000| disableUploadTimeout | 标志允许servlet在一个servlet执行的时候,使用一个不同的更长的连接超时。| 建议设为false| keepAliveTimeout|长连接超时时间 |常常设置-1永不过期| URIEncoding|URL统一编码|utf-8| redirectPort|在需要基于安全通道的场合,把客户请求转发到基于SSL的redirectPort端口|8443| prestartminSpareThreads | 在 Tomcat 初始化的时候就初始化 minSpareThreads 的 maxQueueSize | 最大的等待队列数,超过则拒绝请求 |
描述: 在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。 修改server.xml文件:
$ vim ./conf/server.xml <!‐‐ 将注释打开(注释没打开的情况下默认10个线程,最小10,最大200)‐‐> <Executor name="tomcatThreadPool" namePrefix="catalina‐exec‐" maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" maxQueueSize="100"/> <Connector port="8080" #默认BIO/建议采用NIO或者arp提高并发处理能力 protocol="HTTP/1.1" #网络连接超时,单位:毫秒。设置为0表示永不超时(不推荐)) connectionTimeout="30000" maxHttpHeaderSize="32768" redirectPort="8443" #当前可以同时处理的最大用户访问数最大连接数配置(并发能力) maxThreads="1000" #Tomcat初始化时创建的线程数。最小空闲线程连接数用于优化线程池 minSpareThreads="100" #一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。 maxSpareThreads="1000" acceptorThreadCount="2" #当所有的线程以分配,仍然允许连接进来,但是出于等待状态的用户数。 #等待线程数+工作线程数=总的可最大连接数,超过这个数的请求将不予处理。 acceptCount="2000" minProcessors="100" maxProcessors="2000" #为了消除DNS查询对性能的影响我们可以关闭DNS查询,关闭该功能在一定程度上提高了Tomcat服务器的性能; enableLookups="false" maxKeepAliveRequests="-1" keepAliveTimeout="-1" disableUploadTimeout="false" connectionUploadTimeout="150000" useSendfile="false" #Tomcat 压缩配置,建议在前端 nginx 上开启压缩。Tomcat 作为应用服务器本身就很繁忙了。 compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,application/javascript,application/json,text/javascript,text/css,text/plain,image/gif,image/png" URIEncoding="UTF-8" />
#1.下载编译apr依赖 cd /usr/local/src/ wget http://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.7.0.tar.gz wget http://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.6.1.tar.gz tar xf apr-1.7.0.tar.gz && tar xf apr-util-1.6.1.tar.gz cd apr-1.7.0 ./configure --prefix=/usr/local/apr make -j 2 && make install cd apr-util-1.6.1 ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ make -j2 && make install cp "/opt/tomcat/apache-tomcat-8.5.45/bin/tomcat-native.tar.gz" . tar xf tomcat-native.tar.gz && cd tomcat-native-1.2.23-src/native/ ./configure --prefix=/usr/local/apr --with-java-home=/opt/tomcat/jdk8/ make -j 2 && make install #添加apr path echo "export LD_LIBRARY_PATH=/usr/local/apr/lib" > /etc/profile source /etc/profile
配置arp模式:
$ cd /usr/local/tomcat/conf/ $ vim server.xml <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" redirectPort="8443" /> #注意如果SSLEngine设置off会导致报错 <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
WeiyiGeek.
成功后查看启动日志:
$cat /opt/tomcat/apache-tomcat-8.5.45/logs/catalina.out 12-Sep-2019 12:37:47.381 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-10.10.107.222-8080"] 12-Sep-2019 12:37:47.417 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["https-openssl-apr-443"] 12-Sep-2019 12:37:47.419 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 891 ms
描述:执行器(线程池)在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。
#去掉下面两个元素注释并修改maxThreads: <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="300" minSpareThreads="4"/> <Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="1000" minSpareThreads="100" maxSpareThreads="200" acceptCount="1000" disableUploadTimeout="true" connectionTimeout="30000" URIEncoding="UTF-8" enableLookups="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png" redirectPort="8443" />
WeiyiGeek.
Context元素reloadable属性会监视在 web-inf/classes 和 web-inf/lib 目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载web应用。
在开发和调试阶段,将其改为true但是一般像Eclipse等开发环境都会默认改为true
在正式发布阶段,应将其该为false可以降低Tomcat的运行负荷,提高Tomcat的运行性能
$vim conf/server.xml #在</Host>之前加入类似以下内容:(重启生效) <context path="/bbs" docbase="bbs" reloadable="false"/>
描述:当你执行了 ./startup.sh 或者 ./catalina.sh start 后等待时间过长能要几分钟才能正常提供服务。 原因:在apache-tomcat 官方文档:如何让 tomcat 启动更快里面提到了一些启动时的优化项,其中一项是关于随机数生成时,采用的"熵源"(entropy source)的策略。
使用伪随机函数生成器:
通过修改 Tomcat 启动文件 -Djava.security.egd=file:/dev/urandom通过修改 JRE 中的 java.security 文件 securerandom.source=file:/dev/urandJAVA_OPTS="-server -Xms1024m -Xmx2048m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -Djava.security.egd=file:/dev/urandom"
WeiyiGeek.
增大/dev/random的熵池(推荐)
#安装熵池服务 rngd $yum -y install rng-tools $systemctl start rngd $systemctl enable rngd
启动服务后观察 cat/proc/sys/kernel/random/entropy_avail 基本在三千左右。
$cat /proc/sys/kernel/random/entropy_avail 3311
5.安全加固
描述:加固依然分为身份鉴别、访问控制、安全审计、资源控制和入侵防范5个方面; 大部分加固基于xml配置文件进行修改,也应根据实际需求制定方案。
#寻找配置文件目录 find /-name *tomcat* #配置文件目录存放目录 ${tomcat_home}/conf/...
5.1 身份鉴别
描述:口令要求:长度至少8位,并包括数字、小写字母、大写字母和特殊符号4类中至少3类。 修改tomcat配置文件/conf/tomcat-users.xml配置文件,要求usr1密码必须满足复杂度要求。
<user username="Tomcat1" password="12345qwe" roles="manager-gui"> <user username="Tomcat2" password="12345qwe" roles="admin-gui">
描述:Tomcat的主要管理界面被称为Manager应用程序
如果不使用manager来管理部署应用,建议修改tomcat配置文件/conf/tomcat-users.xml配置文件来禁用或者删除manager文件夹
如果使用该功能我们需要进行配置口令以及强密码包括访问控制,删除与工作无关的帐号以及应用。
#1.配置强密码登录manager后面 $vim tomcat_user.xml <?xml version="1.0" encoding="UTF-8"?> <tomcat-users xmlns="http://tomcat.apache.org/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd" version="1.0"> #角色如下并且要记得只赋予最小权限: # manager-gui:可以访问web界面 # manager-status:只可以访问“Server Status”页面 # manager-script:可以脚本文本界面和“Server Status”页面 # manager-jmx:可以访问JMX代理界面和“Server Status”页面 <role rolename="manager-gui"/> #host-manager页面 <role rolename="admin-gui"/> <!--密码复杂度需要满足等保要求--> <user username="admin" password="@weiyigeek@" roles="manager-gui,admin-gui"/> </tomcat-users> #2.访问控制设定(其实默认只能本机访问) $/opt/tomcat/apache-tomcat-8.5.45/webapps/manager/META-INF/ #采用正则添加匹配 <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />
加载全部内容