Tomcat相关知识整理

初识Servlet

  • SUN公司制定了一系列Web应用与Web服务器进行协作的标准Java接口,统称为Java Servlet API,还对Web服务器发布及运行Web应用的一些细节做了规约。SUN公司把这一系列标准Java接口和规约统称为Servlet规范。Servlet就是Web服务器与Web应用进行协作的标准接口。

  • Servlet规范把能够发布和运行JavaWeb应用的Web服务器称为Servlet容器,它的最主要的特征就是动态执行JavaWeb应用中的Servlet实现类中的程序代码。

  • Servlet是一种运行在服务器上的小插件,其最常见的用途是扩展Web服务器的功能,可作为非常安全的、可移植的、易于使用的CGI替代品。具有以下特点:

    • 提供了可被服务器动态加载并执行的程序代码,为来自客户端的请求提供相应的服务;

    • Servlet完全用Java语言编写,因此要求运行Servlet的服务器必须支持Java语言;

    • Servlet完全在服务器端运行,因此它的运行不依赖于浏览器。不管浏览器是否支持Java语言,都能请求访问服务器端的Servlet。


Tomcat

Tomcat作为运行Servlet的容器,其基本功能是负责接收和解析来自客户端的请求,同时把客户端的请求传送给相应的Servlet,并把Servlet的响应结果返回给客户端。

Tomcat组件,分为4类:

  • 顶层类元素:包括<Server>元素和<Service>元素,它们位于整个配置文件的顶层;

  • 连接器类元素:为<Connector>元素,代表介于客户端与服务器端之间的通信接口,负责将客户端的请求发送给服务器端,并将服务器的响应结果返回给客户端;

  • 容器类元素:代表处理客户端请求并生成响应结果的组件,共有四类,分别为<Engine><Host><Context><Cluster>元素。Engine组件为特定的Service组件处理所有客户端请求,Host组件为特定的虚拟主机处理所有的客户端请求,Context组件为特定的Web应用处理所有的客户端请求。Cluster组件负责为Tomcat集群系统进行会话复制、Context组件的属性的复制,以及集群范围内WAR文件的发布。

  • 嵌套类元素:代表可以被嵌入到容器中的组件,如<Valve>元素和<Realm>元素等。

Tomcat元素:

  • <Server>元素:代表整个Servlet容器组件,是Tomcat的顶级元素。在<Server>元素中可包含一个或多个<Service>元素;

  • <Service>元素:包含一个<Engine>元素,以及一个或多个<Connector>元素,这些<Connector>元素共享同一个<Engine>元素;

  • <Connector>元素:代表和客户端实际交互的组件,负责接收客户端请求,以及向客户端返回响应结果;

  • <Engine>元素:每个<Service>元素只能包含一个<Engine>元素。<Engine>元素处理在同一个<Service>中所有<Connector>元素接收到的客户端请求;

  • <Host>元素:在一个<Engine>元素中可以包含多个<Host>元素。每个<Host>元素定义了一个虚拟主机,它可以包含一个或多个Web应用;

  • <Context>元素:每个<Context>元素代表了运行在虚拟主机上的单个Web应用。在一个<Host>元素中可以包含多个<Context>元素。

Tomcat的工作模式:

(1)独立的Servlet容器

Tomcat作为独立的web服务器来单独运行,Servlet容器组件作为web服务器中的一部分存在,这是Tomcat的默认工作模式。 在这种模式下,Tomcat是一个独立进行的Java程序。和运行其他Java程序一样,运行Tomcat需要启动一个Java虚拟机进程,由该进程来运行Tomcat。

stand alone.png

(2)其他web服务器进程内的Servlet容器

在这种模式下,Tomcat分为web服务器插件和Servlet容器插件两部分。web服务器插件在其他web服务器进程的内部地址空间启动一个JVM,Servlet在此JVM中运行。如有客户端发出调用Servlet的请求,web服务器插件获得对此请求的控制并将它转发(JNI通信机制)给Servlet容器组件。

