技能目标:
- 了解 Tomcat
- 熟悉 Tomcat 多虚拟主机环境
8.1 Tomcat
概述
自
2017
年
11
月编程语言排行榜
Java
占比
13%
,高居榜首,
Tomcat
也一度成为
Java
开发人员的首选。其开源、占用系统资源少、跨平台等特性深受广大程序员喜爱。本章主要
学习如何部署
Tomcat
服务,根据生产环境实现多个虚拟主机的配置,最后的重点是进行压
测,根据压测结果如何优化
Tomcat
服务及常见的内存溢出如何处理。
8.1.1 Tomcat
介绍
自从
JSP
发布之后,推出了各式各样的
JSP
引擎。
Apache Group
在完成
GNUJSP1.0
的开发以后,开始考虑在
SUN
的
JSWDK
基础上开发一个可以直接提供
Web
服务的
JSP
服务器,当然同时也支持
Servlet,
这样
Tomcat
就诞生了。
Tomcat
是
Apache
软件基金会(
Apache Software Foundation
)
Jakarta
项目中的一
个核心项目,由
Apache
、
Sun
和其他一些公司及个人共同开发而成。其被
JavaWorld
杂
志的编辑选为
2001
年度最具创新的
Java
产品,同时它又是
Sun
公司官方推荐的
Servlet
和
JSP
容器,因此
Tomcat
越来越多的受到软件公司和开发人员的喜爱。由于有了
Sun
的
参与和支持,最新的
Servlet
和
JSP
规范总是能在
Tomcat
中得到体现,
Tomcat 5
支持最
新的
Servlet 2.4
和
JSP 2.0
规范。因为
Tomcat
技术先进、性能稳定、免费,因而深受
Java
爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的
Web
应用服务器。
Tomcat
服务器是一个免费的开放源代码的
Web
应用服务器,属于轻量级应用服务器,
在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试
JSP
程序的首
选。对于一个初学者来说,可以这样认为,当在一台机器上配置好
Apache
服务器,可利
用它响应
HTML
(标准通用标记语言下的一个应用)页面的访问请求。实际上,
Tomcat
是
Apache
服务器的扩展,但运行时它是独立运行的,所以当运行
Tomcat
时,它实际上作为
一个与
Apache
独立的进程单独运行的。
当配置正确时,
Apache
为
HTML
页面服务,而
Tomcat
实际上运行
JSP
页面和
Servlet
。
Tomcat
和
IIS
等
Web
服务器一样,具有处理
HTML
页面的功能,另外它还是一
个
Servlet
和
JSP
容器,独立的
Servlet
容器是
Tomcat
的默认模式。不过,
Tomcat
处理静
态
HTML
的能力不如
Apache
服务器。
8.1.2 Tomcat
核心组件
通常意义上的
Web
服务器接受请求后,只是单纯地响应静态资源(如
HTML
文件、图
片文件等),不能在后端进行一定的处理操作。
Tomcat
是
Apache
下的一个子项目,它具
备
Web
服务器的所有功能,不仅可以监听接受请求并响应静态资源,而且可以在后端运行
特定规范的
Java
代码
Servlet
,同时将执行的结果以
HTML
代码的形式返回客户端。
Tomcat
由一系列的组件构成,其中核心的组件有三个。
?
Web
容器:完成
Web
服务器的功能。
?
Servlet
容器:名字为
catalina
,用于处理
Servlet
代码。
?
JSP
容器:用于将
JSP
动态网页翻译成
Servlet
代码。
8.1.3 Tomcat
请求处理
Tomcat
具体的处理请求过程如下所示。
?
用户在浏览器中输入网址
localhost:8080/test/index.jsp
,请求被发送到本机端口
8080
,
被在那里监听的
Coyote HTTP/1.1 Connector
获得;
?
Connector
把该请求交给它所在的
Service
的
Engine
(
Container
)来处理,并等待
Engine
的回应;
?
Engine
获得请求
localhost/test/index.jsp
,匹配所有的虚拟主机
Host
;
?
Engine
匹配到名为
localhost
的
Host
(即使匹配不到也把请求交给该
Host
处理,因为
该
Host
被 定 义 为 该
Engine
的 默 认 主 机 ) , 名 为
localhost
的
Host
获 得 请 求
/test/index.jsp
,匹配它所拥有的所有
Context
。
Host
匹配到路径为
/test
的
Context
(如
果匹配不到就把该请求交给路径名为
“ ”
的
Context
去处理);
?
path=“/test”
的
Context
获得请求
/index.jsp
,在它的
mapping table
中寻找出对应的
Servlet
。
Context
匹配到
URL Pattern
为
*.jsp
的
Servlet
,对应于
JspServlet
类;
?
构造
HttpServletRequest
对象和
HttpServletResponse
对象,作为参数调用
JspServlet
的
doGet()
或
doPost(),
执行业务逻辑、数据存储等;
?
Context
把执行完之后的
HttpServletResponse
对象返回给
Host
;
?
Host
把
HttpServletResponse
对象返回给
Engine
;
?
Engine
把
HttpServletResponse
对象返回
Connector
;
?
Connector
把
HttpServletResponse
对象返回给客户
Browser
。
8.2 Tomcat
服务部署
8.2.1
下载并安装
JDK
在部署
Tomcat
之前必须安装好
JDK
,因为
JDK
是
Tomcat
运行的必要环境。
JDK
的
安装相对比较简单,版本有很多,本章选择基于
linux64
位
RPM
版本。
下载完安装包后,将其上传到服务器
/root
目录下,执行安装命令。
[root@zw ~]# rpm -ivh jdk-8u171-linux-x64.rpm
上面显示安装完成,
jdk
安装目录在
/usr/java/jdk1.8.0_171-amd64
,,编辑
/etc/profile
文件,设置
jdk
的环境变量。具体操作如下。
[root@zw ~]# vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
[root@zw ~]# source /etc/profile
[root@zw ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
[root@zw ~]#
8.2.2
安装启动
Tomcat
1.
安装
Tomcat
服务
从
Tomcat
官网下载
apache-tomcat-9.0.8.tar.gz
稳定版本,将安装包解压后移动
Tomcat
目录到
/usr/local
下面,然后执行
/usr/local/tomcat/bin/startup.sh
命令启动
Tomcat
即可。具
体操作如下。
[root@zw ~]# tar zxf apache-tomcat-9.0.8.tar.gz
[root@zw ~]# mv apache-tomcat-9.0.8 /usr/local/tomcat
[root@zw ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_171-ams64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@zw ~]#
浏览器打开
http://192.168.248.78:8080
进行访问会出现
Tomcat
主页
2.
优化
Tomcat
服务启动时间
查看日志会发现
Tomcat
第一次启动很慢,默认情况下都需要几十秒。修改
JDK
参数
可以改善该状况,打开
/usr/java/jdk1.8.0_171-amd64/jre/lib/security/java.security
文件,找
到 如 下 内 容?
securerandom.source=file:/dev/random 修 改 成 securerandom.source=file:/dev/urandom。然后重启 Tomcat
就会发现启动时间变短很多。
[root@zw ~]# vim /usr/java/jdk1.8.0_171-amd64/jre/lib/security/java.security
securerandom.source=file:/dev/urandom
[root@zw ~]# /usr/local/tomcat/bin/shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_171-amd64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@zw ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_171-amd64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@zw ~]#
3. Tomcat
目录结构
执行
ll /usr/local/tomcat/
命令即可查看
Tomcat
安装后目录结构
[root@zw ~]# ll /usr/local/tomcat/
总用量 92
drwxr-x--- 2 root root 4096 1月 11 09:44 bin
drwx------ 3 root root 254 1月 11 09:53 conf
drwxr-x--- 2 root root 4096 1月 11 09:44 lib
-rw-r----- 1 root root 57092 4月 28 2018 LICENSE
drwxr-x--- 2 root root 197 1月 11 09:53 logs
-rw-r----- 1 root root 1804 4月 28 2018 NOTICE
-rw-r----- 1 root root 6852 4月 28 2018 RELEASE-NOTES
-rw-r----- 1 root root 16246 4月 28 2018 RUNNING.txt
drwxr-x--- 2 root root 30 1月 11 09:44 temp
drwxr-x--- 7 root root 81 4月 28 2018 webapps
drwxr-x--- 3 root root 22 1月 11 09:53 work
[root@zw ~]#
Tomcat
各目录的作用具体如下所示。
?
bin
目录:用于存放启动和关闭
Tomcat
的脚本文件,比较常用的是
catalina.sh
、
startup.sh
、
shutdown.sh
三个文件。
?
conf
目录:用于存放
Tomcat
服务器的各种配置文件,比较常用的是
server.xml
、
context.xml
、
tomcat-users.xml
、
web.xml
四个文件。
?
lib
目录:用于存放
Tomcat
服务器的
jar
包,一般不作任何改动,除非连接第三方服务,
比如
redis
,那就需要添加相对应的
jar
包。
?
logs
目录:用于存放
Tomcat
日志。
?
temp
目录:用于存放
Tomcat
运行时产生的文件。
?
webapps
目录:用于存放项目资源的目录。
?
work
目录:是
Tomcat
工作目录,一般清除
Tomcat
缓存的时候会使用到。
8.3 Tomcat
配置与优化
8.3.1
虚拟主机配置
很多时候公司会有多个项目需要运行,那么肯定不可能是一台服务器上运行多个
Tomcat
服务,这样会消耗太多的系统资源。此时,就需要使用到
Tomcat
虚拟主机。例如
现在新增两个域名
www.test.com
和
bbs.test.com
,希望通过这两个域名访问到不同的项目
内容。
1.
创建
www
和
bbs
项目目录和文件
执行下面的命令,可以创建
www
和
bbs
项目目录和文件。
[root@zw ~]# mkdir /usr/local/tomcat/webapps/www
[root@zw ~]# echo "This is www page\!"> /usr/local/tomcat/webapps/www/index.jsp
[root@zw ~]# mkdir /usr/local/tomcat/webapps/bbs
[root@zw ~]# echo "This is bbs page\!"> /usr/local/tomcat/webapps/bbs/index.jsp
[root@zw ~]#
2.
修改
Tomcat
主配置文件
修改
Tomcat
主配置文件
/usr/local/tomcat/conf/server.xml
,在
</Host>
下面增加如下内
容。
[root@zw ~]# vim /usr/local/tomcat/conf/server.xml
<Host name="www.test.com" appBase="/usr/local/tomcat/webapps"
unpackWARs="true" autoDeploy="true" xmIValidation="false"
xmINamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/www"
path="" reloadable="true"/>
</Host>
<Host name="bbs.test.com" appBase="/usr/local/tomcat/webapps"
unpackWARs="true" autoDeploy="true" xmIValidation="false"
xmINamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/bbs"
path="" reloadable="true"/>
</Host>
[root@zw ~]# /usr/local/tomcat/bin/shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_171-amd64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@zw ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_171-amd64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@zw ~]#
3.
虚拟主机访问测试
客户端绑定两个域名需要写入本机
hosts
,
Tomcat
默认端口是
8080
。
8.3.2 Tomcat
优化
Tomcat
默认安装下的缺省配置并不适合生产环境,它会频繁出现假死现象需要重启,
只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面,分别为操作系
统优化(内核参数优化),
Tomcat
配置文件参数优化,
Java
虚拟机(
JVM
)调优。其中
最难理解的就是
JVM
调优。系统优化本章不介绍,本章将配合
jmeter
压测工具进行调优前
和调优后的数据进行比较。
1. Tomcat
配置文件参数优化
关于
Tomcat
主配置文件
server.xml
里面很多默认的配置项,并不能满足业务需求,常
用的优化参数如下。
?
maxThreads
:
Tomcat
使用线程来处理接收的每个请求,这个值表示
Tomcat
可创建的
最大的线程数,默认值是
200
。
?
minSpareThreads
:最小空闲线程数,
Tomcat
启动时的初始化线程数,表示即使没有
人使用也开这么多空线程等待,默认值是
10
。
?
maxSpareThreads
:最大备用线程数,一旦创建的线程超过这个值,
Tomcat
就会关闭
不再需要的
socket
线程。默认值是
-1
(无限制),一般不需要指定。
?
URIEncoding
:指定
Tomcat
容器的
URL
编码格式,
Tomcat
语言编码格式这块不如
其它
Web
服务器软件配置方便,需要分别指定。
?
connnectionTimeout
:网络连接超时,单位:毫秒,设置为
0
表示永不超时,这样设置
有隐患的。通常默认
20000
毫秒就可以。
?
enableLookups
:是否反查域名,以返回远程主机的主机名,取值为:
true
或
false
,
如果设置为
false
,则直接返回
IP
地址,为了提高处理能力,应设置为
false
。
?
disableUploadTimeout
:上传时是否使用超时机制。应设置为
true
。
?
connectionUploadTimeout
:上传超时时间,毕竟文件上传可能需要消耗更多的时间,
该参数需要根据自己的业务需要自行调整,以使
Servlet
有较长的时间来完成它的执行,
需要与上一个参数一起配合使用才会生效。
?
acceptCount
:指定当所有可以使用的处理请求的线程都被使用时,可传入连接请求的
最大队列长度,超过这个数的请求将不予处理,默认为
100
个。
?
compression
:是否对响应的数据进行
GZIP
压缩,
off
表示禁止压缩、
on
表示允许压
缩(文本将被压缩)、
force
表示所有情况下都进行压缩,默认值为
off
。压缩数据后可
以有效的减少页面的大小,一般可以减小
1/3
左右,因而节省带宽。
?
compressionMinSize
:表示压缩响应的最小值,只有当响应报文大小大于这个值的时
候才会对报文进行压缩,如果开启了压缩功能,默认值就是
2048
。
?
compressableMimeType
:压缩类型,指定对哪些类型的文件进行数据压缩。
?
noCompressionUserAgents="gozilla, traviata"
:对于以下的浏览器,不启用压缩。
如果已经对代码进行了动静分离,静态页面和图片等数据就不需要
Tomcat
处理了,那
么也就不需要在
Tomcat
中配置压缩了。因为这里只有一台
Tomcat
服务器,而且压测的是
Tomcat
首页,会有图片和静态资源文件,所以这里启用压缩。