4.2 tomcat配置与部署

tomcat配置文件


  • tomcat的配置文件构成

tomcat 的配置文件也是由 java 语言编写,遵循 java 的语法

[root@CentOS74 tomcat]# ll conf/
total 216
drwxr-xr-x 3 root root       23 Jul 18 12:12 Catalina
-rw-r----- 1 root tomcat  13852 Jun 29 22:44 catalina.policy
-rw-r----- 1 root tomcat   7499 Jun 29 22:44 catalina.properties
-rw-r----- 1 root tomcat   1577 Jun 29 22:44 context.xml
-rw-r----- 1 root tomcat   3387 Jun 29 22:44 logging.properties
-rw-r----- 1 root tomcat   6458 Jun 29 22:44 server.xml
-rw-r----- 1 root tomcat   2164 Jun 29 22:44 tomcat-users.xml
-rw-r----- 1 root tomcat   2634 Jun 29 22:44 tomcat-users.xsd
-rw-r----- 1 root tomcat 169566 Jun 29 22:44 web.xml

server.xml:主配置文件
web.xml:每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置;
context.xml:每个webapp都可以专用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置
tomcat-users.xml:用户认证的账号和密码文件
catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策略;
catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数
logging.properties:日志系统相关的配置

  • tomcat核心组件

server.xml

server.xml 配置文件的基本结构

<Server>
    <Service>
        <connector/>
        <connector/>
        ...
        <Engine>
            <Host>
                <Context/>
                <Context/>
                ...
            </Host>
            <Host>
                ...
            </Host>
            ...
        </Engine>
    </Service>
</Server>

每一个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:

    顶级组件:Server,代表一个运行的 tomcat 实例
    服务类组件:Service
    连接器组件:http, https, ajp(apache jserv protocol)
    容器类:Engine, Host, Context
    被嵌套类:valve, logger, realm, loader, manager, ...
    集群类组件:listener, cluster, ...

web应用的部署


  • JSP WebAPP的组织结构

[root@CentOS74 ~]# tree /data/myweb/
/data/myweb/
├── classes     #类文件,当前webapp所提供的类
├── index.jsp   #主页
├── lib         #库文件,当前webapp所提供的类,被打包为jar格式
├── MATA-INF    #类似于WEB-INF/
└── WEB-INF     #当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件

4 directories, 1 file

webapp归档格式:

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

  • 部署(deploy)webapp的相关操作

将 webapp 的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能够基于 web.xml 和 context.xml 文件中定义的路径来访问此webapp。将其特有的类和依赖的类通过 class loader 装载至 JVM

部署有两种方式:
    自动部署:auto deploy
    手动部署:
        冷部署:把webapp复制到指定的位置,而后才启动tomcat
        热部署:在不停止tomcat的前提下进行部署

部署工具:manager、ant脚本、tcd(tomcat client deployer)等

    undeploy:反部署,停止webapp,并从tomcat实例上卸载webapp
    start:启动处于停止状态的webapp
    stop:停止webapp,不再向用户提供服务;其类依然在jvm上
    redeploy:重新部署;undeploy:反部署,停止webapp,并从tomcat实例上卸载webapp

发布一个简单的 webapp

将一个 webapp 存放至 webapp/ 目录下即可实现一次简单的热部署

[root@CentOS74 ~]# ll /usr/local/tomcat/webapps/
total 4
drwxr-xr-x 14 root tomcat 4096 Jul 18 11:07 docs
drwxr-xr-x  6 root tomcat   83 Jul 18 11:07 examples
drwxr-xr-x  5 root tomcat   87 Jul 18 11:07 host-manager
drwxr-xr-x  5 root tomcat  103 Jul 18 11:07 manager
drwxr-xr-x  6 root root     80 Jul 18 16:24 myweb   #webapp文件夹
drwxr-xr-x  3 root tomcat  306 Jul 18 11:07 ROOT

使用 curl 工具访问

[root@CentOS69 ~]# curl http://192.168.30.74:8080/myweb/
<html>
  <head>
    <title>Test Page</title>
  </head>
  <body>
    hello world

  </body>
</html>		

我们也可以使用软连接实现 webapp 的部署(不支持热部署,需要重启 tomcat 服务)