进程内的servlet.png

(3)其他web服务器进程外的Servlet容器

在这种模式下,Tomcat分为web服务器插件和Servlet容器组件两部分。web服务器插件在其他web服务器的外部地址空间启动一个JVM进程,Servlet容器组件再次JVM中运行。如有客户端发出调用Servlet的请求,web服务器插件获得对此请求的控制并将它转发(IPC通信机制)给Servlet容器组件。

当Tomcat作为独立的Servlet容器来运行时,可看做是能运行Java Servlet的独立web服务器。此外,Tomcat还可作为其他web服务器进程内或进程外的Servlet容器,从而与其他web服务器集成,集成的意义在于:对于不支持运行Java Servlet的其web服务器,可通过集成Tomcat来提供运行Servlet的功能。

进程外的servlet.png

Tomcat的目录结构

  • bin:存放启动和关闭Tomcat的脚本文件及所用到的类;

  • conf:存放Tomcat的各种配置文件,其中最重要的配置文件是server.xml

  • logs:存放Tomcat的日志文件;

  • lib:存放Tomcat服务器及所有Web应用都可以访问的jar文件;

  • webapps:Web应用的默认部署目录;

  • work:Tomcat的工作目录,Tomcat在运行时把生成的一些工作文件放于此目录下。在默认情况下,Tomcat把编译JSP而生成的Servlet类文件放于此目录下;

  • tmp:临时文件目录。

NOTE:

  • Tomcat的lib子目录:存放的jar文件不仅能被Tomcat访问,还能被所有在Tomcat中发布的JavaWeb应用访问;

  • JavaWeb应用的lib子目录:存放的jar文件只能被当前JavaWeb应用访问。

NOTE:

Tomcat在加载Web应用时,会把相应的web.xml文件中的数据读入到内存中。

Context元素

主要属性:

  • path:指定访问该Web应用的URL入口,什么都不写表示根路径;

  • docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于<Host>的appBase属性的相对路径。如果Web应用采用开放目录结构,则指定Web应用的根路径;如果Web应用是个war文件,则是定war文件的路径;

  • className:指定实现Context组件的Java类的名字,这个类必须实现org.apache.catalina.Context接口;

  • reloadable:如果这个属性设为true,Tomcat服务器在运行状态下会监视在WEB-INF/classesWEB-INF/lib目录下的class文件的改动,以监视Web应用的WEB-INF/web.xml文件的改动。如果检测到有class文件或web.xml文件被更新,服务器会自动重新加载Web应用。

专有属性:

  • cachingAllowed:如果为true,表示允许启用静态资源的缓存,默认值为true;

  • cacheMaxSize:设定静态资源缓存的最大容量,默认为10m;

  • workDir:指定Web应用的工作目录,Tomcat在运行时会把与这个web应用相关的临时文件放在这个目录下;

  • uppackWar:如果设为true,表示将把Web应用的WAR文件展开为开放目录结构后再运行。如果设为false,则直接运行war文件。默认为true。

Host元素

主要属性

  • name:指定虚拟主机的名字

  • className:指定实现虚拟主机的Java类的名字,这个Java类必须实现org.apache.catalina.Host接口;

  • appBase:指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于<CATALINA_HOME>的相对路径;

  • autoDeploy:如果设定为true,表示当Tomcat服务器处于运行状态时,能够检测appBase下的文件,如果有新的Web应用加进来,则会自动发布这个Web应用;

  • deployOnStart:如果此项设置为true,则表示当Tomcat启动时会自动发布appBase目录下的所有Web应用。如果web应用没有相应的context元素,那么Tomcat会提供一个默认的context组件。默认值为true。

