Tomcat介绍及性能优化

一、Tomcat 简单介绍:

Sun 公司创建了第一个 Servlet 容器,即 Java Web Server,但 JWS 只是为了演示 Servlet 的相应功能,所以其性能很不稳定。与此同时,apache 基金会组织(ASF)创建了 JServ 项目,一个能够与 apache 整合起来的 servlet 容器。1999 年,Sun 公司把 JWS 捐给了 ASF,于是两个项目合二为一,即今天 Tomcat 的前身。第一个 tomcat 版本是 Tomcat 3.x 系列,而发布于 2001 年 Tomcat4.0 则是在此前基础上进行了重新设计和实现,其代码项目被命名为 Catalina。

Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。

版本介绍:现在版本更新到 Apache Tomcat 8.x,但是 Apache Tomcat 7.x 是目前开发的焦点。Apache Tomcat 7.x 它在汲取了 Tomcat 6.0.x 优点的基础上,实现了对于 Servlet 3.0、JSP 2.2 和 EL 2.2 等特性的支持。

除此以外的改进列表如下:

· Web 应用内存溢出侦测和预防

· 增强了管理程序和服务器管理程序的安全性

· 一般 CSRF 保护

· 支持 web 应用中的外部内容的直接引用

· 重构 (connectors, lifecycle)及很多核心代码的全面梳理

二、tomcat 运行模式介绍:

Tomcat Connector(Tomcat 连接器)有 bio、nio、apr 三种运行模式,那么这三种运行模式有什么区别呢,我们又如何修改 Tomcat Connector 的运行模式来提高 Tomcat 的运行性能呢?

bio 模式:

bio(blocking I/O),顾名思义,即阻塞式 I/O 操作,表示 Tomcat 使用的是传统的 Java I/O 操作(即 java.io 包及其子包)。Tomcat 在默认情况下,就是以 bio 模式运行的。遗憾的是,就一般而言,bio 模式是三种运行模式中性能最低的一种。我们可以通过 Tomcat Manager 来查看服务器的当前状态。

1
2
3
4
5
6
7
[root@web conf]# cd /data/node1/conf/tomcat-users.xml 
[root@web conf]# vim tomcat-users.xml #添加进去两行代码,也就是新创建一个账号和密码。
<role rolename="manager-gui"/>
 <user username="tomcat" password="tomcat" roles="manager-gui"/>
添加之后,然后保存退出此文件。想让配置文件生效,需要重启下 tomcat。
[root@web conf]# /data/node1/bin/shutdown.sh 
[root@web conf]# /data/node1/bin/startup.sh

Tomcat 介绍及性能优化

 

点击 Server Status 查看下状态:

Tomcat 介绍及性能优化

nio 模式:

nio(new I/O),是 Java SE 1.4 及后续版本提供的一种新的 I/O 操作方式(即 java.nio 包及其子包)。Java nio 是一个基于缓冲区、并能提供非阻塞 I/O 操作的 Java API,因此 nio 也被看成是 non-blocking I/O 的缩写。它拥有比传统 I/O 操作(bio)更好的并发运行性能。要让 Tomcat 以 nio 模式来运行也比较简单,我们只需要在 Tomcat 安装目录/conf/server.xml 文件中将如下配置:

1
2
3
4
5
6
7
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
中的 protocol 属性值改为 org.apache.coyote.http11.Http11NioProtocol 即可:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />

此时,我们就可以在 Tomcat Manager 中看到当前服务器状态页面的 HTTP 协议的 Connector 运行模式已经从 http-bio-8080 变成了 http-nio-8080。

Tomcat 介绍及性能优化

apr 模式:

apr(Apache Portable Runtime/Apache 可移植运行时),是 Apache HTTP 服务器的支持库。你可以简单地理解为,Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高 Tomcat 对静态文件的处理性能。 Tomcat apr 也是在 Tomcat 上运行高并发应用的首选模式。如果我们的 Tomcat 不是在 apr 模式下运行,在启动 Tomcat 的时候,我们可以在日志信息中看到类似如下信息:

2013-8-6 16:17:49 org.apache.catalina.core.AprLifecycleListener init

信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: xxx/xxx(这里是路径信息)

Tomcat apr 运行模式的配置是三种运行模式之中相对比较麻烦的一种。据官方文档所述,Tomcat apr 需要以下三个组件的支持:

APR library[APR 库]

JNI wrappers for APR used by Tomcat (libtcnative)[简单地说,如果是在 Windows 操作系统上,就是一个名为 tcnative-1.dll 的动态链接库文件]

OpenSSL libraries[OpenSSL 库]

