Tomcat 一文带你了解tomcat体系结构

java中,常用的web服务器一般由tomcat,weblogic,jetty,undertwo等,但从用户使用广泛度来说,tomcat用户量相对比较大一些,当然这也基于它开源和免费的特点。

从软件架构的发展角度来看,软件架构大致经历了如下几个阶段(当然,我们这篇文章不是主讲架构的,因此只是简单提一下架构发展,至于具体的架构,会在后面的文章中陆续与大家分享架构系列):

那么从java web角度来说,架构大致经历了:

Sevlet架构=》SSH架构=》SSM架构=》分布式垂直架构=》SOA架构=》微服务架构

从当前企业使用的架构角度来说,企业使用SSM架构项目比较多,SSH基本别淘汰(大部分都是老项目维护),最近2年,也有一部分企业开始转向微服务架构了。

基于java spring生态来说,如今,大部分中小型企业都基本使用springboot,springboot本身集成了tomcat,jetty和undertwo容器,那么我们为什么要花时间来研究tomcat呢?

  • 当前tomcat依然是主流java web容器,研究它,符合java 技术生态发展
  • 在java web项目调优中,如ssm项目中,在优化项目时,jvm和tomcat同样重要,都需要优化
  • 尽管springboot内置了tomcat容器,且配置了默认的tomcat参数,但当默认的tomcat参数满足不了项目优化要求时,就需要优化人员手动进行相关的参数优化,因此研究tomcat非常必要
  • 熟悉tomcat架构,是后续进行项目优化的基础,也是必备条件

       基于如上原因但不限于如上原因,本篇文章将从tomcat架构角度分析tomca架构。本篇文件主要内容包括:简要分析tomcat架构和tomcat项目文件介绍,更深入的架构浅析,将在下篇文章中讲述。

 

Tomcat架构


通过tomcat官方发行,tomcat发展还是比较快的,目前已经更新到tomcat 10了 ,但当前大部分企业使用的tomcat为9或8版本。       

通过阅读tomcat源码,tomcat简要架构可归结为如下(关于更详细的架构图和架构细节,将在详解tomcat架构(下篇)中分享)。

从上图中,可以得出:

1.tomcat重要主件:

Server主件:作为tomcat服务器主件

service主件:作为tomcat服务主件,即向外提供服务,由一个或多个Host组成

Connector主件:表示连接主件,外部访问tomcat时,通过该主件访问,其支持的比较重要的三个核心协议,http,https和ajp

Engine主件:tomcat引擎主件

Host主件:Tomcat主机主件

Context:tomcat项目主件,一个Context代表一个tomcat项目

2.tomcat支持的三大协议

http协议,ajp协议,https协议

 

tomcat目录结构


[root@www tomcat]# ll
total 92
drwxr-xr-x 2 root root  4096 Sep  7 10:43 bin
drwxr-xr-x 3 root root   198 Sep  7 10:45 conf
drwxr-xr-x 2 root root  4096 Sep  7 10:43 lib
-rw-r--r-- 1 root root 57011 Nov  9  2016 LICENSE
drwxr-xr-x 2 root root   240 Sep  8 10:29 logs
-rw-r--r-- 1 root root  1444 Nov  9  2016 NOTICE
-rw-r--r-- 1 root root  6741 Nov  9  2016 RELEASE-NOTES
-rw-r--r-- 1 root root 16195 Nov  9  2016 RUNNING.txt
drwxr-xr-x 2 root root    30 Sep  7 10:43 temp
drwxr-xr-x 7 root root    81 Nov  9  2016 webapps
drwxr-xr-x 3 root root    22 Sep  7 10:45 work
  • bin:可执行文件,.sh结尾的表示linux可执行文件,.bat结尾的表示linux可执行文件
  • conf: 配置文件
  • lib: tomcat相关jar包
  • temp: 临时文件
  • webapps: 存放项目
  • work: 工作目录

 

tomcat各目录结构详细介绍


(一)bin