[root@CentOS74 webapps]# ll
total 4
drwxr-xr-x 14 root tomcat 4096 Jul 18 11:07 docs
drwxr-xr-x  6 root tomcat   83 Jul 18 11:07 examples
drwxr-xr-x  5 root tomcat   87 Jul 18 11:07 host-manager
drwxr-xr-x  5 root tomcat  103 Jul 18 11:07 manager
lrwxrwxrwx  1 root root     14 Jul 18 16:43 myweb -> /data/myweb1.1  #创建软连接至应用程序存放的文件夹
drwxr-xr-x  3 root tomcat  306 Jul 18 11:07 ROOT

使用 Manager 程序进行部署

想要启用 tomcat-manager 应用需要在 conf/tomcat-users.xml 中添加对应的认证语句

<role rolename="manager-gui"/>
<user username="admin" password="admin" roles="manager-gui"/>

manager 应用有四种角色:

    manager-gui:图形界面,拥有所有管理权限
    manager-script:通过脚本管理,拥有所有权限
    manager-jmx:可以查看JXM proxy与状态页面
    manager-status:仅允许查看状态页面

配置tomcat服务


  • Server:代表 tomcat instance,即表现出的一个 java 进程;监听在8005端口,只接收“SHUTDOWN”。各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口
<Server port="8005" shutdown="SHUTDOWN">
  • Service:用于实现将一个或多个connector组件关联至一个engine组件
  <Service name="Catalina">
  • Connector:负责接收请求,常见的有三类http/https/ajp
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

Connector 能够接收的请求大致可以分为两类:

    直接来自客户端发起的请求(不推荐)
    来自前段代理服务器,反向代理的请求

属性:

    port="8080"  监听端口
    protocol="HTTP/1.1"  使用的协议
    connectionTimeout="20000"  连接超时时长
    redirectPort="8443"  重定向端口
    address  监听的IP地址;默认为本机所有可用地址;
    maxThreads  最大并发连接数,默认为200;
    enableLookups  是否启用DNS查询功能;
    acceptCount  等待队列的最大长度;
    secure  是否启用secure功能
    sslProtocol  ssl协议版本
    SSLEnabled  是否启用ssl

  • Engine组件:Servlet 实例,即 servlet 引擎,其内部可以一个或多个 host 组件来定义站点; 通常需要通过 defaultHost 属性来定义默认的虚拟主机
    <Engine name="Catalina" defaultHost="localhost">

属性:

    name  名称
    defaultHost  默认的虚拟主机
    jvmRoute=name=
    defaultHost="localhost"
    jvmRoute=

  • Host组件:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

属性:

    name  虚拟主机名称
    appBase  虚拟主机根目录,当路径是相对目录时,则会在$CTATLINA_BASE下查找,也可以写绝对路径
    unpackWARs  是否自动展开.war文件
    autoDeploy  是否自动部署应用程序

  • Valve组件:插入在Catalina容器(包括Engine,Host或者Context)处理流程中的组件,一般用于记录日志
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

属性:

    className  实现的Java类名。记录日志必须被设置成org.apache.catalina.valves.AccessLogValve
    directory  存放日志文件的目录,可以是相对路径或者绝对路径
    prefix  日志文件名的前缀。如果没有指定,缺省值是“access_log.”
    suffix  日志文件名的后缀
    resolveHosts  是否使用DNS进行反向解析
    pattern  需要记录的请求/响应不同信息域的格式布局
        %a - 远端IP地址
        %A - 本地IP地址
        %b - 发送的字节数,不包括HTTP头,如果为0,使用"-"
        %B - 发送的字节数,不包括HTTP头
        %h - 远端主机名(如果resolveHost=false,远端的IP地址)
        %H - 请求协议
        %l - 从identd返回的远端逻辑用户名(总是返回 '-')
        %m - 请求的方法(GET,POST,等)
        %p - 收到请求的本地端口号
        %q - 查询字符串(如果存在,以 '?'开始)
        %r - 请求的第一行,包含了请求的方法和URI
        %s - 响应的状态码
        %S - 用户的session ID
        %t - 日志和时间,使用通常的Log格式
        %u - 认证以后的远端用户(如果存在的话,否则为'-')
        %U - 请求的URI路径
        %v - 本地服务器的名称
        %D - 处理请求的时间,以毫秒为单位
        %T - 处理请求的时间,以秒为单位
        %{xxx}i 消息头
        %{xxx}c 特定的cookie
        %{xxx}r xxx 是ServletRequest中的某个属性
        %{xxx}s xxx 是HttpSession中的某个属性

  • Context组件: 一个Context组件代表一个web应用,context name 必须唯一,而context path可以不唯一
        <Context path="/context" docBase="/data/context/testapp" reloadable="" />

