tomcat内存优化
Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 java_OPTS 参数。在 配置文件中的102行添加就行
注意:堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
JAVA_OPTS参数说明
-server 启用jdk 的 server 版;
-Xms java虚拟机初始化时的最小内存;
-Xmx java虚拟机可使用的最大内存;
-XX: PermSize 内存永久保留区域
-XX:MaxPermSize 内存最大永久保留区域
一般设置-Xms,-Xmx相等以避免在每次GC后调整堆的大小,因为默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制
现公司服务器内存一般都可以加到最大2G ,所以可以采取以下配置:
JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’
配置完成后可重启Tomcat
首先查看Tomcat 进程号:
ps aux | grep tomcat #查看tomcat的主进程号
查看参数是否生效
jmap -heap 12222 #12222是主进程号
堆(Heap)和非堆(Non-heap)内存解释
https://www.cnblogs.com/centos2017/p/9956432.html
## tomcat运行模式的优化
`Tomcat Connector(连接器)有三种运行模式:BIO NIO APR`
**BIO(blocking I/O)**
是基于JAVA的HTTP/1.1连接器,Tomcat7以下版本在默认情况下是以bio模式运行的。一般而言,bio模式是三种运行模式中性能最低的一种。我们可以通过Tomcat Manager来查看服务器的当前状态。(**Tomcat7** 或以下,在 **Linux** 系统中默认使用这种方式)一个线程处理一个请求,缺点:并发量高时,线程数较多,浪费资源
<Connector port="9090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
#### **NIO(new I/O)**
是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。要让Tomcat以nio模式来运行只需要在Tomcat安装目录/conf/server.xml 中将对应的中protocol的属性值改为 org.apache.coyote.http11.Http11NioProtocol即可利用 Java 的异步请求 IO 处理,可以通过少量的线程处理大量的请求。
**Tomcat8**: 以上版本在 **Linux** 系统中,默认使用的就是NIO模式,不需要额外修改,**Tomcat7**必须修改Connector配置来启动
<Connector port="9090" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
APR (Apache Portable Runtime/Apache可移植运行时) ( 安装配置过程相对复杂)
APR(Apache Portable Run-time libraries)简单理解,就是从操作系统级别解决异步IO问题,大幅度的提高服务器的处理和响应性能, 也是Tomcat运行高并发应用的首选模式。APR是使用原生C语言编写的非堵塞I/O,利用了操作系统的网络连接功能,速度很快。但是需先安装apr和native,能大幅度提升性能,不亚于魔兽开局爆高科技兵种,威力强大
wget http://mirror.bit.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
yum install expat-devel openssl gcc
具体安装部署: https://my.oschina.net/boonya/blog/3019704
### tomcat执行器(线程池)的优化
开启线程池:打开server.xml中关于线程池的配置
#一般情况下我们不使用Executor开启线程池,我们在Connector上直接配置
$ vim /usr/local/tomcat/conf/server.xml
<Connector executor="tomcatThreadPool"
port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" #使用NIO
connectionTimeout="40000"
keepAliveTimeout="30000"
maxKeepAliveRequests="8000"
maxHttpHeaderSize="8192"
URIEncoding="UTF-8"
enableLookups="false"
acceptCount="1000"
disableUploadTimeout="true"
redirectPort="8443"
compression="on"
compressionMinSize="1024"
noCompressionUserAgents="gozilla,traviata"
compressableMimeType="text/html,image/gif,image/jpeg,text/css,application/" />
参数解释:
port:服务端口TCP端口,默认值为8089;
connectionTimeout:设置连接的超时值,单位毫秒,默认值为60000;
keepAliveTimeout:当http使用keep-alive时在tcp的一个连接中可以接收多个request,意思就是两个request间的时间限定最大保持时间,超过这个时间,连接将断开,单位毫秒,默认使用的是connectionTimeout的时间;
maxKeepAliveRequests:在服务器关闭前,该连接最大支持的请求数,超过该请求数的连接也将被关闭,设置为1表示禁用,设置为-1表示不限个数,默认值为100;
maxHttpHeaderSize:HTTP请求和响应头的最大量,单位字节,默认值为4096字节;
URIEncoding:指定tomcat的url编码格式;
enableLookups:调用request、getRemoteHost()执行DNS查询,以返回远程主机的主机名,如果设置为false,则直接返回IP地址,DNS反查很耗时间
acceptCount:当所以可以处理的线程正在使用的时候,在队列中排队请求的最大连接数,当队列已满,所有请求都将被拒绝,默认值为100;
disableUploadTimeout:上传时是否使用超时机制,以是servlet有较长时间来完成它的执行,默认值为false;
redirectPort:如连接器不支持SSL请求,如收到SSL请求,Catalina容器将会自动重定向指定的端口号,让其进行处理;
compression:是否对响应的数据进行压缩,off:禁止压缩,on:允许压缩(文本将被压缩),force:表示所有情况下都进行压缩,默认值为off;
compressionMinSize:启用压缩的输出内容大小,默认为2KB
noCompressionUserAgents:不启用压缩的浏览器;
compressableMineType:MIME的列表,默认以逗号分隔,默认值为text/html,text/xml,text/plain;
## tomcat版本隐藏
为了避免黑客针对某些版本进行攻击,因此我们需要隐藏或者伪装 Tomcat 的版本信息。默认 Tomcat 的版本信息如下:
针对该信息的显示是由一个jar包控制的,该jar包存放在 Tomcat 安装目录下的lib目录下,名称为catalina.jar。
我们可以通过 jar xf 命令解压这个 jar 包会得到两个目录 META-INF 和 org ,通过修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo 字段来实现来更改我们tomcat的版本信息。
设置session失效时长
我们都知道,HTTP协议本身是无状态的(Stateless),这对于一些简单的页面展示来说,功能足够,不受影响。而对于日渐复杂的动态页面、应用,各种需要登录认证等场景,就力不从心了。试想对于一个已经登录的用户仍然一次次的提示登录,会是什么感受呢?而为了保持客户端和服务端交互状态,可以采取session失效时长
Tomcat的可以在以下几个地方设置会话超时:
web级别:
在conf /web.xml文件中
< session-config >
< session-timeout > 30 </ session-timeout > #默认就是30分钟,以分为单位
</ session-config >
webapp级别:
在webapp中的WEB-INF /web.xm
< session-config >
< session-timeout > 30 </ session-timeout > #以分为单位
</ session-config >
应用程序代码中:硬编码
session.setMaxInactiveInterval(30 * 60 ); //以秒为单位
优先级,越细粒度优先级越高,也就是3> 2> 1
还要一种配置,但现在比较少见了,因为需要将上下文配置在server.xml里:
这就是修改 conf /server.xml配置文件钟,是以秒为单位
< Context path = “/ test” docBase = “/ home / httpd / html / test”
defaultSessionTimeOut = “3600” isWARExpanded = “true”
isWARValidated = “false” isInvokerEnabled = “true”
isWorkDirPersistent = “false” />
## 禁用AJP连接器实现动静分离
#Tomcat 服务器通过Connector连接器组件与客户程序建立连接,Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客 户。默认情况下,Tomcat在server.xml中配置了两种连接器,一种使用ajp,要和apache结合使用,一种使用http。当使用http 时,可以限制ajp端口访问,在于防止线下测试流量被mod_jk转发至线上tomcat服务器。可以通过iptables规则限制ajp端口的访问,或 者直接将改行注释。
$ vim conf/server.xml
<!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />-->
# Apache基金下的服务器来做静态资源处理的,而这部分需要花费大量时间,当用nginx和tomcat做企业级集群的时候,需要禁用掉AJP协议。
#nginx加tomcat实现动静分离
web客户1访问tomcat服务器的 资源index.jsp 是可以直接访问的,如果我们访问的是静态资源,tomcat是不方便处理的它会把这些静态资源返回给Apache服务器,由他们返回给用户,所以tomcat服务器相对于nginx服务器在处理静态资源上效率较低。因此我们的网站服务器一般是Nginx+tomcat,nginx负责处理静态资源,因此AJP 协议我们在使用nginx+tomcat架构时可以关闭它来进行效率的优化。
文件列表访问控制
conf/web.xml文件中的default部分listings的配置必须为false,false为不列出目录文件,true为允许列出,默认为false。
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
### 访问日志格式规范
# 开启Referer和User-Agetn是为了一旦出现安全问题能够更好的根据日志进行排查
$ vim conf/server.xml
<Host name="23.83.xx.xx" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %{Referer}i %{User-Agent}i %D" />
<Context docBase="/usr/local/tomcat/webapps/FWYsWeb" path="" reloadable="true"/>
<Context docBase="/usr/local/tomcat/webapps/FWYsWeb" path="/FWYsWeb" reloadable="true"/>
</Host>
配置管理员账户
进入conf目录下,打开tomcat-users.xml,在首尾元素中间加入:
<role rolename="manager"/>
<role rolename="manager-gui"/> #允许访问html接口(即URL路径为/manager/html/*)
<role rolename="admin"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>
还有很多权限配置可以百度
访问:http://ip地址:8080/manager/status 就会出现监控页面