bin目录存放可执行文件,简要结束常用命令:

[root@www bin]# ls
bootstrap.jar       commons-daemon.jar            daemon.sh         setclasspath.sh  startup.sh            tool-wrapper.sh
catalina.bat        commons-daemon-native.tar.gz  digest.bat        shutdown.bat     tomcat-juli.jar       version.bat
catalina.sh         configtest.bat                digest.sh         shutdown.sh      tomcat-native.tar.gz  version.sh
catalina-tasks.xml  configtest.sh                 setclasspath.bat  startup.bat      tool-wrapper.bat

这里主要解释如下通用的命令,其他命令就不一一介绍

startup.sh  程序项目命令文件

version.sh  查看tomcat版本相关信息命令文件

shutdown.sh  关闭程序命令

(二) conf

conf文件夹用来存放tomcat相关配置文件

[root@www conf]# ll
total 216
drwxr-xr-x 3 root root     23 Sep  7 10:45 Catalina
-rw------- 1 root root  12767 Nov  9  2016 catalina.policy
-rw------- 1 root root   7125 Nov  9  2016 catalina.properties
-rw------- 1 root root   1577 Nov  9  2016 context.xml
-rw------- 1 root root   3387 Nov  9  2016 logging.properties
-rw------- 1 root root   6458 Nov  9  2016 server.xml
-rw------- 1 root root   2164 Nov  9  2016 tomcat-users.xml
-rw------- 1 root root   2634 Nov  9  2016 tomcat-users.xsd
-rw------- 1 root root 168378 Nov  9  2016 web.xml

1.catalina.policy

项目安全文件,用来防止欺骗代码或JSP执行带有像System.exit(0)这样的命令的可能影响容器的破坏性代码. 只有当Tomcat用-security命令行参数启动时这个文件才会被使用,即启动tomcat时,startup.sh  -security。

[root@www bin]# ./startup.sh -security
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_131
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using Security Manager
Tomcat started.

      上图中,tomcat容器下部署两个项目,项目1和项目2。由于项目1中有代码System.exit(0),当访问该代码时,该代码会导致整个tomcat停止,从而也导致项目2停止。

      为了解决因项目1存在欺骗代码或不安全代码导致损害Tomcat容器,从而影响其他项目正常运行的问题,启动tomcat容器时,加上-security参数就,即startup.sh  -security,如此即使项目1中有代码System.exit(0),也只会仅仅停止项目1,而不会影响Tomcat容器,然而起作用的配置文件就是catalina.policy文件。

2.catalina.properties 

配置tomcat启动相关信息文件

3.context.xml 

监视并加载资源文件,当监视的文件发生发生变化时,自动加载

 4.jaspic-providers.xml 和 jaspic-providers.xsd

这两个文件不常用

5.logging.properties

该文件为tomcat日志文件,包括配置tomcat输出格式,日志级别等

6.server.xml

tomcat核心架构主件文件,在下一篇文章中重点从架构角度分析。

7.tomcat-users.xml和tomcat-users.xsd

tomcat用户文件,如配置远程登陆账号,tomcat-users.xsd 为tomcat-users.xml描述和约束文件

8.web.xml

tomcat全局配置文件。

(三) lib

Tomcat代码是用java写的,所以会依赖于底层的一些jar包。这些jar包就放在该文件夹下面,如下为tomcat 10的lib文件夹下的相关jar包:

[root@www lib]# ls
annotations-api.jar  catalina-storeconfig.jar  jasper-el.jar    tomcat-api.jar      tomcat-i18n-fr.jar  tomcat-util.jar
catalina-ant.jar     catalina-tribes.jar       jasper.jar       tomcat-coyote.jar   tomcat-i18n-ja.jar  tomcat-util-scan.jar
catalina-ha.jar      ecj-4.13.jar             jsp-api.jar      tomcat-dbcp.jar     tomcat-jdbc.jar     tomcat-websocket.jar
catalina.jar         el-api.jar                servlet-api.jar  tomcat-i18n-es.jar  tomcat-jni.jar      websocket-api.jar

