LEMON

记录站

0%

Tomcat

Tomcat个人笔记

一、Tomcat简介概述

1. Tomcat 历史由来

  • Tomcat 最初由 Sun 公司的软件架构师 James Duncan Davidson 开发,名称为 “JavaWebServer”。
  • 1999年,在 Davidson 的帮助下,该项目于1999年 于 apache软件基金会旗下的 JServ 项目合并,并发布第一个版本(3.x),即是现在的Tomcat,该版本实现了 Servlet2.2 和 JSP 1.1规范。
  • 2001年,Tomcat 发布了4.0版本,作为里程碑式的版本,Tomcat 完全重新设计了其架构,并实现了Servlet 2.3 和 JSP1.2 规范。
  • 目前Tomcat已经更新到9.0.x版本,但是目前企业中的Tomcat服务器 ,主流版本还是 7.x 和8.x 。

2. Tomcat基本简介

  • Tomcat是由java语言开发的,只要遇见java语言开发的软件包,就一定要提前安装JDK。因为java语言号称是一次编译,到处运行。(跨平台运行,且不会出现问题)

  • Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选。说白了用来解析 jsp 网页的

  • 与Tomcat功能类似的web软件

    1
    2
    3
    4
    5
    6
    7
    webLogic: oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费。

    webSphere: IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费。

    JBOSS: JBOSS公司的,大型的JavaE服务器,支持所有的JavaEE规范,收费。

    Tomcat: Apache基金组织,中小型的JavaEE服务器,支持少量的JavaEE规范servlet/jsp,开源。
  • Tomcat与其他开源的Web软件有什么不同点

    1
    2
    3
    4
    5
    Apache         #默认只能解析html的页面

    Nginx #默认只能解析html的页面

    Tomcat #默认也能解析html的页面,但远远不如以上两者,他主要的作用是能够解析.jsp页面,在公司,很多人把它称之为中间件。

二、Tomcat架构原理

1. HTTP工作原理

image-20200603234950940

2. Tomcat基本架构图

image-20200603230105779

3. Tomcat各目录及文件说明

整体目录 目录下文件 简单说明
bin / 存放 Tomcat的启动、停止等批处理脚本和Shell脚本
startup. bat 用于在 Windows下启动 Tomcat
startup. sh 用于在 Linux下启动 Tomcat
shutdown. bat 用于在 Windows下停止 Tomcat
shutdown. sh 用于在 Linux下停止 Tomcat
conf / 用于存放 Tomcat的相关配置文件
Catalina 用于存储针对每个虚拟机的 Context 配置目录
context.xml 用于定义所有Web应用均需要加载的 Context 配置,如果Web应用指定了自己的context.xml,那么该文件的配置将被覆盖。
catalina.properties Java属性的定义文件,用于设定类加载器路径等,以及一些JVM性能相关的调优参数
catalina.policy 当 Tomcat在安全模式下运行时,此文件为默认的安全策略配置
logging.properties Tomcat日志配置文件,可通过该文件修改 Tomcat日志级别以及日志路径等
server.xml Tomcat服务器核心配置文件,用于配置 Tomcat的链接器、监听端口、处理请求的虚拟主机等。
tomcat-users.xml 用于定义 Tomcat默认用户及角色映射信息,Tomcat的 Manager模块即用该文件中定义的用户进行安全认证。
web.xml Tomcat中所有应用默认的部署描述文件,主要定义了基础 ServletMIME映射。
logs / Tomcat默认的日志存放路径
catalina.out Tomcat的日志输出,只要Tomcat服务出问题,就看他
localhost_access.log.txt 客户端访问 Tomcat 服务的访问日志记录
localhost.log 程序(代码)异常没有被捕获的时候抛出了的地方
manager.log webapps/manager项目生成的日志
host-manager.log webapps/host-manager项目生成的日志
webapps / Tomcat默认的Web应用部署目录
lib / Tomcat服务器依赖库目录,包含 Tomcat服务器运行环境依赖 jar包
temp / 存放tomcat在运行过程中产生的临时文件
work / 存放Web应用JSP代码生成和编译后产生的class文件目录

三、Tomcat部署

1. 安装JDK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@tomcat ~]# tar xf jdk-8u181-linux-x64.tar.gz

[root@tomcat ~]# mv jdk1.8.0_181 /usr/local/java

