tomcat8 性能优化

Tomcat配置相关说明

1.开启Tomcat APR运行模式,优化并发性能

2.优化配置JVM

3.配置共享线程池

4.访问日志配置接口请求处理时间

5.tomcat日志切割

6.配置tomcat隐藏版本号

7.配置tomcat开机自启动

8.配置tomcat禁用(修改)8005端口

9.修改tomcat项目目录和支持热部署

生产实例配至说明


Tomcat配置相关说明

/usr/local/tomcat

主目录(安装目录)

bin

存放windows或linux平台上启动或关闭的Tomcat的脚本文件

conf

存放Tomcat的各种全局配置文件,其中最主要的是server.xml和web.xml

lib

存放Tomcat运行需要的库文件(JARS)

logs

存放Tomcat执行时的LOG文件

webapps

Tomcat的主要Web发布目录(包括应用程序事例)htdocs(html php)

work

存放jsp编译后产生的class文件

[root@tomcat1 ~]# ls /usr/local/tomcat/conf/

catalina.policy

权限控制配置文件

catalina.properties

Tomcat属性配置文件

context.xml

上下文配置文件(selinux)

logging.properties

日志log相关配置文件

server.xml

主配置文件

tomcat-users.xml

manager-gui管理用户配置文件(Tomcat安装后生成的管理界面,该文件可开启访问)

web.xml

Tomcat的servlet,servlet-mapping,filter,MIME等相关配置

server.xml

主要配置文件,可修改启动端口,设置网站根目录,虚拟主机,开启https等功能。

conf

存放Tomcat的各种全局配置文件,其中最主要的是server.xml和web.xml

1.开启Tomcat APR运行模式,优化并发性能

yum install -y apr-devel openssl-devel gcc gcc-c++

cd /home/tomcat8/bin

tar -zxvf tomcat-native.tar.gz

cd tomcat-native-1.2.16-src/native

./configure --with-apr=/usr/bin/apr-1-config --with-ssl=/usr --with-java-home=/usr/local/jdk

make

make install

ln -s /usr/local/apr/lib/libtcnative* /usr/lib64/

修改server.xml

vim /home/tomcat8/conf/server.xml

把protocol改成下面找个

<Connector port="8009" protocol="org.apache.coyote.ajp.AjpAprProtocol" redirectPort="8443" />

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"

              connectionTimeout="20000"

              redirectPort="8443" />


然后重启tomcat,观察日志tailf /home/tomcat8/logs/catalina.out

2017-10-12 15:31:19,032 - Initializing ProtocolHandler ["http-apr-8080"]

2017-10-12 15:31:19,051 - Starting ProtocolHandler ["ajp-apr-8009"]

这样就成功了

2.优化配置JVM

vim /home/tomcat8/bin/catalina.sh

编辑catalina.sh配置文件

[root@tomcat1 ~]# vim /home/tomcat/apache-tomcat-9.0.10/bin/catalina.sh

# OS specific support. $var _must_ be set to either true or false.下面添加

JAVA_OPTS="-server -Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParallelGCThreads=8 -XX:CMSInitiatingOccupancyFraction=80 -XX:

+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -Xloggc:../logs/gc.log"

参数描述

-Xms

堆内存初始大小,单位m、g

-Xmx

堆内存最大允许大小,一般不要大于物理内存的80%

-XX:PermSize

非堆内存初始大小,一般应用设置初始化200m,最大1024m就够了

-XX:MaxPermSize

非堆内存最大允许大小

-XX:+UseParallelGCThreads=8

并行收集器线程数,同时有多少个线程进行垃圾回收,一般与CPU数量相等

-XX:+UseParallelOldGC

指定老年代为并行收集

-XX:+UseConcMarkSweepGC

CMS收集器(并发收集器)

-XX:+UseCMSCompactAtFullCollection

开启内存空间压缩和整理,防止过多内存碎片

查看网上说都是内存的1/2

#还有很多的参数,我也不甚了解,就不写了

https://www.cnblogs.com/grefr/p/6089153.html

3.配置共享线程池

vim /home/tomcat8/conf/server.xml

<!--The connectors can use a shared executor, you can define one or more named thread pools-->

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"

        maxThreads="1000" minSpareThreads="100"/>

把这坨代码的注释去掉,这里启用tomcatThreadPool,并且定义maxThreads="1000" minSpareThreads="100"最大1000个线程,最小空闲线程200

<!--<Connector port="8080" protocol="HTTP/1.1"

              connectionTimeout="20000"

              redirectPort="8443" />-->

    <!-- A "Connector" using the shared thread pool-->