(1)每个jar包功能,这里就不讲解了,这里主要分析ecj-4.13.jar,这个jar包起到将.java编译成.class字节码作用。

假设要编译MyTest.java,那么jdk会执行两步:

第一步:将MyTest.java编译成MyTest.class

    javac  MyTest.java

第二步:执行MyTest.class

    java MyTest.class

那么,使用ecj-4.13.jar如执行MyTest.java呢?

 java -jar ecj-4.13.jar MyTest.java

(2)ecj.jar∶可以动态的编译isp文件,普通文件都是运行前先编译好,jsp是在运行的过程中去编译,需要用到特殊的编译工具。

普通的java代码都是需要提前编译好再去运行,运行之前java类是已经编译为class文件了。但是在tomcat里面一般tomcat启动了,也就是程序开始运行了,但是在这个运行过程当中还需要编译一些jsp文件。比如说tomcat启动起来了,但是tomcat里面的项目又增加了jsp文件。这个jsp文件可以在tomcat运行的过程当中重新去编译执行。

访问example项目:

可以看到这里面有个hellow.jsp文件

[root@www simpletag]# pwd
/usr/local/tomcat/webapps/examples/jsp/jsp2/simpletag
[root@www simpletag]# ll hello.jsp
-rw-r--r-- 1 root root 1238 Nov  9  2016 hello.jsp
[root@www simpletag]# vim hello.jsp
   a very basic SimpleTag handler with no body. this is mytest</p>

 

可以看到tomcat正在运行着,修改了该jsp,jsp想要运行出效果一定要编译为servelet,serverlet再去运行生成html源码,该jar包使用了动态编译。

(四)logs

该文件夹表示tomcat日志文件,大致包括如下六类文件:

[root@www logs]# ls
catalina.2020-09-07.log      host-manager.2020-09-10.log          localhost_access_log.2020-09-08.txt  manager.2020-09-10.log
catalina.2020-09-10.log      localhost.2020-09-07.log             localhost_access_log.2020-09-09.txt
catalina.out                 localhost.2020-09-10.log             localhost_access_log.2020-09-10.txt

(1) catalina.date.log(如catalina.2020-09-07.log):表示tomcat启动文件,需要注意的是,该文件只有在重启tomcat情况下,才会产生。(以catalina开头的文件存放着tomcat启动的信息)

[root@www logs]# head -5 catalina.2020-09-07.log 
07-Sep-2020 10:45:55.697 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.0.39
07-Sep-2020 10:45:55.714 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Nov 9 2016 08:48:39 UTC
07-Sep-2020 10:45:55.715 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.0.39.0
07-Sep-2020 10:45:55.715 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
07-Sep-2020 10:45:55.715 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-693.el7.x86_64

(2) manager.date.log(如manager.2020-09-10.log ): 表示访问webapps下manager项目日志,如访问 ip:8080/manager/html

[root@www logs]# cat manager.2020-09-10.log 
10-Sep-2020 20:21:08.256 INFO [http-nio-8080-exec-1] org.apache.catalina.core.ApplicationContext.log HTMLManager: init: Associated with Deployer 'Catalina:type=Deployer,host=localhost'
10-Sep-2020 20:21:08.270 INFO [http-nio-8080-exec-1] org.apache.catalina.core.ApplicationContext.log HTMLManager: init: Global resources are available

 (3) host-manager.date.log(如host-manager.2020-09-10.log):   表示访问webapps下host-manager项目日志,如访问 ip:8080/host-manager/html

[root@www logs]# cat host-manager.2020-09-10.log 
10-Sep-2020 20:25:14.115 INFO [http-nio-8080-exec-3] org.apache.catalina.core.ApplicationContext.log HTMLHostManager: list: Listing hosts for engine [Catalina]

总结:host-manager.2020-09-10.log manager.2020-09-10.log 这里面存放的是tomcat默认项目访问的信息。