[root@tomcat ~]# vim /etc/profile #添加JAVA环境变量
#JAVA_HOME
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
wq!

[root@tomcat ~]# source /etc/profile # 加载环境变量

[root@tomcat ~]# java -version #查看JDK版本,当出现版本信息时,表明安装成功
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

2. 安装 Tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@tomcat ~]# tar xf apache-tomcat-8.5.32.tar.gz

[root@tomcat ~]# mv apache-tomcat-8.5.32 /usr/local/tomcat

#在catalina.sh文件中添加如下两条配置
sed -i '1a # JDK' /usr/local/tomcat/bin/catalina.sh
sed -i '2a JAVA_HOME=/usr/local/java' /usr/local/tomcat/bin/catalina.sh

#备份主配置及删除配置文件注释
[root@tomcat ~]# cp /usr/local/tomcat/conf/server.xml /usr/local/tomcat/conf/server.xml.bak && perl -lne 'print unless (/<!--/../-->/)' /usr/local/tomcat/conf/server.xml.bak > /usr/local/tomcat/conf/server.xml && sed -i /^$/d /usr/local/tomcat/conf/server.xml

#启动tomcat服务
[root@tomcat ~]# /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/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

#检查Tomcat是否启动
[root@tomcat ~]# netstat -anptu|grep java
tcp6 0 0 :::8080 :::* LISTEN 26265/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 26265/java
tcp6 0 0 :::8009 :::* LISTEN 26265/java

#查看Tomcat日志信息
[root@tomcat ~]# tail -f /usr/local/tomcat/logs/catalina.out
03-Jun-2020 22:30:50.656 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
03-Jun-2020 22:30:50.662 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
03-Jun-2020 22:30:50.670 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 485 ms
  • Tomcat的三个端口及作用
    • 8005:这个端口负责 监听 关闭 Tomcat的请求
    • 8009:负责与其他web服务器进行通信的接口,用的是AJP协议
    • 8080:负责接收客户端的请求,用的是HTTP协议
  • 访问Tomcat测试页面

image-20200604003717938

默认是不让访问的服务器状态的

image-20200604004224065

怎么解决这个问题?配置tomcat管理员账户

  • 如果需要登录系统,必须配置 tomcat用户,在安装完 Tomcat后,进行如下操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#添加管理页面的用户认证,帐户名为tomcat,密码为123123
[root@tomcat ~]# vim /usr/local/tomcat/conf/tomcat-users.xml
#在<tomcat-users>区域中加入以下两个配置
<role rolename="manager-gui"/>
<user username="tomcat" password="123123" roles="manager-gui"/>
wq!

#默认tomcat的管理页面只能通过tomcat服务器上的浏览器才可以访问。**设置其可以在其他主机访问
[root@tomcat ~]# vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
20 allow=".*" /> #允许所有
wq!

#重启Tomcat
[root@tomcat ~]# /usr/local/tomcat/bin/shutdown.sh
[root@tomcat ~]# /usr/local/tomcat/bin/startup.sh

再来访问服务器状态

image-20200604004628772

image-20200604005737091

四、server.xml配置文件详解(重点)

1. 一个整体的 server.xml配置实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
</Engine>
</Service>
</Server>

2. server.xml文件的结构 和 元素

2.1. server.xml的整体结构如下:

1
2
3
4
5
6
7
8
9
10
11
<Server>
<Service>
<Connector />
<Connector />
<Engine>
<Host>
<Context /><!-- 现在常常使用自动部署,不推荐配置Context元素 -->
</Host>
</Engine>
</Service>
</Server>

上面只给出了Tomcat的核心组件,除了核心组件外,Tomcat还有一些其他组件,下面介绍组件的分类。

2.2. server.xml文件中的元素可以分四类

  • 顶层元素:<server> 和 </service>

    • <server> :元素是整个配置文件的根元素
    • </service> :元素则代表一个Engine元素以及一组与之相连的Connector元素
  • 连接器:<Connector />

    • <Connector />:代表了外部客户端发送请求到特定Service的接口;同时也是外部客户端从特定Service接收响应的接口。
  • 容器:<Engine><Host></Engine>

    • 容器的功能是处理Connector接收进来的请求,并产生相应的响应。而Engine、Host 和 Context 都是容器,但它们不是平行的关系,而是父子关系:Engine包含Host,Host包含Context。
    • 一个Engine组件可以处理Service中的所有请求,一个Host组件可以处理发向一个特定虚拟主机的所有请求,一个Context组件可以处理一个特定Web应用的所有请求。
  • 内嵌组件:可以内嵌到容器中的组件。

    • 实际上, Server 、Service 、Connector 、Engine 、Host 和Context 是最重要的最核心的Tomcat 组件,其他组件都可以归为内嵌组件。

