认识Tomcat及其核心组件
Tomcat是一个java的web容器,Tomcat是实现了javaEE当中的Servlet和JSP规范的一个容器。Tomcat一般用于动态请求的处理(Servlet)。Tomcat采用组件的方式去设计(面向组件)。整体的功能是通过组件的方式去拼装的。并且每一个组件都可以进行替换保证了它的一个灵活性。看到下图:
Server 和 Service组件: Tomcat的一个服务器(Server)和Tomcat的服务(Service Tomcat-standalone),主要作用是将连接器(Connector)和引擎(Engine)关联;连接器(Connector): 连接器帮助我们把客户端里面的请求连接到我们Tomcat的服务。Tomcat可以配置多个连接器。在这个连接器中可以指定Service和外部通信的一个协议(HTTP 1.1、HTTPS、AJP: apache 私有协议,用于apache 反向代理Tomcat)。
容器组件(Container ): 容器组件包含引擎(Engine,默认的引擎叫catalina)、虚拟机(Host)、Context。
Engine主要的作用是将协议解析并转换成request传给虚拟机。
虚拟机(Host) 基于域名分发请求(可以配置多个虚拟机)。
Context隔离每个WEB应用,每一个Context的ClassLoader都是独立的(Tomcat的webapps目录下有一个ROOT文件夹代表的是根路径)。
Tomcat还有一些其它组件,像logger日志管理器、loader载入器、pipeline管道等。这些组件都是内嵌的组件。
组件之间的组成关系
我们知道Tomcat里面有哪些组件了,那这些组件的组成关系怎样呢?看下图:
最顶层的是 Server,然后是 Service( Service可以有多个,一般情况下只配置一个),一个 Service里面可以支持多个 Connector,一个 Service里面只能由唯一的一个 Engine, Engine里面可以包含多个 Host, Host可以包含多个 Context。Tomcat启动参数的说明
Tomcat的主要启动参数
1、JAVA_OPTS: jvm 启动参数 , 设置内存 编码等 -Xms100m -Xmx200m -Dfile.encoding=UTF-8;
2、JAVA_HOME: 指定jdk 目录,如果未设置从java 环境变量当中去找;
3、CATALINA_HOME: Tomcat 程序的根目录;
4、CATALINA_BASE: 应用部署目录,默认为CATALINA_HOME;
5、CATALINA_OUT: 应用日志输出目录,默认为CATALINA_BASE;
6、CATALINA_TMPDIR: 应用临时目录,默认为CATALINA_BASE/temp。
平时启动Tomcat的过程
1、复制WAR包到Tomcat的webapps文件夹下;
2、执行starup.bat(startup.sh)脚本启动;
3、在启动过程中会自动将war包解压装载。
但是在我们平时开发的时候是直接在Eclipse或IDEA中启动WEB项目的,不会把将项目打包,然后将war包复制到Tomcat的webapps目录下再执行starup.bat(startup.sh)脚本的。
我们在Eclipse或IDEA中启动WEB项目的时候其实是在Tomcat程序文件之外创建了一个部署目录,在一般的生产环境中也是这么做的 即:Tomcat程序目录和部署目录分开 。我们在只需要在启动时指定CATALINA_HOME 与 CATALINA_BASE 参数即可实现。
演示Tomcat程序目录和部署目录分开
1、下载并解压Tomcat
2、创建apps目录,在apps下创建test-web,test-web下新建一个logs目录。
3、将Tomcat目录下的conf和webapps两个目录拷贝一份到test-web。
4、创建并编写脚本:tomcat.sh。
#!/bin/bash
#####设置jvm内存,最小内存和最大内存
export JAVA_OPTS="-Xms100m -Xmx200m"
#####指定JDK目录
export JAVA_HOME=/usr/local/java
#####对应的Tomcat的目录
export CATALINA_HOME=/usr/local/apache-tomcat-8.5.34
##### pwd:当前脚本所在目录
export CATALINA_BASE="`pwd`"
##### 接收一个参数,这个参数包含start、stop、restart、version和configtest
##### start:执行catalina.sh脚本
##### stop:关闭catalina.sh脚本
##### restart:重启catalina.sh脚本
##### version:查看版本号
##### configtest:查看配置是否正确
case $1 in
start)
$CATALINA_HOME/bin/catalina.sh start
echo start success!!
;;
stop)
$CATALINA_HOME/bin/catalina.sh stop
echo stop success!!
;;
restart)
$CATALINA_HOME/bin/catalina.sh stop
echo stop success!!
sleep 2
$CATALINA_HOME/bin/catalina.sh start
echo start success!!
;;
version)
$CATALINA_HOME/bin/catalina.sh version
;;
configtest)
$CATALINA_HOME/bin/catalina.sh configtest
;;
esac
exit 0
复制代码
5、在test-web目录下执行./tomcat.sh start
命令启动Tomcat,打印出的日志最后一行为start success!!
即启动成功
6、执行curl 127.0.0.1:8080,日志打印出webapps/ROOT/index.jsp文件的内容则访问成功。
这样就可以将应用程序和Tomcat的部署目录进行分离。那这样有什么好处呢?看下图:
1、看上图所知:我的Tomcat在A目录,所有的应用在B目录,B目录中的所有的应用是指向Tomcat的,当Tomcat要进行升级的时候,我只需要把Tomcat所在的A目录升级了就可以了,而不需要一点一点的去升级所有的配置了。2、我在每一个应用程序内新建了一个logs文件夹,我们的日志文件是独立的不会和其它项目混淆在一起。
3、我们的配置文件conf也是独立的。各应用之间互不影响,灵活性高。