此外,与配置 nio 运行模式一样,也需要将对应的 Connector 节点的 protocol 属性值改为 org.apache.coyote.http11.Http11AprProtocol。 不过,上述繁琐的操作都是 Tomcat 7.0.30 之前的版本才需要这样配置,从 Tomcat 7.0.30 版本开始,Tomcat 已经自带了 tcnative-1.dll 等文件,并且默认就是在 Tomcat apr 模式下运行,因此我们只需要下载最新版本的 Tomcat 直接使用即可。

Tomcat 介绍及性能优化

 默认情况下是 bio 模式,介绍下怎么更换成 apr 模式:

1
2
3
4
5
6
[root@web]#yum install -y apr apr-util apr-devel
[root@web]# cd /data/node1/bin
[root@web bin]# tar -zxvf tomcat-native.tar.gz
[root@web bin]# cd tomcat-native-1.1.32-src/jni/native/
[root@web native]# ./configure --with-apr=/usr/bin/apr-1-config --with-ssl=/usr/include/openssl/
[root@web native]# make && make install

tomcat 和 apr 库整合,需要修改 shell 脚本文件 catalina.sh

1
2
3
4
5
6
[root@web node1]# vim /data/node1/bin/catalina.sh +99
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+DisableExplicitGC"  
cygwin=false
darwin=false
CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
os400=false

保存退出,重启 tomcat。看 tomcat 启动输出日志信息:

1
2
3
4
5
6
7
8
9
10
11
12
信息: Deploying web application directory /data/node1/webapps/host-manager
七月 10, 2015 6:42:19 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deployment of web application directory /data/node1/webapps/host-manager has finished in 156 ms
七月 10, 2015 6:42:19 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory /data/node1/webapps/examples
七月 10, 2015 6:42:21 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deployment of web application directory /data/node1/webapps/examples has finished in 1,490 ms
七月 10, 2015 6:42:21 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-apr-8080"]
七月 10, 2015 6:42:22 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 25191 ms
出现了["http-apr-8080"]字段,说明现在 tomcat 已经是 apr 模式。

三、下面介绍一下搭建 tomcat 服务器,所需的 jdk 环境变量:

Tomcat7.x 服务器搭建,请大家参看:http://taokey.blog.51cto.com/4633273/1615551

1
2
3
4
5
6
7
8
jdk 环境变量详解:
JAVA_HOME=/data/jdk1.7.0_71               #JAVA_HOME 环境变量,它是指向 jdk 的安装目录的绝对路径,当 JDK 路径改变的时候,仅需更改 JAVA_HOME 的变量值即可。
JRE_HOME=/data/jdk1.7.0_71/jre            #GRE_HOME 环境变量,它是指向 jre 的安装目录的绝对路径。
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin   # PATH 环境变量。作用是指定命令搜索路径,在 shell 下面执行命令时,它会到 PATH 变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把 jdk 安装目录下的 bin 目录增加到现有的 PATH 变量中,bin 目录中包含经常要用到的可执行文件如 javac/java/javadoc 等待,设置好 PATH 变量后,就可以在任何目录下执行 javac/java 等工具了。 
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib    #CLASSPATH 环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM 就是通过 CLASSPTH 来寻找类的。我们 需要把 jdk 安装目录下的 lib 子目录中的 dt.jar 和 tools.jar 设置到 CLASSPATH 中,当然,当前目录“.”也必须加入到该变量中。 
export JAVA_HOME JRE_HOME PATH CLASSPATH 
export PATH=$PATH:JAVA_HOME/bin
export JAVA_HOME

四、Tomcat 安全和性能优化。

  1. 安全优化,关闭服务器端口,修改默认的端口。

1).默认 tomcat 端口号是 8080,最好修改一下,配置文件在 server.xml 中。

server.xml 默认有下面一行:

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

这样允许任何人只要 telnet 到服务器的 8005 端口,输入"SHUTDOWN",然后回车,服务器立即就被关掉了。从安全的角度上考虑,我们需要把这个 shutdown 指令改成一个别人不容易猜测的字符串,可以同时把端口也改了。

2).8009 端口是 tomcat 和 apache 的 mod_proxy_ajp,mod_jk 沟通的端口,没用到就关了。在 tomcat 的配置文件 server.xml 中这段注释掉:

<!–

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    –>

2.tomcat 性能方面的优化:

1).1.优化 catalina.sh 配置文件。在 catalina.sh 配置文件中添加以下代码:

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"

server:一定要作为第一个参数,在多个 CPU 时性能佳

-Xms:初始 Heap 大小,使用的最小内存,cpu 性能高时此值应设的大一些

-Xmx:java heap 最大值,使用的最大内存

上面两个值是分配 JVM 的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。

-XX:PermSize:设定内存的永久保存区域

-XX:MaxPermSize:设定最大内存的永久保存区域

-XX:MaxNewSize:

-Xss 15120 这使得 JBoss 每增加一个线程(thread)就会立即消耗 15M 内存,而最佳值应该是 128K,默认值好像是 512k.

+XX:AggressiveHeap 会使得 Xms 没有意义。这个参数让 jvm 忽略 Xmx 参数,疯狂地吃完一个 G 物理内存,再吃尽一个 G 的 swap。

-Xss:每个线程的 Stack 大小

-verbose:gc 现实垃圾收集信息

-Xloggc:gc.log 指定垃圾收集日志文件

-Xmn:young generation 的 heap 大小,一般设置为 Xmx 的 3、4 分之一

-XX:+UseParNewGC :缩短 minor 收集的时间

-XX:+UseConcMarkSweepGC :缩短 major 收集的时间

关于 JVM 内存配置这里推荐几篇文章大家可以看下:

http://blog.chinaunix.net/uid-743704-id-2681326.html

http://www.open-open.com/lib/view/open1324736648468.html

***linux/tomcatnacunxiangjie__zhuanzaibufennarong_523821_1373809710.html

2).优化 tomcat 服务器中的 server.xml 配置文件,在配置文件中找到 Connector port="8080",然后做如下修改:

1
2
3
4
5
6
7
8
9
10
11
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"
               redirectPort="8443" 
               enableLookups="false"
               acceptCount="50"
               minProcessors="20"
               maxProcessors="200" 
               maxThreads="400"
               minSpareThreads="25"
               maxSpareThreads="75"
               URIEncoding="utf-8" />

参数详解:

connnectionTimeout: 网络连接超时,默认值 20000,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。(本系统由于与后台系统接口超时时间较长,使用设置为 60000) 

redirectPort: 如果 Connector 支持非 SSL 请求,在收到一个要求使用 SSL 传输的请求以后,Catalina 会自动将该请求重定向到这里指定的端口号。

enableLookups: 是否反查域名,默认值为 true。为了提高处理能力,应设置为 false 

acceptCount: 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值 10。

minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为 10

maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为 75

maxThreads: Tomcat 使用线程来处理接收的每个请求。这个值表示 Tomcat 可创建的最大的线程数。默认值 200。 可以根据机器的时期性能和内存大小调整,一般可以在 400-500。最大可以在 800 左右。  

minSpareThreads: Tomcat 初始化时创建的线程数。默认值 4。 

maxSpareThreads: 一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程。默认值 50。 

URIEncoding: URI 编码用于解码字节字符的格式,显示中文,使用 UTF-8 即可。

3).编写 tomcat 重启脚本,加入开机自启动。

1
2
3
4
5
6
7
8
9
10
11
12
13
more /etc/init.d/tomcat
#!/bin/bash
    # chkconfig: - 96 14
    # description: Tht Apache Tomcat Servlet/JSP container.
    #
    export JAVA_HOME=/data/jdk1.7.0_71
    export CATALINA_HOME=/data/tomcat
    exec /data/tomcat/bin/catalina.sh $*
chmod o+x /etc/init.d/tomcat
chkconfig --add tomcat
chkconfig node1 on
chkconfig --list node1 
node1           0:off   1:off   2:on    3:on    4:on    5:on    6:off

五,Tomcat 日志分割。

1.下载并安装 cronolog 软件。

1
2
3
4
5
6
7
cd /taokey/tools/
tar -zxf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2/
./configure
make && make install
which cronolog 
/usr/local/sbin/cronolog

2.修改 tomcat 的 catalina.sh 文件。

1
2
3
cd /data/node1/bin/
vim catalina.sh +373
touch "$CATALINA_OUT"

找到这行,注释掉,应该是在 373 行附近,

#touch "$CATALINA_OUT"

然后找到这两行,

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

修改成:

1
2
org.apache.catalina.startup.Bootstrap "$@" start 2>&1 |
/usr/local/sbin/cronolog "$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out >> /dev/null &

3.重启 tomcat 服务,查看生成的日志。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/etc/init.d/tomcat stop
ps -ef | grep java
/etc/init.d/tomcat start
tail -f /data/node1/logs/catalina.2015-10-26.out
Oct 26, 2015 2:19:47 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /data/node1
Oct 26, 2015 2:19:47 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory /data/node1 has finished in 143 ms
Oct 26, 2015 2:19:47 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Oct 26, 2015 2:19:47 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Oct 26, 2015 2:19:47 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1700 ms

这样就把 catalina.out 的日志按天分割了。今天是 10 月 26 就是 catalina.2015-10-26.out,10 月 27 日就是

catalina.2015-10-27.out,这样查找日志的时候,很方便快捷。


IT 敢客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Tomcat 介绍及性能优化
喜欢 (155)
[313176056@qq.com]
分享 (0)
IT敢客
关于作者:
“我所做的一切都是为了方便我的生活~~~“
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址