2.3. server.xml元素

1. <Server>元素

  • Server 元素在最顶层,代表整个 Tomcat 容器,因此它必须是server.xml中唯一一个最外层的元素。 一个 Server 元素中可以有一个或多个Service 元素。
  • Server 的主要任务,就是提供一个接口让客户端能够访问到这个 Service 集合,同时维护它所包含的所有的Service的声明周期,包括如何初始化、如何结束服务、如何找到客户端要访问的Service。
1
<Server port="8005" shutdown="SHUTDOWN">
  • 参数作用:
    • 端口号8005:用来 监听 关闭 Tomcat服务的
    • port:指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令,该属性必须设置。
    • shutdown:指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串,该属性必须设置。

2. <service> 元素

  • 包含一个<Engine>元素,以及一个或多个<Connector>元素,这些<Connector>元素共享同一个<Engine>`元素。
  • Service 的作用是在Connector 和 Engine` 外面包了一层,把它们组装在一起,对外提供服务。
  • 一个 Service 可以包含多个 Connector,但是只能包含一个 Engine;其中 Connector 的作用是从客户端接收请求,Engine的作用是处理接收进来的请求。

3. <Connector>元素

  • 接收客户端连接请求,创建Request 和 Response 对象用于和请求端交换数据,然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine,通过配置Connector,可以控制请求Service的协议及端口号。
1
2
3
4
5
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  • 参数作用
    • 端口号8080:访问浏览器页面的时候使用8080端口;用的是HTTP协议
    • 端口号8009:连接Web服务(httpd、nginx)的时候使用8009端口;用的是AJP协议
    • port:服务端监听的端口号,即客户请求的端口号
    • protocol:规定了请求协议
    • redirectPort:表示当请求是https时,重定向至端口号为8443的Connector
    • connectionTimeout:表示连接的超时时间,单位毫秒
    • minSpareThreads:表示Connector最小等待客户请求的线程数,每个请求由一个线程负责,默认10。
    • maxThreads:表示此连接器要创建的请求处理线程的最大数量,能处理的最大并发请求数,默认200。
    • maxConnections:表示服务器在任何给定时间接受和处理的最大连接数。当达到这个数字时,客户端请求会被放到请求队列,默认最大队列数为acceptCount参数值,BIO模式下默认为maxThreads,NIO模式下默认10000。
    • acceptCount:maxConnections达到最大值即所有请求线程正在使用时,传入连接请求的最大队列长度, 当队列满时收到的任何请求都将被拒绝, 默认值为100。
    • maxHeaderCount:允许的请求中的最大header数。 包含比指定限制更多的header的请求将被拒绝。 小于0表示无限制,默认值100。

4. <Engine>元素

  • Engine组件在Service组件中有且只有一个,Engine是Service组件中的请求处理组件,Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端。
  • Engine、Host 和 Context 都是容器,但它们不是平行的关系,而是父子关系:Engine 包含 Host,Host 包含 Context。
1
<Engine name="Catalina" defaultHost="localhost">
  • 参数作用
    • name:属性用于日志和错误信息,在整个Server中应该唯一。
    • defaultHost:属性指定了默认的host名称,当发往本机的请求指定的host名称不存在时,一律使用defaultHost指定的host进行处理,因此defaultHost的值,必须与Engine中的一个Host组件的name属性值匹配。

5. Host元素

  • Engine元素至少包含一个或多个Host元素,每个Host元素定义了一个虚拟主机,它可以包含一个或多个Web应用,其中一个Host的name必须与Engine组件的defaultHost属性相匹配。
  • 另在<Host>元素中可以包含如下的子元素: <Logger>,<Realm>,<Valve>,<Context>`。
1
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
  • 参数作用
    • name:虚拟主机的名字。
    • appBase: 指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于的相对目录, 如果此项没有设定,默认值为/webapps。
    • unpackWARs: 如果此项设为true,表示将把Web应用的war文件先解压为开放目录结构后再运行,如果设为false,将直接运行war文件。
    • autoDeploy:如果此项设为true,表示当Tomcat服务器处于运行状态时,能够监测appBase下的文件,如果有新的Web应用加入进来,会自动发布这个Web应用。

6. Context 元素

  • 每个Context元素代表运行在虚拟主机上的单个Web应用,一个<Host>元素中可以包含多个<Context>`元素