然后把默认这坨代码给注释掉,把下面的代码取消注释

    <Connector executor="tomcatThreadPool"

              port="8081" protocol="org.apache.coyote.http11.Http11AprProtocol"

              connectionTimeout="20000"

              redirectPort="8443" />

如果你配置了APR,记得把协议改成APR,然后保存,重启tomcat 这样一来 就优化了并发性能和使用了共享线程池

(据我线上的情况是日志里是200个线程循环使用1-200,然后又从1开始)

4.访问日志配置接口请求处理时间

这个好处在于分析代码中接口请求处理时间,比如反映网站打开慢,那么我们可以通过查看访问日志的接口请求处理时间,观察哪个接口的时间长,把锅甩给开发

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

              prefix="localhost_access_log" suffix=".txt"

              pattern="%h %l %u %t "%r" %s %b %D" />


%D显示为毫秒

%T显示为秒

一般配置为%D毫秒

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

prefix="localhost_access_log" suffix=".txt"

pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %q %{User-Agent}i %T" resolveHosts="false"/>

5.tomcat日志切割

就是切割catalina.out 默认这个是不切割的,这样问题是日志越来越大,不好管理,所以我们要切割一下,我的例子是一天一个日志

wget https://files.cnblogs.com/files/crazyzero/cronolog-1.6.2.tar.gz

rpm -ivh cronolog-1.6.2.rpm

which

/usr/sbin/cronolog

做之前,把catalina.sh给复制一份做个备份

cp catalina.sh catalina.sh.bak

vim catalina.sh

第一步:

if [ -z "$CATALINA_OUT" ] ; then

  CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out

fi

修改为

if [ -z "$CATALINA_OUT" ] ; then

  CATALINA_OUT="$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out

fi

第二步:

touch "$CATALINA_OUT"

修改为

#touch "$CATALINA_OUT"

第三步:

org.apache.catalina.startup.Bootstrap "$@" start \

>> "$CATALINA_OUT" 2>&1 "&"

修改为

org.apache.catalina.startup.Bootstrap "$@" start 2>&1 \

| /usr/sbin/cronolog "$CATALINA_OUT" >> /dev/null &  改上下两处

重启tomcat,这就齐了

6.配置tomcat隐藏版本号

为了避免木马病毒针对某些版本进行攻击,因此我们需要隐藏或者伪装 Tomcat 的版本信息。针对该信息的显示是由一个jar包控制的,该jar包存放在 Tomcat 安装目录下的lib目录下,名称为 catalina.jar

cd /home/apache-tomcat-8.5.27/lib

unzip catalina.jar

进入org/apache/catalina/util 编辑配置文件ServerInfo.properties字段来实现来更改我们tomcat的版本信息

cd org/apache/catalina/util

vim ServerInfo.properties

server.info=Apache Tomcat

server.number=

server.built=

将修改后的信息压缩回jar包

cd /home/apache-tomcat-8.5.27/lib

jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties

重启tomcat

7.配置tomcat开机自启动

注:需要catalina.sh里配置JAVA_HOME,CATALINA_HOME 不然会报错

vim /home/tomcat8/bin/catalina.sh

CATALINA_HOME=/home/apache-tomcat-8.5.27

JAVA_HOME=/home/jdk1.8.0_181

直接在最前边添加即可

#测试的时候没有添加修改JAVA_HOME 和 CATALINA_HOME用systemctl 也可以用暂时没发现问题

vim /usr/lib/systemd/system/tomcat.service

[Unit] 

Description=Tomcat

After=syslog.target network.target remote-fs.target nss-lookup.target 

[Service] 

Type=forking 

ExecStart=/home/tomcat/bin/startup.sh

ExecReload=/home/tomcat/bin/startup.sh

ExecStop=/home/tomcat/bin/shutdown.sh

[Install]

WantedBy=multi-user.target

然后你就可以用下面的命令了

systemctl start tomcat

systemctl enable tomcat

8.配置tomcat禁用(修改)8005端口

telnet localhost 8005 然后输入 SHUTDOWN 就可以关闭 Tomcat,为了安全我们要修改(修改下8005端口)该功能

默认值:

<Server port="8005" shutdown="SHUTDOWN">

修改为:

<Server port="port" shutdown="SHUTDOWN">

#注意,网上写的是改成-1 问题是这样会导致无法关闭到tomcat,所有我觉得还是改个端口吧。这一条还是谨慎使用

9.修改tomcat项目目录和支持热部署

tomcat默认发布项目是http://ip:port/你的项目名称。

