Linux-Tomcat文件结构和组成

tomcat的文件结构和组成

[root@centos7-liyj ~]#ll /usr/local/tomcat/
total 128 
drwxr-x--- 2 tomcat tomcat  4096 Jun 12 18:02 bin              #启动,停止等相关程序和文件
-rw-r----- 1 tomcat tomcat 18949 Jun 10  2021 BUILDING.txt
drwx------ 3 tomcat tomcat   273 Jun 12 18:02 conf             #配置文件
-rw-r----- 1 tomcat tomcat  6210 Jun 10  2021 CONTRIBUTING.md
drwxr-x--- 2 tomcat tomcat  4096 Jun 12 18:02 lib              #库目录
-rw-r----- 1 tomcat tomcat 57092 Jun 10  2021 LICENSE
drwxr-x--- 2 tomcat tomcat   197 Jun 12 18:02 logs             #日志目录
-rw-r----- 1 tomcat tomcat  2333 Jun 10  2021 NOTICE
-rw-r----- 1 tomcat tomcat  3372 Jun 10  2021 README.md
-rw-r----- 1 tomcat tomcat  6898 Jun 10  2021 RELEASE-NOTES
-rw-r----- 1 tomcat tomcat 16507 Jun 10  2021 RUNNING.txt
drwxr-x--- 2 tomcat tomcat    30 Jun 12 18:02 temp 
drwxr-x--- 7 tomcat tomcat    81 Jun 10  2021 webapps          #应用程序,应用程序部署目录
drwxr-x--- 3 tomcat tomcat    22 Jun 12 18:02 work             #jsp编译后的结果文件,建议提前预热访问

配置文件

在tomcat安装目录下的 conf 子目录中,有以下的 tomcat 的配置文件

server.html           #主配置文件
web.xml               #每个webapp只有部署后才能被访问,它的部署方式通常由web.xml进行定义,其存在位置为WEBB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用
              专用配置文件,来覆盖全局文件 conterxt.html #用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放
              位置为WEB-INF/目录中,覆盖全局的文件 tomcat
-users.xml #用户认证的账号和密码文件 catalina.policy #当使用security选项启动tomcat时,用于为tomcat设置安全策略 catalina.properties #Tomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数 logging.properties #Tomcat 日志系统相关的配置,可以修改日志级别和日志路径等

注意:配置文件大小写敏感
[root@centos7-liyj ~]#ll /usr/local/tomcat/logs/
total 24
-rw-r----- 1 tomcat tomcat 5853 Jun 12 18:02 catalina.2022-06-12.log             #tomcat服务日志
-rw-r----- 1 tomcat tomcat 5853 Jun 12 18:02 catalina.out                        #tomcat服务日志
-rw-r----- 1 tomcat tomcat    0 Jun 12 18:02 host-manager.2022-06-12.log         #host manager管理日志
-rw-r----- 1 tomcat tomcat  408 Jun 12 18:02 localhost.2022-06-12.log            #默认主机日志
-rw-r----- 1 tomcat tomcat  711 Jun 12 18:07 localhost_access_log.2022-06-12.txt #默认主机访问日志
-rw-r----- 1 tomcat tomcat    0 Jun 12 18:02 manager.2022-06-12.log              #manager管理日志

tomcat的访问日志格式

   Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <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" />

 

组件

组件分层和分类

顶级组件

Server,代表整个Tomcat容器,一台主机可以启动多个tomcat实例,需要确保端口不要产生冲突。

服务类组件

server,实现组织Engine和Connector,建立两者之间关联关系,service里面只能包含一个engine

连接器组件

connector,由HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议。

容器类

engine、host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序。

内嵌类

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

集群类组件

listener、cluster

Tomcat 内部组成

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

 

 

 

server      #服务器,tomcat与逆行的进程实例,一个server中可以有多个service,但通常就一个

service     #服务,用来组织engine和connector的对应关系,一个service中只有一个engine