1
<Context path="/xxx" docBase="/xxx/xxx/app1.war" reloadable="true"></Context>
  • 参数作用
    • path:指定访问该Web应用的URL入口。
    • docBase:指定Web应用的文件路径,可以为绝对路径,也可以为相对于Host的appBase属性的相对路径,如果Web应用采用开放目录结构,那就指定Web应用的根目录;如果Web应用是个WAR文件,那就指定WAR文件的路径。
    • reloadable:如果这个属性设为true,Tomcat服务器在运行状态下会监视在WEB-INF/class和WEB-INF/lib目录下CLASS文件的改动,如果检测到有calss文件被更新,服务器会自动重新加载Web应用。

五、部署项目

1. 安装Mariadb数据库

1
2
3
[root@tomcat ~]# yum -y install mariadb-server mysql
[root@tomcat ~]# systemctl enable mariadb && systemctl start mariadb
[root@tomcat ~]# mysqladmin -u root -p password "123123"

2. 导入 smbms_db.sql 数据库 并授权

image-20200604011047185

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@tomcat ~]# mysql -uroot -p123123 < smbms_db.sql

[root@tomcat ~]# mysql -u root -p123123
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| smbms |
| test |
+--------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]> grant all on smbms.* to 'lemon'@'192.168.2.1' identified by "abc22";
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> exit
Bye

3. 部署超市项目网页

1
2
3
4
5
6
7
8
9
10
11
12
#将其超市项目移动至网页存放目录
[root@tomcat ~]# mv WebRoot /usr/local/tomcat/webapps/

#修改超市项目的数据库连接url、用户名密码
[root@tomcat ~]# cd /usr/local/tomcat/webapps/WebRoot/
[root@tomcat ~]# vim WEB-INF/classes/database.properties
driver=com.mysql.jdbc.Driver
#在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8
url=jdbc:mysql://192.168.2.1:3306/smbms?useUnicode=true&characterEncoding=utf-8
user=lemon
password=abc22
:wq!

4. 重启Tomcat 并访问网页

1
2
3
4
5
6
[root@tomcat ~]# /usr/local/tomcat/bin/shutdown.sh
[root@tomcat ~]# /usr/local/tomcat/bin/startup.sh
[root@tomcat ~]# netstat -anptu|grep java
tcp6 0 0 :::8080 :::* LISTEN 27025/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 27025/java
tcp6 0 0 :::8009 :::* LISTEN 27025/java

image-20200604013053512

image-20200604013138703

六、Tomcat的常见配置

1. 修改Tomcat默认网页位置

  • 自定义.jsp页面
1
2
3
4
5
6
7
8
9
10
11
12
[root@tomcat ~]# mkdir -p /usr/local/tomcat/web1
[root@tomcat ~]# cat <<END> /usr/local/tomcat/web1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>lemon </title>
</head>
<body>
<% out.println("lemon is a hoandsome man");%>
</body>
</html>
END
  • 修改server.xml配置文件 并 重启Tomcat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml
# 修改如下:
# 注意:域名是什么就写什么,不要使用默认的localhost,不然别人是可以非法绑定你域名的
<Host name="www.lemon.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/usr/local/tomcat/web1" path="" reloadable="false"></Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="lemon_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
wq!

[root@tomcat ~]# /usr/local/tomcat/bin/shutdown.sh
[root@tomcat ~]# /usr/local/tomcat/bin/startup.sh
[root@tomcat ~]# netstat -anptu|grep java
tcp6 0 0 :::8080 :::* LISTEN 27025/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 27025/java
tcp6 0 0 :::8009 :::* LISTEN 27025/java

image-20200604014626390

2. 配置基于域名的虚拟主机

  • 自定义.jsp页面
1
2
3
4
5
6
7
8
9
10
11
12
[root@tomcat ~]# mkdir -p /usr/local/tomcat/web2
[root@tomcat ~]# cat <<END> /usr/local/tomcat/web2/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>good </title>
</head>
<body>
<% out.println("good is a hoandsome man");%>
</body>
</html>
END
  • 修改server.xml配置文件 并 重启Tomcat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@tomcat ~]# vim /usr/local/tomcat/conf/server.xml