但是有的时候开发需要直接访问到项目,不要后边加上项目名称,比如直接用java开发,直接用tomcat部署发布的网站

方法一

比较简单的办法 先把tomcat给启动起来,然后删除webapps下的ROOT这个目录,把你的项目(可能是个war包)改名为ROOT

再把war包给删除,然后重启下tomcat

rm -rf webapps/ROOT

mv project ROOT

rm -rf project.war

sh bin/shutdown.sh

sh bin/startup.sh

这样就行了

方法二

修改server.xml,直接指定项目目录,就行了。这里还有一个问题,开发在项目开发过程中,经常要改动JAVA/JSP 文件,但是又不想从新启动服务器(服务器从新启动花时间),想直接获得(debug)结果

所有需要运维给他开启热部署,热加载

那么需要这样配置

vim /home/tomcat8/conf/server.xml

找下这块儿配置

<Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true">

        <Context debug="0" docBase="/home/tomcat/webapps/ROOT" path="" privileged="true" reloadable="true"/>

热加载: 在server.xml -> context 属性中 设置 reloadable="true"

热部署: 在server.xml -> context 属性中 设置 autoDeploy="true"

项目发布目录: 在server.xml docBase="/home/tomcat/webapps/ROOT"

#注意 这样就可以指定项目的发布目录,我这个项目是把ROOT里的东西给删除了,然后把项目包的东西塞进ROOT目录里边。通过一个脚本实现的。

脚本如下

#脚本的意思是就是从腾讯云COS上,把war包给下载下来,然后解压,然后给塞进webapps/ROOT/里面去,你可以再配合ansible scripts模块实现批量发布,我之前用ansible一下发布9台tomcat

vim autoDeploy.sh

####################JUST AS YOU NEED###########################

outdir=ROOT

tomcat_home=/home/tomcat

#################### DO NOT MODIFY ##################################

webapp_dir=${tomcat_home}/webapps

if [ -z $1 ]; then

  echo 'enter the url: '

  read url

else

  url=$1

fi

fname=`basename $url`

echo $fname

wget $url -P /tmp

rm -rf $webapp_dir/$outdir/*

unzip -q /tmp/$fname -d $webapp_dir/$outdir

rm -f /tmp/$fname

jid=`ps -ef | grep java | grep -v grep | awk '{print $2}'`

kill -9 $jid

#nohup $tomcat_home/bin/startup.sh >> /dev/null

$tomcat_home/bin/startup.sh

day=`date +%Y-%m-%d`

catalinaLog="catalina."$day".log"

/home/apps_deploy/tomcat_action.log

tail -f ${tomcat_home}/logs/${catalinaLog}

这货运行就是 sh autoDeploy.sh 后边指向COS下的war包的URL

生产实例配至说明

#server.xml配置文件下:

[root@tomcat1 ~]# vim /usr/local/tomcat8/conf/server.xml

# <Connector executor="tomcatThreadPool"下面添加:

port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"

maxThreads="1000"

minSpareThreads="100"

maxSpareThreads="200"

acceptCount="1000"

disableUploadTimeout="true"

connectionTimeout="20000"

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" />

#参数说明:

org.apache.coyote.http11.Http11NioProtocol:调整工作模式为Nio

maxThreads:最大线程数,默认150。增大值避免队列请求过多,导致响应缓慢。

minSpareThreads:最小空闲线程数。

maxSpareThreads:最大空闲线程数,如果超过这个值,会关闭无用的线程。

acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。

disableUploadTimeout:禁用上传超时时间

connectionTimeout:连接超时,单位毫秒,0代表不限制

URIEncoding:URI地址编码使用UTF-8

enableLookups:关闭dns解析,提高响应时间

compression:启用压缩功能

compressionMinSize:最小压缩大小,单位Byte

compressableMimeType:压缩的文件类型

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • 在tomcat/catalina.sh中加入下面的配置,内存要根据机器实际情况配置,如果配置内存太大了有可能机器很...
    sherlock_6981阅读 13,430评论 0 6
  • 工作中项目的原因,项目云上贵州服务器有时候支撑不起太高的并发量,而且又没那么快更换更优的服务器,所以只能从tomc...
    He_Yifeng阅读 3,214评论 0 2
  • 1 目录结构 /bin:脚本文件目录。 /common/lib:存放所有web项目都可以访问的公共jar包(使用C...
    SkTj阅读 3,638评论 0 3
  • Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不...
    hangba843阅读 755评论 0 1
  • 转自陈明乾的博客,可能有一定更新。 转原文声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 ...
    LUNJINGJIE阅读 3,974评论 1 33