connector   #连接器,负责客户端的HTTP、HTTPS、AJP等协议连接。一个connector只属于某一个engine

engine      #即引擎,用来响应并处理用户请求。一个engine上可以绑定多个connector

host        #即虚拟之际可以实现多虚拟主机,例如使用不同的主机头区分

context     #应用的上下文,配置特定url路径映射和目录的映射关系:url=> directory

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

顶级组件:server
服务类组件:service
连接器组件:http,https,ajp (apache jserv protocol)
容器类:engine,host,context
被嵌套类:valve,logger,realm,loader,manager,. . .
集群类组件:listener,cluster,. . .

核心组件

  • tomcat启动一个server进程。可以启动多个server,即tomcat的多实例,但一般只启动一个
  • 创建一个service提供服务。可以创建多个service,但一般也只创建一个
    • 每个service中,是engine和其连接器connector的关联配置
  • 可以为这个service提供多个连接器connector,这些connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应
  • service内部还定义了engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机host
    • engine对请求头做了分析,将请求发送给相应的虚拟主机
    • 如果没有匹配,数据就发往engine上的defaultHost缺省虚拟主机
    • engine上的缺省虚拟主机可以修改
  • Host定义虚拟主机,虚拟主机有name名称,通过名称匹配
  • context定义应用程序单独的路径映射和配置

多个组件关系 conf/server.xml

<?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">
         <Context >
         <Context />
     </Host>
    </Engine>
  </Service>
</Server>

tomcat 处理请求过程

假设来自客户的请求为: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。如果匹配不到,就把请求交给该Engine中的defaultHost处理
  • 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对象返回给浏览器端

应用部署

tomcat的根目录结构

Tomcat中默认网站根目录是$CATALINA_BASE/webapps/

在Tomcat中部署主站应用程序和其他应用程序,和之前WEB服务程序不同。

nginx

假设在nginx中部署2个网站应用eshop、forum,假设网站根目录是/data/nginx/html,那么部署可以 是这样的。

eshop解压缩所有文件放到 /data/nginx/html/ 目录下,forum 的文件放在 /data/nginx/html/forum/ 下。

最终网站链接有以下对应关系

http://localhost/ 对应于eshop的应用,即 /data/nginx/html/
http://localhost/forum/ 对应于forum的应用,即/data/nginx/html/forum/

Tomcat

Tomcat中默认网站根目录是$CATALINA_BASE/webapps/

在Tomcat的webapps目录中,有个非常特殊的目录ROOT,它就是网站默认根目录。

将eshop解压后的文件放到这个$CATALINA_BASE/webapps/ROOT中。

bbs解压后文件都放在$CATALINA_BASE/webapps/forum目录下。

$CATALINA_BASE/webapps下面的每个目录都对应一个Web应用,即WebApp

最终网站链接有以下对应关系

http://localhost/ 对应于eshop的应用WebApp,即$CATALINA_BASE/webapps/ROOT/目录,

http://localhost/forum/ 对应于forum的应用WebApp,即$CATALINA_BASE/webapps/forum/

如果同时存在$CATALINA_BASE /webapps/ROOT/forum ,仍以 $CATALINA_BASE/webapps/forum/ 优 先生效

每一个虚拟主机都可以使用appBase指令配置自己的站点目录,使用appBase目录下的ROOT目录作为 主站目录。

 

[root@centos7-liyj ~]#vim /usr/local/tomcat/webapps/ROOT/index.html

<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>tomcat</title>
</head>
#以上编码,说明此页面支持中文格式,否则页面在浏览器中不支持中文,则是乱码
<h1>测试页面 </h1>

 

JSP WebApp目录结构