# 直接再添加一对</Host>:
<Host name="www.good.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/usr/local/tomcat/web2" path="" reloadable="false"></Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="good_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
wq!

[root@tomcat ~]# /usr/local/tomcat/bin/shutdown.sh
[root@tomcat ~]# /usr/local/tomcat/bin/startup.sh
[root@tomcat ~]# netstat -anptu|grep java
tcp6 0 0 :::8080 :::* LISTEN 27025/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 27025/java
tcp6 0 0 :::8009 :::* LISTEN 27025/java

image-20200604015241686

image-20200604113008284

3. 配置Tomcat双实例

直接在添加一对且 将其名字、端口号改掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@tomcat ~]# vim /usr/local/tomcat/conf/server.xml
<Service name="lemon">
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="www.lemon.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/usr/local/tomcat/web1" path="" reloadable="false"></Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="lemon_8081_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
<Host name="www.good.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/usr/local/tomcat/web2" path="" reloadable="false"></Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="good_8081_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
</Engine>
</Service>
wq!

[root@tomcat ~]# /usr/local/tomcat/bin/shutdown.sh
[root@tomcat ~]# /usr/local/tomcat/bin/startup.sh
[root@tomcat ~]# netstat -anptu|grep java
tcp6 0 0 :::8080 :::* LISTEN 27422/java
tcp6 0 0 :::8081 :::* LISTEN 27422/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 27422/java
tcp6 0 0 :::8009 :::* LISTEN 27422/java
tcp6 0 0 :::8010 :::* LISTEN 27422/java

image-20200604020032963

image-20200604020111690

  • 查看Tomcat访问日志

image-20200604020217173

4. 定义默认页面(不建议修改)

1
2
3
4
5
6
7
8
[root@tomcat ~]# vim /usr/local/tomcat/conf/web.xml
4693 <welcome-file-list>
4694 <welcome-file>index.html</welcome-file>
4695 <welcome-file>index.htm</welcome-file>
4696 <welcome-file>index.jsp</welcome-file>
4697 </welcome-file-list>
wq!
重启Tomcat服务

5. 设置页面超时时间(按情况而定)

1
2
3
4
5
6
[root@tomcat ~]# vim /usr/local/tomcat/conf/web.xml
595 <session-config>
596 <session-timeout>30</session-timeout>
597 </session-config>
wq!
重启Tomcat服务

6. 禁止列出目录(不建议更改)

  • 默认就是禁止的,如果不想禁止,将false改成true就行。但是最好不要改!!!
1
2
3
4
5
6
7
[root@tomcat ~]# vim /usr/local/tomcat/conf/web.xml
110 <init-param>
111 <param-name>listings</param-name>
112 <param-value>false</param-value>
113 </init-param>
wq!
重启Tomcat服务

七、Tomcat 的三种工作模式

1. 同步、异步、阻塞、非阻塞的理念

  • 同步:自己亲自出马持银行卡到银行排队取钱。事必须一件一件事做,等前一件事情做完了才能做下一件事。

  • 异步:异步的概念和同步相对。委托一小弟拿银行卡到银行取钱,然后给你。

  • 阻塞:ATM排队取款,你只能等待。

  • 非阻塞:柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去。

  • 总结:同步和异步是一个过程,阻塞和非阻塞是线程的一种状态。

2. Tomcat的三种模式

(1)bio:同步阻塞

  • 即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。一个线程处理一个请求,缺点:并发量高时,线程数较多,浪费资源。

  • 使用方式:现在通常不使用

(2)nio:同步非阻塞

  • Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。利用 Java 的异步请求 IO 处理,可以通过少量的线程处理大量的请求。

  • 使用方式:tomcat默认模式

(3)apr异步非阻塞

  • Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。Tomcat apr也是在Tomcat上运行高并发应用的首选模式。

  • 使用方式:在server.xml中更改使用的协议,更加详细的说明可以之间看tomcat的文档。

3. BIO、NIO、AIO适用场景分析

  • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

  • NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

  • AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

4. Tomcat三种模式性能比较

image-20200604115521857

