一.Tomcat概述
1.Tomcat简介
- Apache软件基金会
- 开源软件
- 中小型应用服务器
- Tomcat:解析Http请求并将结果返回给客户端的应用程序
2.Tomcat结构图及介绍
- Server:指Tomcat服务器,其中包含多个组件,负责管理和启动各个Service,同时还要监听8005端口发来的shutdown命令用于关闭整个服务器
- Service:对外提供完整的基于组件的web服务,其中包含Connector和Contiainer组件和多个其他组件。Service之间是独立的,但会共享虚拟机资源
- Connector:是Tomcat与外部的连接器,监听固定的端口,接受外部请求将请求传递给Container,并将Container处理之后的结果返回给外部
- Container:是Servlet容器,内部由多个容器组成,主要用于管理Servlet的生命周期,调用Servlet相关方法取处理业务逻辑
- Jasper:Tomcat的JSP解析引擎,主要用于将JSP文件转换成Java文件并编译成.class文件
- Naming:名称服务,将名称和对象连接起来,用名称去访问对象
- Session:用于创建和管理Session,及Session的持久化,且支持Session集群
- Loging:主要用于记录日志,包含访问错误信息、运行信息等
- JMX:JavaSE中的技术规范,主要是为应用、设备、系统等提供的框架,使用JMX可以监控Tomcat的运行状态
3.Connector组件
- Connector组件【连接器】作用
- 接受客户端连接
- 加工处理客户端请求(解析的过程生成request对象,组装的过程生成response对象)
4.Container组件
-
Container组件是所有子容器的父接口
-
在Tomcat中,Container的设计是典型的责任链设计模式,有四个子容器,关系图如下
-
什么是责任链模式?责任链模式是使多个对象都有机会去处理同一个请求,从而避免请求的发送者和接受者的耦合关系,将这些对象连成一条链,并沿着链传递请求,直到一个对象处理为止
- Engine:用来管理多个站点,一个service只能有一个站点
- Host:代表一个站点(即虚拟主机),通过配置host就可以添加站点
- Context:代表一个应用程序
- Wrapper:封装了的Servlet
-
Tomcat的webapps目录下有ROOT文件夹和其他文件夹,ROOT文件夹下存放主目录内容,可以直接通过域名访问;其他文件夹存放子目录内容,需要通过
域名/context
名称的形式访问
5.Server处理HTTP请求的过程
- 用户点击网页的内容,请求被发送到本机端口的8080,被监听在8080的connector获得
- 该请求交给Server的Engine处理,并等待Engine的回应
- Engine获得的请求时localhost/test/index.jsp,去匹配所有的虚拟主机(即host)
- 名称为localhost的host获得到请求中/test/index.jsp获得context
- 在mapping table里面寻找对应的Servlet,从而构造http Servlet request和response对象,作为参数去调用http servlet的doGet或doPost去执行业务
- 获得的response对象一级一级往回返
- 【Tomcat就是自上而下,容器中又包含子容器的结构】
二.Tomcat的安装
1.Windows上安装Tomcat
- 搭建运行基础环境(JDK1.8)
- 安装JDK
- 配置Java目录的环境变量【jdk
/bin
目录和jre/bin
目录】
- 配置Tomcat
- 到官网下载对应的压缩包
- 直接点击startup文件即可启动
2.Linux上安装Tomcat
- 安装Linux的JDK
- 到官网下载JDK的压缩包并解压
- 配置环境变量
- 安装Linux的Tomcat
- 到官网下载对应的压缩包
- 进入Tomcat bin目录,执行startup.sh启动
- 可以在logs文件夹下的catalina.out文件查看日志信息
3.Tomcat目录结构
- bin:主要用来存放Tomcat运行命令
- conf:主要用来存放配置文件
- catalina.policy:放置JSP代码或用户代码破坏Tomcat容器
- catalina.properties:主要包含不能被JSP或servelt修改的jar的文件列表
- context.xml:有关context的配置文件,被所有的web应用程序使用,默认文件位置是web.xml文件
- logging.properties:Tomcat日志使用的配置文件,配置日志的输出格式等等
- server.xml:Tomcat中最主要的配置文件,定义了Tomcat的体系结构,在Tomcat启动时构建Tomcat容器,尝尝在这个文件中修改Tomcat端口号
- tomcat-users.xml:Tomcat的web页面,人员和管理员的信息在这个文件中配置
- web.xml:被Tomcat所有应用程序使用,主要配置Tomcat的启动信息
- lib:所有Tomcat容器使用的jar包,也包含用户开发的Web程序使用的jar包
- logs:Tomcat在运行期间产生的日志信息
- 在windows环境中,控制台输出的信息在catalina.log文件中
- 在linux环境中,控制台输出的信息在catalina.out文件中
- temp:记录用户在Tomcat运行过程中产生的临时文件,文件清空对Tomcat没有影响
- webapps:存放应用程序,当应用被启动时会加载webapps下面的应用程序,以文件夹、war包、jar包的形式发布应用**【当然,也可以把项目放在电脑中任何位置,只需要在配置文件中配置映射即可】**
- ROOT:Tomcat的根目录,直接使用
ip:端口/文件名称
进行访问 - work:Tomcat运行时编译后的文件,jsp编译后的文件或jar编译后的文件,清空这个目录再启动Tomcat即可达到清除服务器缓存的效果
三.Tomcat相关配置
1.修改Tomcat端口号
- 配置端口号
- 端口范围165535,11024会分配给默认服务,21端口ftp服务,25端口smtp服务,80端口http服务
- 默认端口号
- Shutdown端口:指定端口指定关闭Tomcat,向端口发送关闭端口的字符串就可以关闭Tomcat服务,默认8005端口
- Http请求端口:建立Http请求,在访问Tomcat服务器时使用的就是这个连接器,默认端口8080
- AJP服务端口:主要负责和其他Http服务器建立连接,把Tomcat与其他的Http服务器集成,在集成时使用这个连接器,默认端口8009
- 修改端口号
- 修改server.xml中protocol是HTTP/1.1的Connector,即修改了Http请求的端口号
- 重新启动Tomcat服务器即可,可以看到日志中显示监听8081端口
2.修改内存
-
为什么修改Tomcat内存
- 当一个项目比较大时,项目的依赖很多,项目启动时会将项目中所有的类依次加载到内存中,java的内存模型分为堆内存(主要用于存储类的实例、数组等引用数据类型,即new生成的对象)、栈内存(主要存储局部变量,如方法参数等)、静态内存区(主要存储一些常量,类的元数据【方法属性等等】该区的内存不会被gc回收)
- 内存溢出
- OutOfMemoryError:Java heap space异常,表示堆内存满了,不是程序的bug,就可能是项目中引用的jar比较多,导致内存溢出。JVM默认的堆内存是物理内存的1/64,最大的使用内存是物理内存的1/4
- OutOfMemoryError:PermGen space异常,表示静态内存区满了,通常由于加载的类太多导致的。JDK8以后由于调整了内存模型,不会出现此异常。
- StackOverflowError异常:表示栈内存溢出,通常因为死循环或无限递归导致的。
-
通过以下方式在catalina.bat文件中配置运行内存参数【配置到第二行,或配置在startup文件中】
-server
:虚拟机的运行模式,配成server时当有多个cpu时,性能可以更好的发挥,默认是client-Xms
:java heap初始大小,默认是物理内存的1/64,最大不要超过物理内存的80%-Xmx
:表示java heap的最大值,建议设置为物理内存的一半MetaspaceSize
:表示初始元空间的大小,默认是21M,通过此方式设置成128MMaxMetaspaceSize
:表示最大的元空间大小,默认是无上限的,通过此方式设置成256M
JAVA_OPTS="-server -Xms256m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
-
其实在性能方面,还应考虑Java提供的垃圾回收机制。虚拟机的堆大小,决定了虚拟机在回收垃圾的时间和频率,如果堆的大小很大的话,完全垃圾收集就会很慢,频率会降低。反之,垃圾收集就很快,频率会很高。调整堆大小的目的就是最小化垃圾收集的时间,在特定时间内最大化处理用户请求。
3.配置热部署
-
什么是热部署:不启动Tomcat的情况下,将项目部署到服务器中,即开发即用。
-
如何配置热部署
-
方法一:将war包放到webapps文件夹下中
-
方法二:在conf ->
-