tomcat的优化

Posted 透明车窗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tomcat的优化相关的知识,希望对你有一定的参考价值。

一、tomcat官网:  http://tomcat.apache.org/whichversion.html

 二、相关介绍

1、tomcat:java容器、web容器(web应用服务器),web中间件

2、同类产品:Resin,JBOSS,WebSphere(IBM),Weblogic(Oracle )

3、Tomcat是Apache 软件基金会Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。

4、jdk下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html

5、jspgou下载: http://bbs.jeecms.com/fabu/62873.jhtml

6、tomcat需要java环境,jdk包含了jre和jvm

7、tomcat一键安装脚本

#cat install_tomcat_for_centos.sh 
#!/bin/bash
. /etc/init.d/functions
DIR=`pwd`
JDK_FILE="jdk-8u241-linux-x64.tar.gz"
TOMCAT_FILE="apache-tomcat-8.5.50.tar.gz"
JDK_DIR="/usr/local"
TOMCAT_DIR="/usr/local"

install_jdk(){
if !  [  -f "$DIR/$JDK_FILE" ];then
    action "$JDK_FILE 文件不存在" false 
    exit; 
elif [ -d $JDK_DIR/jdk ];then
        action "JDK 已经安装" false
    exit
else 
        [ -d "$JDK_DIR" ] || mkdir -pv $JDK_DIR
fi
tar xvf $DIR/$JDK_FILE  -C $JDK_DIR
cd  $JDK_DIR && ln -s jdk1.8.* jdk 

cat >  /etc/profile.d/jdk.sh <<EOF
export JAVA_HOME=$JDK_DIR/jdk
export JRE_HOME=\\$JAVA_HOME/jre
export CLASSPATH=\\$JAVA_HOME/lib/:\\$JRE_HOME/lib/
export PATH=\\$PATH:\\$JAVA_HOME/bin
EOF
.  /etc/profile.d/jdk.sh
java -version && action "JDK 安装完成" || { action "JDK 安装失败" false ; exit; }

}

install_tomcat(){
if ! [ -f "$DIR/$TOMCAT_FILE" ];then
        action "$TOMCAT_FILE 文件不存在" false 
    exit; 
elif [ -d $TOMCAT_DIR/tomcat ];then
        action "TOMCAT 已经安装" false
    exit
else 
    [ -d "$TOMCAT_DIR" ] || mkdir -pv $TOMCAT_DIR
fi
tar xf $DIR/$TOMCAT_FILE -C $TOMCAT_DIR
cd  $TOMCAT_DIR && ln -s apache-tomcat-*/  tomcat
echo "PATH=$TOMCAT_DIR/tomcat/bin:"\'$PATH\' > /etc/profile.d/tomcat.sh
id tomcat &> /dev/null || useradd -r -s /sbin/nologin tomcat

cat > $TOMCAT_DIR/tomcat/conf/tomcat.conf <<EOF
JAVA_HOME=$JDK_DIR/jdk
JRE_HOME=\\$JAVA_HOME/jre
EOF

chown -R tomcat.tomcat $TOMCAT_DIR/tomcat/

cat > /lib/systemd/system/tomcat.service  <<EOF
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target 

[Service]
Type=forking
EnvironmentFile=$TOMCAT_DIR/tomcat/conf/tomcat.conf
ExecStart=$TOMCAT_DIR/tomcat/bin/startup.sh
ExecStop=$TOMCAT_DIR/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now tomcat.service
systemctl is-active tomcat.service &> /dev/null &&  action "TOMCAT 安装完成" || { action "TOMCAT 安装失败" false ; exit; }

}

install_jdk

install_tomcat

三、安装部署电商系统

1、配置java环境,

# bash  /usr/local/tomcat/bin/startup.sh (只能通过启动脚本来启动)