八、Tomcat优化

  • 对于Tomcat软件的优化,主要是从2个方面入手

    • Tomcat自身的配置文件调优
    • Tomcat所运行的 Jvm 虚拟机的调优;针对JVM的调优主要有两个方面:内存调优和垃圾回收策略调优。
  • 服务器资源

    • CPU
    • 内存
    • 硬盘
  • 注:最好调优完成后测试以下,看看性能方面是否提升

1. Tomcat自身的配置文件调优

1.1. 禁用AJP协议连接器节省系统资源

  • 为什么要禁言AJP连接器?

    • 因为项目中一般使用Nginx + tomcat的架构, 所以用不着AJP协议,一般我们可以把AJP连接器禁用,这样有利于提高Tomcat的性能。
  • 怎么禁用?

1
2
3
4
5
[root@tomcat ~]# vim /usr/local/tomcat/conf/server.xml
# 找到下行配置 注释 就禁用了
<!-- 禁用AJP连接 -->
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
wq!
  • 重启 tomcat,查看效果。可以看到 AJP服务已经不存在了

image-20200604143727430

1.2. 配置网页传输压缩

  • 如果有apache或nginx的服务做代理,tomcat则没必要在配置网页传输压缩
1
2
3
4
5
6
7
8
9
10
11
[root@tomcat ~]# vim /usr/local/tomcat/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
compression="on" # 开启压缩
compressionMinSize="50" # 指定最小的压缩文件,单位“字节”
noCompressionUserAgents="gozila,traviata" # 此浏览器类型不进行压缩
compressableMimeType="text/html,text,xml,text,javascript,text/css,text/plain" />
# 压缩的文件格式
wq!
重启服务

1.3. Tomcat修改为 apr工作模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1、安装相关环境包
[root@tomcat ~]# yum -y install expat-devel

2、安装apr
[root@tomcat ~]# tar xf apr-1.6.5.tar.gz && cd apr-1.6.5
[root@tomcat apr-1.6.5]# ./configure --prefix=/usr/local/apr&&make&&make install&&cd

3、安装apr-iconv
[root@tomcat ~]# tar xf apr-iconv-1.2.2.tar.gz && cd apr-iconv-1.2.2/
[root@tomcat apr-iconv-1.2.2]# ./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr && make && make install && cd