$CATALINA_BASE/webapps下面的每个目录对应的WebApp,可能有以下子目录,但下面子目录是非必 须的

  • 主页配置:默认按以下顺序查找主页文件 index.html,index.htm、index.jsp
  • WEB-INF/:当前目录WebApp的私有资源路径,通常存储当前应用使用的web.xml和context.xml 配置文件
  • META-INF/:类似于WEB-INF,也是私有资源的配置信息,和WEB-INF/目录一样浏览器无法访问
  • classes/:类文件,当前webapp需要的类
  • lib/:当前应用依赖的jar包

主页设置

全局配置实现修改默认主页文件

默认情况下 tomcat 会在$CATALINA_BASE/webapps/ROOT/目录下按以下次序查找文件,找到第一个则 进行显示

  • index.html
  • index.htm
  • index.jsp

可以通过修改 $CATALINA_BASE/conf/web.xml 中的下面 标签 内容修改默认页文件

 

 

WebApp的专用配置文件

将上面主配置文件conf/web.xml中的 标签 内容,复制 

到/usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml中,如下所示:

[root@centos7 tomcat]#vim webapps/ROOT/WEB-INF/web.xml
[root@centos7 tomcat]#cat 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.html</welcome-file>   #修改三个文件的顺序
       <welcome-file>index.htm</welcome-file>
       <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
</web-app>
#配置修改后,无需重启tomcat服务,即可观察首页变化
[root@centos7 tomcat]#curl http://127.0.0.1:8080/





[root@centos7 tomcat]#cp -a webapps/ROOT/WEB-INF/   webapps/magedu/
[root@centos7 tomcat]#echo /usr/local/tomcat/webapps/magedu/test.html >
webapps/magedu/test.html
[root@centos7 tomcat]#tree webapps/magedu/
webapps/magedu/
├── index.htm
├── index.html
├── test.html
└── WEB-INF
   └── web.xml
1 directory, 4 files
[root@centos7 tomcat]#cat webapps/magedu/WEB-INF/web.xml
......
 <description>
     Welcome to Tomcat
 </description>
   <welcome-file-list>
   <welcome-file>test.html</welcome-file>  #修改默认页面文件的顺序
   <welcome-file>index.htm</welcome-file>
   <welcome-file>index.html</welcome-file>
   </welcome-file-list>
</web-app>
#注意修改属性
[root@centos7 tomcat]#chown -R tomcat.tomcat webapps/magedu/
[root@centos7 ~]#curl http://www.magedu.org:8080/magedu/
/usr/local/tomcat/webapps/magedu/test.html

配置规则:

  • webApp的专有配置优先于系统的全局配置
  • 修改系统的全局配置文件,需要重新启动服务生效
  • 修改 webApp的专有配置,无需重启即可生效

应用部署实现

WebApp应用的归档格式

.war:WebApp打包,类zip格式文件,通常包括一个应用的所有资源,比如jsp,html,配置文件等

.jar:EJB类文件的打包压缩类zip格式文件,,包括很多的class文件, 网景公司发明

.rar:资源适配器类打包文件,目前已不常用

.ear:企业级WebApp打包,目前已不常用

传统应用开发测试后,通常打包为war格式,这种文件部署到Tomcat的webapps目录下,并默认会自动解包展开和部署上线。

#conf/server.xml中文件配置
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

部署方式

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

部署WebApp的目录结构

常见开发项目目录组成

#目录结构一般由开发用工具自动生成,以下模拟生成相关目录
mkdir projects/myapp/{WEB-INF,META-INF,classes,lib} -pv
mkdir: 已创建目录 "projects"
mkdir: 已创建目录 "projects/myapp"
mkdir: 已创建目录 "projects/myapp/WEB-INF"
mkdir: 已创建目录 "projects/myapp/META-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/
#注意权限和属性
chown -R tomcat.tomcat /usr/local/tomcat/webapps/myapp
#访问http://YourIP:8080/myapp/

 

posted @ 2022-06-12 19:40  goodbay说拜拜  阅读(208)  评论(0)    收藏  举报