目录
1. tomcat概述
1.1 概念
什么是tomcat
Tomcat是一个开源、免费、轻量级的Web服务器。
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为比较流行的Web 应用服务器。
什么是Web服务器
Web服务器是安装在服务端的一款软件,它对HTTP协议的操作进行了封装使得程序员不必直接对协议进行相关操作,让Web开发变得更加便捷。Web服务器的主要功能就是提供网上信息浏览服务,当我们将自己写的Web项目部署道Web服务器上,只要启动Web服务器,就能直接通过浏览器访问我们的Web项目了。
目前比较有名的Web服务器有:Apache、Nginx、ISS。
拓展
- Tomcat和Apache的联系:Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行
- Tomcat仅支持JDBC、JSP、Servlet等少量JavaEE规范1
- 因为Tomcat支持Servlet/JSP规范,所以Tomcat也被称为Web容器、Servlet容器。Servlet需要依赖Tomcat才能运行。
- Web服务器、服务端、服务器的区别和联系:
- 服务器是一种特殊的计算机,它比普通计算机运行更快、负载更高、价格更贵,属于硬件范畴;
- 服务端是是指为客户端提供服务的计算机,服务的内容诸如:提供数据的保存、数据的访问……属于硬件范畴;
- Web服务器是指安装再服务端的一款软件,主要功能是提供网上信息浏览服务,但是只能响应HTTP的请求数据,属于软件范畴。
- 能让你写的网站被所有人访问的三要素:服务器+域名+网站
1.2 官网地址
文件目录
目录 | 文件 | 说明 |
bin | / | 可执行文件目录 |
startup.bat , startup.sh | 存放Tomcat的启动、停止等批处理脚本文件 启动: startup.bat ./startup.sh | |
shutdown.bat , shutdown.sh | 用于在windows和linux下的停止脚本 终止: shutdown.bat ./shutdown.sh | |
conf | / | 用于存放Tomcat的相关配置文件 |
Catalina | 用于存储针对每个虚拟机的Context配置 | |
context.xml | 用于定义所有web应用均需加载的Context配 置,如果web应用指定了自己的context.xml ,该文件将被覆盖 | |
catalina.properties | Tomcat 的环境变量配置 | |
catalina.policy | Tomcat 运行的安全策略配置 | |
logging.properties | Tomcat 的日志配置文件, 可以通过该文件修 改Tomcat 的日志级别及日志路径等 | |
server.xml | Tomcat 服务器的核心配置文件 | |
tomcat-users.xml | 定义Tomcat默认的用户及角色映射信息配置 | |
web.xml | Tomcat 中所有应用默认的部署描述文件, 主 要定义了基础Servlet和MIME映射。 | |
lib | / | Tomcat 服务器的依赖包 |
logs | / | Tomcat 默认的日志存放目录 |
webapps | / | Tomcat 默认的Web应用部署目录 |
work | / | Web 应用JSP代码生成和编译的临时 |
2. 基本使用
2.1下载
关于zip、tar.gz详解
3. 整体架构
3.1 核心组件
Catalina的各个组件的作用如下:
-
Server: 表示服务器,它提供了一种优雅的方式来启动和停止整个系统,不必单独启停连接器和容器;它是Tomcat构成的顶级构成元素,所有一切均包含在Server中;
-
Service: 表示服务,Server可以运行多个服务。比如一个Tomcat里面可运行订单服务、支付服务、用户服务等等;Server的实现类StandardServer可以包含一个到多个Services, Service的实现类为StandardService调用了容器(Container)接口,其实是调用了Servlet Engine(引擎),而且StandardService类中也指明了该Service归属的Server;
-
Connector: 表示连接器, 它将Service和Container连接起来,首先它需要注册到一个Service,它的作用就是把来自客户端的请求转发到Container(容器),这就是它为什么称作连接器, 它支持的协议如下:
- 支持AJP协议
- 支持Http协议
- 支持Https协议
-
Service内部还有各种支撑组件,下面简单罗列一下这些组件
- Manager -- 管理器,用于管理会话Session
- Logger -- 日志器,用于管理日志
- Loader -- 加载器,和类加载有关,只会开放给Context所使用
- Pipeline -- 管道组件,配合Valve实现过滤器功能
- Valve -- 阀门组件,配合Pipeline实现过滤器功能
- Realm -- 认证授权组件
-
Container: 表示容器,可以看做Servlet容器;引擎(Engine)、主机(Host)、上下文(Context)和Wraper均继承自Container接口,所以它们都是容器。
- Engine -- 表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine,但是一个引擎可包含多个Host。
- Host -- 代表一个虚拟主机或者说一个站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机下可包含多个Context。
- Context -- 表示一个Web应用程序, 一个Web应用可包含多个Wrapper。
- Wrapper -- 表示一个Servlet,Wrapper 作为容器中的最底层,不能包含子容器。
3.2 从web.xml配置和模块对应角度
<?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 "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
3.3 如何处理请求
启动流程
启动流程主要分为两块内容:
1)初始化:解析Server.xml文件,生成Server等实例,并对Connector和Container等进行初始化操作。
2)启动:调用start()方法启动Connector和Container等。其中Container部分,context启动的时候会解析web.xml,并触发contextConfig这个监听器,从而创建wrapper容器,初始化Servlet实例,如果该Servlet标识了loadOnStartup那么在start()过程中将会调用其init()方法进行Servlet初始化。
从tomcat的启动流程图,我们可以看到它和我们日常编写webapp应用接入点就在于创建Servlet的容器,所以我们的业务代码就是基于Servlet编写,使用tomcat则无需关心Servlet如何对外提供服务,简化了开发流程。
通过一个完整的HTTP请求,我们还需要把它贯穿起来
假设来自客户的请求为:http://localhost:8080/test/index.jsp 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector,然后
- Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应
- Engine获得请求localhost:8080/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
处理请求流程
4. 配置JVM参数
方法一 直接修改catalina文件
# 打开 catalina.sh 文件
vim $CATALINA_HOME/bin/catalina.sh# 找到或添加 JAVA_OPTS 变量设置
# 在 cygwin=false 之前添加以下内容
JAVA_OPTS="$JAVA_OPTS -Xms512m -Xmx1024m -XX:+UseG1GC"# 保存并关闭文件
# 重启 Tomcat
$CATALINA_HOME/bin/shutdown.sh
$CATALINA_HOME/bin/startup.sh
方法二 使用CATALINA_OPTS
环境变量
在Tomcat的启动脚本中,你可以通过设置CATALINA_OPTS
环境变量来添加JVM参数。
对于Linux/Unix:
1. 使用CATALINA_OPTS环境变量
在Tomcat的启动脚本中,可以通过设置CATALINA_OPTS环境变量来添加JVM参数。
找到Tomcat安装目录下的bin目录。
打开setenv.sh文件(如果不存在,可以自己创建一个)
在文件中添加或修改CATALINA_OPTS变量,例如:
export CATALINA_OPTS="-Xms512M -Xmx1024M -XX:MaxPermSize=256m"
保存文件并重新启动Tomcat。
对于Windows:
找到Tomcat安装目录下的bin目录。
打开setenv.bat文件(如果不存在,你可以自己创建一个)。
在文件中添加或修改CATALINA_OPTS变量,例如:
set CATALINA_OPTS=-Xms512M -Xmx1024M -XX:MaxPermSize=256m
保存文件并重新启动Tomcat。