4、 安装apr-util
[root@tomcat ~]# tar xf apr-util-1.6.1.tar.gz && cd apr-util-1.6.1
[root@tomcat apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv && make && make install && cd

5、安装Tomcat-native
[root@tomcat ~]# tar xf /usr/local/tomcat/bin/tomcat-native.tar.gz -C ./
[root@tomcat ~]# cd tomcat-native-1.2.17-src/native/
[root@tomcat native]# ./configure --with-apr=/usr/local/apr&&make&&make install&&cd

6、添加环境变量
[root@tomcat ~]# vim /etc/profile
export LD_LIBRARY_PATH=/usr/local/apr/lib
wq!
[root@tomcat ~]# source /etc/profile

7、修改Tomcat配置文件
[root@tomcat ~]# vim /usr/local/tomcat/conf/server.xml
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
wq!
重启服务
  • 查看是否修改

image-20200604125954654

1.4. Tomcat 修改 nio工作模式

  • 修改nio工作模式
1
2
3
4
5
[root@tomcat ~]# vim /usr/local/tomcat/conf/server.xml
# 修改成nio模式
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
wq!
重启服务
  • 查看是否修改

image-20200604130102965

2. Tomcat所运行的 Jvm 的调优。

2.1. Tomcat内存调优

  • 找到catalina.sh文件中JAVA_OPTS变量即可,因为后面的启动参数会把JAVA_OPTS作为JVM的启动参数来处理

  • 内存调优这块呢,无非就是通过修改它们各自的内存空间的大小,使应用能够更加合理的运用:

  • 注意:不是JVM内存设置越大越好,具体还是根据项目对象实际占用内存大小而定,可以通过Java自带的分析工具来查看。如果设置过大,会增加回收时间,从而增加暂停应用时间。

  • 内存结构图

image-20200614100756851

1
[root@tomcat ~]# vim /usr/local/tomcat/bin/catalina.sh

image-20200614100357537

  • 参数说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-Dfile.encoding 默认文件编码

-Xms1024m 设置JVM最小内存为1024m。此值可以设置与-Xmx相同,避免每次垃圾回收完成后JVM重新分配内存

-Xmx1024m 设置JVM最大可用内存为1024MB

-XX:NewSize 设置年轻代大小

-XX:MaxNewSize 设置最大的年轻代大小

-XX:PermSize 设置永久代大小

-XX:MaxPermSize 设置最大永久代大小

-XX:NewRatio=4 设置年轻代(包括Eden和两个Survivor区)与终身代的比值(除去永久代)。设置为4,则年轻代与终身代所占比值为1:4,年轻代占整个堆栈的1/5

-XX:MaxTenuringThreshold=0 设置垃圾最大年龄,默认为:15。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

-XX:+DisableExplicitGC 这个将会忽略手动调用GC的代码使得System.gc()的调用就会变成一个空调用,完全不会触发任何GC。

AB压力测试

  • 作用:Apache 附带了压力测试工具 ab,非常容易使用,并且完全可以模拟各种条件对 Web 服务器发起测试请求。在进行性能调整优化过程中,可用 ab 压力测试工具进行优化效果的测试。

  • 语法:ab -n 请求数总和 -c 并发用户数 网站网址

  • 重要输出参数:

    • Concurrency Level 并发的用户数
    • Time taken for tests 表示所有请求被处理完成所花费的总时间 越少越好
    • Complete requests 总请求数
    • Failed requests 表示失败的请求数量 越少越好
    • Requests per second 吞吐率,每秒能处理多少个并发 越多越好
    • Transfer rate 每秒处理字节数的大小 越多越好

未加入配之前压力测试结果

1
[root@tomcat ~]# ab -n 500000 -c 1000 http://192.168.2.1:8080/
  • 第一次测试结果

    • Time taken for tests: 29.393 seconds 越少越好
    • Requests per second: 17010.63 [#/sec] (mean) 越多越好
    • Transfer rate: 188412.68 [Kbytes/sec] received 越多越好
  • 第二次测试结果

    • Time taken for tests: 24.984 seconds
    • Requests per second: 20013.16 [#/sec] (mean)
    • Transfer rate: 221669.22 [Kbytes/sec] received

加入配之前压力测试结果

1
2
3
4
5
6
7
[root@tomcat ~]# vim /usr/local/tomcat/bin/catalina.sh
111 JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms2048m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m"

[root@tomcat ~]# /usr/local/tomcat/bin/shutdown.sh
[root@tomcat ~]# /usr/local/tomcat/bin/startup.sh

[root@tomcat ~]# ab -n 500000 -c 1000 http://192.168.2.1:8080/
  • 第一次测试结果

    • Time taken for tests: 26.420 seconds
    • Requests per second: 18924.84 [#/sec] (mean)
    • Transfer rate: 210039.88 [Kbytes/sec] received
  • 第二次测试结果

    • Time taken for tests: 21.101 seconds
    • Requests per second: 23695.83 [#/sec] (mean)
    • Transfer rate: 262991.32 [Kbytes/sec] received

2.2. 垃圾回收策略调优

  • 找到Tomcat根目录下的bin目录,也是设置catalina.sh文件中JAVA_OPTS变量即可。我们都知道Java虚拟机都有默认的垃圾回收机制,但是不同的垃圾回收机制的效率是不同的,正是因为这点我们才经常对Java虚拟机的垃圾回收策略进行相应的调整。下面也是通过我的一些需求来配置的垃圾回收策略:
1
[root@tomcat ~]# vim /usr/local/tomcat/bin/catalina.sh

image-20200614101234535

  • Java虚拟机的垃圾回收策略一般分为:串行收集器、并行收集器和并发收集器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 串行收集器:
1、-XX:+UseSerialGC:代表垃圾回收策略为串行收集器,即在整个扫描和复制过程采用单线程的方式来进行,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,主要在JDK1.5之前的垃圾回收方式。


## 并发收集器:
1、-XX:+UseParallelGC:代表垃圾回收策略为并行收集器(吞吐量优先),即在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式。此配置仅对年轻代有效。该配置只能让年轻代使用并发收集,而年老代仍旧使用串行收集。

2、-XX:ParallelGCThreads=4:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。

3、-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集 。

4、-XX:MaxGCPauseMillis=100 :设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。

5、-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。


## 并发收集器:
1、-XX:+UseConcMarkSweepGC:代表垃圾回收策略为并发收集器。
  • 以上的各种GC机制是需要组合使用的,制定方式有下表所示

image-20200614101513638

-------------本文结束感谢您的阅读-------------