tomcat-tunning
书写目的
Tomcat为我司短信平台标准服务器,为了规范安装步骤、优化性能以及安全加固的相关配置,特制订以下规范。
1 Tomcat性能优化
1.1 JVM的优化
export JAVA_OPTS="-server -Xms1400M -Xmx1400M-Xss512k
-XX:+UseFastAccessorMethods-XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "
1.1.1 -server
Tomcat以server模式运行时将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量。
1.1.2 -Xms–Xmx
把Xms与Xmx两个值设成一样是最优的做法,而且设置为最大化参数。获得最大参数具体值的方法:在设这个最大内存即Xmx值时请先打开一个命令行,键入如下的命令:
连1700m都不可以,更不要说2048m了,2048m只是一个理论数值。这个跟机器也有关,有的能到1700m。
1.1.3 -Xss
是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,要不然容易出现outofmemory。
1.1.4 -XX:+AggressiveOpts
1.1.5 -XX:PermSize=128M-XX:MaxPermSize=256M
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。
由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
那么,如果是物理内存4GB,那么64分之一就是64MB,这就是PermSize默认值,也就是永生代内存初始大小;
四分之一是1024MB,这就是MaxPermSize默认大小。
1.1.6 -XX:+DisableExplicitGC
1.1.7 -XX:+UseParNewGC
1.1.8 -XX:+UseConcMarkSweepGC
即CMS GC,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是GC估算触发和heap占用触发。使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短。
1.1.9 -XX:MaxTenuringThreshold
如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。
1.1.10 -XX:+CMSParallelRemarkEnabled
在使用UseParNewGC 的情况下, 尽量减少mark 的时间。
1.1.11 -XX:+UseCMSCompactAtFullCollection
在使用concurrent gc 的情况下, 防止memoryfragmention, 对live object 进行整理, 使 memory 碎片减少。
1.1.12 -XX:LargePageSizeInBytes
1.1.13 -XX:+UseFastAccessorMethods
1.1.14 -XX:+UseCMSInitiatingOccupancyOnly
指示只有在 oldgeneration 在使用了初始化的比例后concurrentcollector 启动收集。
1.1.15 -Djava.awt.headless=true
1.2 Tomcat容器内的优化
前面对Tomcat启动时的命令进行了优化,增加了系统的JVM可使用数、垃圾回收效率与线程阻塞情况、增加了系统响应效率等还有一个很重要的指标,我们没有去做优化,就是吞吐量。
打开Tomcat安装目录\conf\server.xml文件,定位到这一行:
<Connectorport="8080" protocol=”HTTP/1.1” redirectPort=”8443”/> 即下图:
这一行就是我们的Tomcat容器性能参数设置的地方,它一般都会有一个默认值,这些默认值是远远不够我们的使用的,我们来看经过更改后的这一段的配置
<Connector port="8080" protocol=”HTTP/1.1”URIEncoding=”UTF-8”
maxSpareThreads=”75”minSpareThreads=”25”
enableLookups=”false” connectionTimeout=”20000”
1.2.1 maxSpareThreads
空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。
1.2.2 minSpareThreads
1.2.3 enableLookups
这个功效和Apache中的HostnameLookups一样,设为关闭。
1.2.4 connectionTimeout
1.2.5 maxThreads
Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。
1.2.6 acceptCount
当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection。
1.2.7 maxProcessors与minProcessors
1.2.8 useURIValidationHack
useURIValidationHack设成"false",可以减少它对一些url的不必要的检查从而减省开销。
1.2.9 enableLookups=”false”
1.2.10 disableUploadTimeout
1.2.11 Tomcat配置gzip压缩(HTTP压缩)功能
2)compressionMinSize="2048"启用压缩的输出内容大小,这里面默认为2KB
3)noCompressionUserAgents="gozilla, traviata"对于以下的浏览器,不启用压缩
4)compressableMimeType="text/html,text/xml" 压缩类型
最后要把8443端口的地方也加上同样的配置,如果我们走https协议的话,我们将会用到8443端口这个段的配置,参数跟以上一样。
Tomcat优化完成了,这样做下来,优化过的Tomcat要比未经过优化的,性能提高20~60倍。
2 Tomcat安全性配置
2.1 首次安装完成后立即删除webapps下面的所有代码
2.2 注释或删除 Tomcat-users.xml 所有用户权限,需要注释节点如下:
<?xml version='1.0' encoding='utf-8'?>
2.3 隐藏Tomcat版本信息
vim $CATALINA_HOME/conf/server.xml
<Connector port="80"protocol="HTTP/1.1"
其中红字为添加的参数配置,“”中为修改的服务器信息,使用以下命令查看当前服务器版本信息:
# curl -I http://localhost:8080/
Date: Thu, 20 Oct 2011 09:51:55 GMT
服务器信息已经被改为Server: Neo App Srv 1.0
2.4 启动用户与端口
这造成了一个问题,Linux系统小于1024的端口只有root可以使用,这也是为什么Tomcat默认端口是8080。如果你想使用80端口只能使用root启动Tomcat。这有带来了很多安全问题。
adduser -o --home /daemon --shell/sbin/nologin --uid 80 --gid 80 -c "Web Server" daemon
接下来解决80端口问题, 思路就是80去调用8080,或者映射端口。
iptables -t nat -A PREROUTING -p tcp --dport80 -j REDIRECT --to-port 8080
iptables -t nat -D PREROUTING -p tcp --dport80 -j REDIRECT --to-port 8080
这个方案可以在 Tomcat 前段增加反向代理,例如:Nginx,Apache,Squid,Varnish或者F5, Array这类设备等等
2.5 关闭war自动部署
<Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false">
防止被植入木马等恶意程序
应用程序部署与Tomcat启动,不能使用同一个用户。
我的Tomcat 安装在 /srv目录下,Tomcat启动用户为daemon; 应用程序放在/www目录下www所有者是www用户。这样的目的是一旦Tomcat被植入web shell程序,它将不能创建或编辑/www目录下面的任何内容。
adduser --home /www -c "WebApplication" www
2.6 删除管理界面(webapps下面的所有代码已经被删除,此项安全问题已经不大,设置上为多一层保险)
在server.xml中,在HOST容器中有一个配置,如
unpackWARs="true"
xmlValidation="false"xmlNamespaceAware="false">
。。。。。
;
将appBase=修改成你的应用所在的目录,比如appBase=/home/mc/mobilePlat
这样修改以后,系统自动启动的时候就不会加载webapps中的默认程序了,包括admin和manager等,只会启动htdocs目录中带xml配置参数的应用,当然如果你htdocs下面就直接是程序了,建议配置如下:
unpackWARs="true"
xmlValidation="false"xmlNamespaceAware="false">
2.7 屏蔽目录文件自动列出的方法
在Tomcat的conf/web.xml文件里把listings值改为false
如:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
2.8 打印访问日志
默认情况下Tomcat并不记录访问日志文件(access log): Catalina/conf/server.xml;将文件中这一段的注释去掉,然后将pattern的值改为combined ,这个模式下记录的日志比较详细。
<!--
<ValveclassName="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log."suffix=".txt"
pattern="combined" resolveHosts="false"/>
-->
重新启动一下Tomcat
2.9 错误页面
如果找不到网页即出现404错误,会显示服务器版本号,服务器配置也一目了然,为了避免这种情况,在Tomcat的web.xml文件中,根元素下配置:(自定义错误页面)
<error-page>
<error-code>错误代码(404....)</error-code>
<location>错误页面地址</location>
</error-page>
还可以对出现的异常进行统一的错误处理
<error-page>
<exception-type>异常类型</exception-type>
<location>错误页面地址</location>
</error-page>
2.10 Tomcat Session过期时间
Tomcat采用数据库连接池技术,当用户在一定时间不对数据库有操作时间后,就自动关闭这个连接,这是为了更好的利用资源,防止浪费宝贵的数据库连接资源。
可以采用如下三种方式,设置这个连接(Session)的过期时间:
修改Tomcat的配置文件conf
1)在server.xml中定义context时采用如下定义:
xml 代码
<Context path="/livsorder"docBase="/home/httpd/html/livsorder"
defaultSessionTimeOut="3600"isWARExpanded="true"
isWARValidated="false" isInvokerEnabled="true"
isWorkDirPersistent="false"/>
3600秒=1小时
2)Tomcat,我在web.xml中配置了session超时的时间 如下: <session-config> <session-timeout>30</session-timeout> </session-config>
这里是以分钟为单位的,默认是30分;
3)webapp级别
在webapp中的 WEB-INF/web.xml
Xml代码
<!-- 配置Session失效时间 -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
也是以min为单位;
2.11 关闭服务器端口:
server.xml默认有下面一行:
<Server port="8005" shutdown="SHUTDOWN">
这样允许任何人只要telnet到服务器的8005端口,输入"SHUTDOWN",然后回车,服务器立即就被关掉了。 从安全的角度上考虑,我们需要把这个shutdown指令改成一个别人不容易猜测的字符串,可以同时把端口也改了。 例如修改如下:
<Server port="8005" shutdown="c1gstudio">
这样就只有在telnet到8005,并且输入"c1gstudio"才能够关闭Tomcat. 注意:这个修改不影响shutdown.bat的执行。运行shutdown.bat一样可以关闭服务器。
2.12 OutOfMemory异常时获取堆栈快照
1.打开/Tomcat_home/bin/catalina.sh文件
2.加上:JAVA_OPTS="$JAVA_OPTS -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump"
如下图位置:
注:其中不设-XX:HeapDumpPath时,dump出的文件在/Tomcat_home/bin目录下
tomcat-tunning相关推荐
- springboot设置文件上传大小(tomcat默认1M)
application.yml # 设置文件上传大小(tomcat默认1M) server:tomcat:max-http-form-post-size: -1 spring:servlet:mult ...
- 在docker上安装部署tomcat项目 超简单,拿来主义
在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可.以下将详细讲解流程: 在windows中打好包以后用w ...
- Linux下tomcat的安装与卸载以及配置(超简单)
无敌简单的几步 1.安装 //首先你需要下载好tomcat包 sudo tar -xvzf apache-tomcat-7.0.85.tar.gz(这里是包名) -C 你要放的位置 2.卸载 rm - ...
- docker通过镜像方式安装tomcat
一.搜索镜像 docker search tomcat 二.下载镜像 docker pull tomcat:8 下载 docker image ls(docker images) 查看镜像 三.实例容 ...
- tomcat外网映射工具
sunny-ngrok 运行sunny-ngrok 输入客户端ID 运行成功 域名(外网)直接访问 注释:tomcat端口改为8080,并且保证http://127.0.0.1:8080 可以正常访问 ...
- 在idea使用maven工程建立web项目时,启动Tomcat访问不到项目首页。
在idea使用maven工程建立web项目时,启动Tomcat访问不到项目首页,输入URL:http://localhost:8080/时一片空白也不报错 ,按下面步骤检查: 1.看下这几个地方是否配 ...
- 详解 Tomcat 的连接数与线程池
原文出处:编程迷思 前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文 ...
- Tomcat 1099端口占用重启无效,查不到进程,改换端口无效解决方案
不知道怎么的,突然Tomcat报错1099端口被占用 以下总结了网上可能有效的三种解决方案: 方案一对我来说无效,根本查找不到1099的进程 方案二对我来说也无效 方案三有效,关闭了hyper-v服务 ...
- 最新Maven及Tomcat配置~(IDEA版 试错无数!)
目录 @[TOC](目录) 1. Tomcat的启动与配置 2. 利用Tomcat发布一个网站 3.Maven项目架构管理工具 4.配置环境变量 5.阿里云镜像 6.本地仓库 7.在idea中使用Ma ...
- Tomcat之the jre_home environment variable is not defined correctly this environment variable is need
在之前学Java的时候,我已经配置好了JAVA_HOME,但是今天启动Tomcat服务器的时候,却闪退,而且无法访问Tomcat服务器. 接下来,我来说一下我的解决方法. 我们首先编辑一下startu ...
最新文章
- iOS 仿微信灵活添加标签
- 如何实现蓝牙空中升级BLE OTA
- 洛谷 - P1433 - 吃奶酪 - dfs
- SharePoint PowerShell 修改母版页
- protocol buffer介绍(protobuf)
- 多线程服务器(python 版)
- Initialization of bean failed; nested exception is org.springframework.beans.factory.: 错误分析
- android-eclips中logcat不显示信息的问题解决
- Oracle修改字段类型方法总结
- 2021-08-20JSP内置对象及作用域
- linux模拟gps,Android之GPS研究(实战篇二)
- 全国省市区mysql数据
- js 获取元素的html代码
- 利用Openlayers4实现地图遮罩效果(三)
- 坚果云 linux 使用方法,树莓派4B踩坑指南 - (10)安装坚果云(暂时失败)
- C++基础知识(常函数)
- Java开发指南!java生成word文档修改样式
- 制作补丁与打补丁简单原理
- 明日召开 | Pulsar Summit Asia 2021 本周末线上精彩呈现
- SecureCRT SSH远程登入connection was reset