2、重要配置文件:(路径是自己配置的,不唯一)

   /usr/local/tomcat/logs/catalina.out (日志文件)

   /usr/local/tomcat/bin/* (存放tomcat管理脚本)

   /usr/local/tomcat/conf/server.xml (配置文件目录,修改默认端口就在这里) 

3、安装mysql导入jspgou数据错误(mariadb则不会报错)

解决办法:修改my.cnf,

[mysqld] 下面添加
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
explicit_defaults_for_timestamp=1

4、http://192.168.40.129:8080/jeeadmin/jspgou/index.do 当访问网页的时候一直报500错误,查看tomca日志如下:

 折腾了一个小时,最后重启好了,不知为啥(表示之前也重启了好几遍没用)

5、访问成功

6、多实例站点

 四、tomcat优化(重点)

可以考虑从内存,并发,缓存,安全,网络,系统等进行入手

#tomcat 运行环境介绍

1.tomcat本身无法直接在计算机上运行,需要依赖硬件基础上的操作系统和Java虚拟机;
2.Java 程序启动时JVM都会分配一个初始内存和最大内存给这个应用;
3.当应用程序用到最大内存的时刻,就会触发JVM做垃圾回收(GC)动作,释放被占用的内存;
4.因此想要调整Java程序启动时的初始内存和最大内存,需要向JVM申请;
5.如果初始内存大小设置过小,且此时初始化的应用对象过多,虚拟机就必须重复的加载内存来满足使用;
6.基于以上原因,最好把初始内存大小(Xms)和最大内存(Xmx)设置成一样;
7.JVM上所有的对象都在"""堆区(heap)"""上分配内存(也有在"栈"上分配内存的)
8.堆区的大小是可以动态扩展的,但"""堆"""的大小受限于系统使用的物理内存,当应用程序需要的内存超出"堆"的最大值时,JVM虚拟机就会抛出内存溢出异常,并且导致应用程序奔溃;
9.基于以上原因,建议“堆”的大小设置成物理内存的80%

1、tomcat启动慢(生成随机数的时候卡住了,导致tomcat启动不了)

#vim $JAVA_HOME/jre/lib/security/java.security

securerandom.source=file:/dev/random  改为  securerandom.source=file:/dev/urandom

2、IO优化

(BIO、NIO、APR三种运行模式,NIO方式适用于连接数目多且连接比较短)

NIO模型是内置的,调用很方便,只需要将配置文件中protocol修改成 org.apache.coyote.http11.Http11NioProtocol

 3、tomcat内存优化

主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 java_OPTS 参数。

vim  /usr/local/tomcat/bin/catalina.sh

JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’ 对于服务器内存2G来说

-server:启用 JDK的 server 版本;
-Xms:Java虚拟机初始化时堆的最小内存,一般与 Xmx配置为相同值,这样的好处是GC不必再为扩展内存空间而消耗性能;
-Xmx:Java虚拟机可使用堆的最大内存;
-XX:PermSize:Java虚拟机永久代大小(内存永久保留区域);
-XX:MaxPermSize:Java虚拟机永久代大小最大值(内存最大永久保留区域);

配置完成后可重启Tomcat ,通过以下命令进行查看配置是否生效:
假如查看到Tomcat 进程号是 15242 。 

查看是否配置生效:

sudo jmap – heap 15242

4、Connector 连接器的优化(相当于并发优化) 

#vim  /usr/local/tomcat/conf/server.xml

优化前:

 优化后:(推荐https://www.cnblogs.com/xwjb/articles/8302960.html)

<Connector port="9027"
  protocol="HTTP/1.1"
  maxHttpHeaderSize="8192"
  minProcessors="100"
  maxProcessors="1000"
  acceptCount="1000"
  redirectPort="8443"
  disableUploadTimeout="true"/>

maxThreads 客户请求最大线程数   

minSpareThreads Tomcat初始化时创建的 socket 线程数   

maxSpareThreads Tomcat连接器的最大空闲 socket 线程数   

enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名   

redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口   

acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )   

connectionTimeout 连接超时   

minProcessors 服务器创建时的最小处理线程数   

maxProcessors 服务器同时最大处理线程数   

URIEncoding URL统一编码

5、缓存优化

打开tomcat的压缩功能;tomcat的压缩优化就是将返回的html页面等内容经过压缩,压缩成gzip格式之后,发送给浏览器,浏览器在本地解压缩的过程。

<Connector port="9027"
  protocol="HTTP/1.1"
  maxHttpHeaderSize="8192"
  maxThreads="1000"
  minSpareThreads="100"
  maxSpareThreads="1000"
  minProcessors="100"
  maxProcessors="1000"
  enableLookups="false"
  compression="on"
  compressionMinSize="2048"
  compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
  connectionTimeout="20000"
  URIEncoding="utf-8"
  acceptCount="1000"
  redirectPort="8443"
  disableUploadTimeout="true"/>

●compression="on" 打开压缩功能

●compressionMinSize="2048"启用压缩的输出内容大小,默认为2KB

●noCompressionUserAgents="gozilla,traviata" 对于以下的浏览器,不启用压缩

●compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些资源类型需要压缩

connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间

缓存策略:

开启浏览器的缓存,这样读取存放在webapps文件夹里的静态内容会更快,大大推动整体性能。

1)浏览器第一次请求tomcat服务器某资源
2)tomcat查询到该资源,并将该资源最后修改的时间保存在响应头的Last-Modified中 (Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT) 
3)浏览器第二次访问tomcat请求该资源,并将之前该资源的最后修改时间放入If-Modified-Since请求头中
4)服务器收到该请求,比较该请求中的If-Modified-Since与资源最后修改时间Last-Modified是否一致,如果一致则不向其发送该资源并向其发送响应代码304告诉其去本地取缓存。

6、开启线程池

<Connector executor="tomcatThreadPool"(如上图第一行)

 7、组件优化

打开conf/server.xml文件,修改Connector 标志的protocol属性:

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

8、安全优化

#降权启动

以普通用户启动tomcat,降权启动,防止不法分子通过tomcat获得root权限。

#修改端口号

修改tomcat配置文件server.xml中的全球人都知道的http连接器端口号,防止黑客攻击。

#更改关闭Tomcat的指令

这个端口是有安全隐患的,直接Telnet远程连接主机,输入shutdown即可关闭tomcat。shown端口是写在Server参数里的,直接去掉是不管用,也是会默认启动的,一般在安全设置时候建议把端口修改为其他端口,shutdown修改为其他复杂字串。实际上这个端口是可以直接屏蔽不监听的。设置时候将其port值修改为-1即可:

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

#修改管理员用户名,密码

修改tomcat-user.xml中默认的Manager用户名和密码

<?xml version=’1.0’ encoding=’utf-8’?>
                   <tomcat-users>
                       <role rolename=”manager”/>
                            <user username=”temobi” password=”temobi8090” roles=”manager”/>
                  </tomcat-users>

#清空站点目录下ROOT下管理页面等文件

ROOT下有一些站点的管理程序可以查看tomcat的各种信息及配置,因此我们需要清空这些文件或者将站点目录更改。

生产环境一般不适用Tomcat默认的管理界面,这些页面存放在Tomcat 的webapps安装目录下,把该目录下的所有文件删除即可:rm -rf  /usr/local/tomcat8/webapps/*

 9、其他优化

#错误页面优雅显示

#隐藏版本号

#禁用DNS查询

当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。

为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值改为

false:enableLookups="false"

#设置session过期时间

Tomcat采用数据库连接池技术,当用户在一定时间不对数据库有操作时间后,就自动关闭这个连接,这是为了更好的利用资源,防止浪费宝贵的数据库连接资源。

以下是设置session时间的3个方法:

 1. 在tomcat——>conf——>servler.xml文件中定义:
  <Context path="/test" docBase="/test"
  defaultSessionTimeOut="3600" isWARExpanded="true"
  isWARValidated="false" isInvokerEnabled="true"
  isWorkDirPersistent="false"/> 
  defaultSessionTimeOut="3600"
 2. 项目所在目录下的 web.xml中定义:
  <session-config>
  <session-timeout>20</session-timeout>
  </session-config>
 3. 在程序中定义:
  session.setMaxInactiveInterval(30*60);
  设置单位为秒,设置为-1永不过期

 

以上是关于tomcat的优化的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 反转句子中的每个单词需要对我的代码片段进行代码优化

如何优化C ++代码的以下片段 - 卷中的零交叉

从JVM的角度看JAVA代码--代码优化

Tomcat8优化--代码优化

Tomcat部署及优化

mysql jdbc源码分析片段 和 Tomcat's JDBC Pool