专有属性:

  • unpackWARS:如果设置为true,表示将把appBase属性指定的目录下的web应用的war文件先展开为开放的目录结构后再运行,如果设置为false,则直接运行war文件;

  • workDir:指定虚拟主机的工作目录,Tomcat在运行时会把与这个虚拟主机的所有web应用相关的临时文件放在此目录下,默认值为<CATALINA_HOME>/work。如果<Host>元素下的一个<Context>元素也设置了workDIR属性,那么<Context>的workDir属性会覆盖<Host>元素的workDir属性;

  • deployXML:如果设置为false,那么Tomcat不会解析web应用中的用于设置context元素的META-INF/context.xml文件。默认值为true。


JavaWeb

SUN的Servlet规范对JavaWeb应用的定义:JavaWeb应用由一组Servlet/JSP、HTML文件、相关Java类,以及其他可以绑定的资源构成,它可以在由各种供应商提供的符合Servlet规范的Servlet容器中运行。

JavaWeb应用包含的内容:

  • Srvlet组件:标准Servlet接口的实现类,运行在服务器端,包含了被Servlet容器动态调用的程序代码。

  • JSP组件:包含Java程序代码的HTML文档,运行在服务器端。当客户端请求JSP文件时,Servlet容器先把它翻译成Servlet类,然后动态调用它的程序代码。

  • 相关的Java类:开发人员自定义的与Web应用相关的Java类。

  • 静态文档:存放在存放在服务器端的文件系统中,如HTML文件、图片文件等。当客户端请求访问这些文件时,Servlet容器先从本地文件系统中读取这些文件的数据,再把它发送到客户端。

  • web.xml文件:JavaWeb应用的配置文件,采用XML格式。该文件必须位于Web应用的WEB-INF目录下。

Servlet规范规定:JavaWeb应用必须采用固定的目录结构,即每种类型的组件在web应用中都有固定的存放目录。

JavaWeb应用的目录结构,以helloapp为例

  • /helloapp:此Web应用的根目录,所有的JSP和HTML文件都存放于此目录或用户自定义的子目录下(WEB-INF子目录除外);

  • /helloapp/WEB-INF:存放此Web应用的配置文件web.xml

  • /helloapp/WEB-INF/classes:存放各种.class文件,Servlet类的.class文件也存放于此目录下;

  • /helloapp/WEB-INF/lib:存放此Web应用所需的各种jar文件;

  • /helloapp/META-INF:当前Webapp的私有资源目录,通常存放自用的context.xml

  • /helloapp/classes:此Webapp的私有类;

  • /helloapp/lib:此Webapp的私有类,被打包为jar格式;

  • /helloapp/index.jsp:此Webapp的主页。

NOTE:在WEB-INF目录的classes及lib子目录下都可以存放类文件。在运行时,Servlet容器的类加载器先加载classes目录下的类,再加载lib目录下的jar文件中的类。


Tomcat阀(Valve)

Tomcat阀能够对Catalina容器接收到的http请求进行预处理。Tomcat阀可以可以加入到3种Catalina容器中,它们是Engine、Host和Context。

Tomcat阀主要包括以下几种:

  • 客户访问日志阀(Access Log Valve)

  • 远程地址过滤器(Remote Address Filter)

  • 远程主机过滤器(Remote Host Filter)

  • 客户请求记录器(Request Dumper)

1.客户访问日志阀

能够将客户端的请求信息写到日志文件中,这些日志文件可以记录网页的访问次数、访问时间、用户的会话活动和用户的安全验证信息等。客户访问日志阀可以加入到Engine、Host或Context容器。

属性:

  • className:指定阀的实现类,此处为org.apache.catalina.valves.AccessLogValve

  • directory:设定存放日志文件的绝对或相对于<CATALINA_HOME>的目录,默认为<CATALINA_HOME>/logs

  • pattern:设定日志的格式和内容;

  • prefix:设定日志文件名前缀,默认为access_log

  • resolveHosts:如果设为true,表示把远程IP地址解析为主机名;如果设为false,表示直接记录远程IP地址,默认为false;

  • suffix:设定日志文件的扩展名,默认为""

pattern属性的可选值:

%a:远程IP地址;
%A:本地IP地址;
%b:发送的字节数,不包括HTTP头部,符号“-”表示发送字节为零;
%B:发送的字节数,不包括HTTP头部;
%h:远程主机名;
%H:客户端请求所用的协议;
%l:远程逻辑用户名(目前总是返回符号“-”);
%m:客户端的请方式;
%p:接收到客户端请求的本地服务器端口;
%q:客户端请求中的查询字符串(Query String),即HTTP请求的第一行的URI部分的“?”后面的内容;
%r:客户端请求的第一行内容(包括请求方式、请求URI及HTTP协议版本);
%s:服务器响应结果中的HTTP状态代码;
%S:用户的额Session ID;
%t:时间和日期;
%u:通过安全认证的远程用户名,符号“-”表示不存在远程用户名;
%U:客户端请求的URL路径;
%v:本地服务器名;

2.远程地址过滤器

可以根据远程客户端的IP地址来决定是否接受客户端的请求。在远程地址过滤器中,事先保存了一份被拒绝的IP地址清单和允许访问的IP地址清单。

属性

  • className:指定阀实现类,此处为org.apache.catalina.valves.AccessLogValve

  • allow:指定允许访问的客户端IP地址,如果没有设定,则表示只要客户端IP地址不在deny清单中,就允许访问,多个IP地址用逗号隔开;

  • deny:指定不允许访问的IP地址;

3.远程主机过滤器

与远程地址多滤器基本上相同,只是一个是基于ip,一个是基于主机名。

4.客户请求记录器

用于把客户端请求的详细信息记录到日志文件,是一个有效的跟踪工具,尤其是当HTTP请求中的Header或Cookie有错误时,它可以跟踪客户请求的详细信息。

原创文章,作者:Jeason,如若转载,请注明出处:http://www.178linux.com/62239

(1)
JeasonJeason
上一篇 2016-12-05 17:05
下一篇 2016-12-05 17:05

相关推荐

  • 马哥教育网络班20期+第5周课程练习

    1、显示/boot/grub/grub.conf中至少一个空白字符开头的行 [root@localhost ~]# grep "^[[:space:]]\+.*" /boot/grub2/grub.cfg 2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行; [root@…

    Linux干货 2016-08-15
  • PS进程命令常用选项参数详解

    PS命令是什么 ps命令能够给出当前系统中进程的快照。它能捕获系统在某一时间的进程状态。如果想要不断更新查看这个状态,可以配合watch命令或使用top命令。ps命令支持三种使用的语法格式 UNIX 风格:选项可以组合在一起,并且选项前必须有”-“连字符。 BSD 风格 :选项可以组合在一起,但是选项前不能有”-&#822…

    2017-07-09
  • ansible的用法

    ansible 每台主机拥有不同的功能,可能同时是http服务器,php-fpm的客户端,共享存储的客户端等,这些功能是单独定义的,不同主机需要的功能各不相同 应确保目标主机的状态为事先给他定义的目标状态 使目标主机达到目标状态有两种方法      agentless:由服务端主机通过ssh连接到目标主机执行命令,客户端不需要额…

    Linux干货 2016-11-11
  • 8.5文本处理工具

    取本机ip地址 利用head命令取行首两行,tail命令取行尾一行, ifconfig |head -2 |tail -1   利用tr -s命令替换空格为“:”,并合并重复的“:”。利用cut -d:-f3命令,保留以“:”为分割符的第三部分   ifconfig |head -2 |tail -1 |tr -s "…

    Linux干货 2016-08-08
  • 自建repo软件仓库

    近期主要使用的aliyun的源,主要会用到centos6、zabbix、epel和xen等,由于网络质量不佳,考虑到自建软件仓库 第一步,删除系统自导的源,新建ali.repo,将常用的几个源地址加入 # rm /etc/yum.repos.d/*.repo -fr # vim /etc/yum.repos.…

    Linux干货 2016-05-19
  • 第二周作业

    一、Linux文件管理类命令     1、文件的复制、移动和删除     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15    A、cp  文件的复制        &nbsp…

    Linux干货 2016-12-13