Tomcat里面存放着一些默认的项目比如,host-manager  manager  当这两个项目被外界访问的时候一些相关信息会存放在该日志当中

 (4)localhost.date.log(如localhost.2020-03-17.log):表示tomcat在启动时,自身访问服务,这个日志只记录tomcat访问日志,而非业务项目日志

[root@www logs]# cat localhost.2020-09-10.log  
10-Sep-2020 20:20:28.694 INFO [localhost-startStop-2] org.apache.catalina.core.ApplicationContext.log SessionListener: contextDestroyed()
10-Sep-2020 20:20:28.703 INFO [localhost-startStop-2] org.apache.catalina.core.ApplicationContext.log ContextListener: contextDestroyed()
10-Sep-2020 20:20:48.419 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ContextListener: contextInitialized()
10-Sep-2020 20:20:48.420 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log SessionListener: contextInitialized()

(5)localhost_access_log.date.txt(如localhost_access_log.2020-09-07.txt)

表示访问tomcat所有项目的日志记录,如下表示访问项目localhost,host-manager.html,manager.html和test/index.html四个项目日志记录

host-manager.2020-09-07.log  localhost_access_log.2020-09-07.txt  manager.2020-09-07.log
[root@www logs]# cat localhost_access_log.2020-09-10.txt
192.168.179.100 - - [10/Sep/2020:20:16:49 +0800] "GET /manager/html HTTP/1.1" 401 2473
192.168.179.100 - - [10/Sep/2020:20:16:54 +0800] "GET /manager/html HTTP/1.1" 401 2473
192.168.179.100 - - [10/Sep/2020:20:16:55 +0800] "GET /manager/html HTTP/1.1" 401 2473
192.168.179.100 - - [10/Sep/2020:20:17:00 +0800] "GET /manager/html HTTP/1.1" 401 2473
192.168.179.100 - admin [10/Sep/2020:20:21:08 +0800] "GET /manager/html HTTP/1.1" 200 17659
192.168.179.100 - - [10/Sep/2020:20:25:06 +0800] "GET /host-manager/html HTTP/1.1" 401 2044
192.168.179.100 - admin [10/Sep/2020:20:25:14 +0800] "GET /host-manager/html HTTP/1.1" 200 7381

catalina.out:表示catalina.date.log日志汇总,如2020.9.7和2020.9.10 两天分别启动了tomcat,则会阐述如下两个日志:

catalina.2020-09-07.log和catalina.2020-09-10.log  那么,catalina.out内容就是catalina.2020-09-07.log加catalina.2020-09-09.log日志内容

 

(五)webapps


 Webapps 如果要在tomcat里面部署一些项目需要将这些项目放在这个文件夹里面

docs  examples  host-manager  manager  ROOT

这里有五个项目:Docs文档信息,Jsp servelet例子。host-manager ,manage这个是tomcat的管理平台。

端口访问的是ROOT目录下的index.jsp

 

(六)webapps


Work文件夹里面放的是jsp的临时文件,每个项目对应一个文件夹。

[root@www localhost]# ll
total 0
drwxr-xr-x 2 root root  6 Sep  7 10:45 docs
drwxr-xr-x 3 root root 17 Sep 10 09:38 examples
drwxr-xr-x 2 root root  6 Sep  7 10:46 host-manager
drwxr-xr-x 2 root root  6 Sep  7 10:46 manager
drwxr-xr-x 3 root root 17 Sep  7 10:46 ROOT
[root@www localhost]# pwd
/usr/local/tomcat/work/Catalina/localhost

[root@www simpletag]# pwd
/usr/local/tomcat/work/Catalina/localhost/examples/org/apache/jsp/jsp/jsp2/simpletag
[root@www simpletag]# ls
hello_jsp.class  hello_jsp.java

刚刚访问的hello.jsp文件,先被翻译为java类,java类在被编译为class文件,Jsp的java和class文件都被存放在Work文件夹里面

Work文件夹是jsp运行过程当中产生的一些临时文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值