tomcat(四)组件与应用部署

By | 2019年 11月 23日

4. 组件分类

顶级组件
  ServerServer,代表整个Tomcat容器

服务类组件
  ServiceService,组织Engine和Connector,里面只能包含一个Engine

连接器组件
  ConnectorConnector,有HTTP、HTTPS、A JP协议的连接器

容器类
  Engine、Host、ContextEngineHostContext都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序。

内嵌类
  可以内嵌到其他组件内。如valve、logger、realm、loader、manager等。以logger举例,在不同容器组件内定义。

集群类组件
  listener、clusterlistenercluster

4.1. Tomcat内部组成

由上述组件就构成了Tomcat,如下图

在这里插入图片描述
名称说明
ServerTomcat运行的进程实例
Connector负责客户端的HTTP、HTTPS、A JP等协议的连接。一个Connector只属于某一个Engine
Service用来组织Engine和Connector的关系
Engine响应并处理用户请求。一个引擎上可以绑定多个Connector
Host虚拟主机
Context应用的上下文,配置路径映射path => directory

4.2. 核心组件

  • Tomcat启动一个Server进程。可以启动多个Server,但一般只启动一个
  • 创建一个Service提供服务。可以创建多个Service,但一般也只创建一个
    • 每个Service中,是Engine和其连接器Connector的关联配置
  • 可以为这个Server提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应
  • Service内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host
    • Engine对请求头做了分析,将请求发送给相应的虚拟主机
    • 如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机
    • Engine上的缺省虚拟主机可以修改
  • Host定义虚拟主机,虚拟主机有name名称,通过名称匹配
  • Context定义应用程序单独的路径映射和配置
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
    <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">
            <Host name="localhost" appBase="webapps"
                unpackWARs="true" autoDeploy="true">
            </Host>
        </Engine>
    </Service>
</Server>

举例:
假设来自客户的请求为:http://localhost:8080/test/index.jsp

浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的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

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对象返回给浏览器端

5. 应用部署

根目录
Tomcat中默认网站根目录是CATALINA_BASE/webapps/
在Tomcat中部署主站应用程序和其他应用程序,和之前WEB服务程序不同。

nginx
假设在nginx中部署2个网站应用eshop、bbs,假设网站根目录是/var/www/html,那么部署可以是这样的。
eshop解压缩所有文件放到/var/www/html/目录下。
bbs的文件放在/var/www/html/bbs下。

Tomcat
Tomcat中默认网站根目录是CATALINA_BASE/webapps/
在Tomcat的webapps目录中,有个非常特殊的目录ROOT,它就是网站默认根目录。
将eshop解压后的文件放到这个ROOT中。
bbs解压后文件都放在CATALINA_BASE/webapps/bbs目录下。
每一个虚拟主机的目录都可以使用appBase配置自己的站点目录,里面都可以使用ROOT目录作为主站目录。

JSP WebApp目录结构
主页配置:一般指定为index.jsp或index.html
WEB-INF/:当前WebApp的私有资源路径,通常存储当前应用使用的web.xml和context.xml配置文件
META-INF/:类似于WEB-INF
classes/:类文件,当前webapp需要的类
lib/:当前应用依赖的jar包

实验
默认情况下,/usr/local/tomcat/webapps/ROOT/下添加一个index.html文件,观察访问到了什么?

将/usr/local/tomcat/conf/web.xml中的下面标签内容(默认页),复制到/usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml中,如下

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1"
    metadata-complete="true">

    <display-name>Welcome to Tomcat</display-name>
    <description>
        Welcome to Tomcat
    </description>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

5.1. webapp归档格式

.war:WebApp打包
.jar:EJB类打包文件
.rar:资源适配器类打包文件
.ear:企业级WebApp打包

传统,应用开发测试后,通常打包为war格式,这种文件部署到了Tomcat的webapps下,还可以自动展开。

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

5.2. 部署Deploy

  • 部署:将webapp的源文件放置到目标目录,通过web.xml和context.xml文件中配置的路径就可以访问该webapp,通过类加载器加载其特有的类和依赖的类到JVM上。
    • 自动部署Auto Deploy:Tomcat发现多了这个应用就把它加载并启动起来
    • 手动部署
      • 冷部署:将webapp放到指定目录,才去启动Tomcat
      • 热部署:Tomcat服务不停止,需要依赖工具manager、ant脚本、tcd(tomcat client deployer)等
  • 反部署undeploy:停止webapp的运行,并从JVM上清除已经加载的类,从Tomcat实例上卸载掉webapp
  • 启动start:webapp能够访问
  • 停止stop:webapp不能访问,不能提供服务,但是JVM并不清除它

实验
1、添加一个文件,test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<%
out.println("hello jsp");
%>
</body>
</html>

先把test.jsp放到ROOT下去,试试看,访问http://YourIP:8080/test.jsp 。
立即可以看到,这是通过路径映射找到相应的test.jsp后,转换成test_jsp.java,在编译成test_jsp.class。
/usr/local/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp下有转换后的文件。

2、添加一个应用
模拟部署一个应用

# cd
常见开发项目目录组成
# mkdir projects/myapp/{WEB-INF,classes,lib} -pv
mkdir: 已创建目录 "projects"
mkdir: 已创建目录 "projects/myapp"
mkdir: 已创建目录 "projects/myapp/WEB-INF"
mkdir: 已创建目录 "projects/myapp/classes"
mkdir: 已创建目录 "projects/myapp/lib"

常见应用首页,内容就用上面的test.jsp
# vi projects/myapp/index.jsp
手动复制项目目录到webapps目录下去
# cp -r projects/myapp/ /usr/local/tomcat/webapps/
使用http://YourIP:8080/myapp/访问试试看

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注