属性:

    path  访问时的uri
    docBase  web应用存放的路径
    className 实现的Java类名。该类必须实现org.apache.catalina.Context接口。如果没有指定,使用标准实现
    cookie  默认为true,表示启用cookie来标识session
    reloadable  是否在/WEB-INF/class和/WEB-INF/lib更改时重载,生产时建议为false
    wapperClass  实现wrapper容器的类,该类必须实现org.apache.catalina.Wrapper接口,如果不指定该属性则采用默认的标准类

创建虚拟主机

在 server.xml 中定义新的虚拟主机

      <Host name="web1.test.com"  appBase="/data/test/web1"
            unpackWARs="true" autoDeploy="true">

        <Context path="/context" docBase="/data/context/testapp" reloadable="" />

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs/test/web1"
               prefix="web1_access_log" suffix=".log"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>

为虚拟主机 web1.test.com 和 Context /context 创建应用文件

[root@CentOS74 ~]# tree /data/test/web1/ /data/context/testapp/
/data/test/web1/
└── ROOT
    ├── classes
    ├── index.jsp
    ├── lib
    ├── MATA-INF
    └── WEB-INF
/data/context/testapp/
├── classes
├── index.jsp
├── lib
├── MATA-INF
└── WEB-INF

9 directories, 2 files

重启 tomcat 服务加载新的虚拟主机,并访问 web1.test.com

使用 Host-Manager 程序添加虚拟主机

启用 tomcat-manager 应用需要在 conf/tomcat-users.xml 中添加对应的认证语句

<role relename="admin-gui"/>
<user username="admin" password="admin" roles="admin-gui"/>

总结 tomcat 处理请求的流程


1、Tomcat 启动后,Connector 组件的接收器(Acceptor)将会监听是否有客户端套接字连接并接受 Socket

2、监听到客户端连接,将连接交给线程池 Executor 处理,开始执行请求响应任务

3、HttpllProcessor 组件负责从客户端连接中读取消息报文,然后解析 HTTP 的请求行、请求头部、请求体。将解析后的报文组装成 Request 对象,方便日后通过 Request 对象获取 HTTP 协议的相关值

4、Mapper 组件根据 HTTP 协议请求行的 URL 属性值和请求头部的 Host 属性值匹配由哪个 Host 容器、哪个 Context 容器。哪个 Wrapper 容器处理请求。就是根据请求从 Tomcat 中找到对应的 Servlet。然后将结果保存到 Request 对象中,方便后面处理时通过 Request 对象选择容器

5、CoyoteAdaptor 组将负责将 Connector 组件和 Engine 容器链接起来,把处理过程生成的 Request 和 Response 传递到 Engine 容器,调用他的管道。

6、Engine 容器的管道开始处理请求,管道包含若干阀门(Value),每个阀门负责某些处理逻辑。用 xxxvalue 代表阀门,可以根据自己的需要往这个阀门中添加多个阀门,首先执行这个 xxxValue,然后才执行基础阀门 EngineValue,负责调用 Host 容器的管道

7、Host 容器的管道开始处理请求,首先执行这些阀门,然后执行基础阀门 HostValue,他继续往下调用 Context 容器的管道

8、Context 容器的管道开始处理请求,首先执行这些阀门,然后执行基础阀门 ContextValue,他继续往下调用 Wrapper 容器的管道

9、Wrapper 容器的管道开始处理请求,首先执行这些阀门,然后执行基础阀门 WrappertValue,它会执行该 Wrapper 容器对应的 Servlet 对象的处理方法,对请求进行逻辑处理,将结果输出到客户端

     

猜你喜欢

转载自blog.csdn.net/M30_Miriam/article/details/81099155
4.2
今日推荐