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

相关推荐

  • Linux Basics–part6

    1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; tmp]# cp /etc/rc.d/init.d/rc.sysinit /tmp/rc.sysinit tmp]# vim rc.sysinit : 进入末行模式 %s@^[[:space:]]\+@#@g 2…

    Linux干货 2017-08-24
  • mariadb基础应用

    mariadb基础应用 一、 前言 MariaDB is one of the most popular database servers in the world. It’s made by the original developers of MySQL and guaranteed to stay open source. Notable users …

    Linux干货 2016-12-16
  • 马哥教育第一天

    来到马哥教育第一天,初步接触IT,第一次写博客,不知道写点啥,记几个地址吧。

    2018-03-26
  • 虚拟化介绍、以及kvm

    什么是虚拟化? 在计算机领域中虚拟化,和我们平时说的虚拟化并没有什么两样,说白了就是一个虚拟出来的东西罢了,并不是真实存在的。 虚拟化的历史 虚拟化早在20实际60年代末,由IBM开发被命名为vmm(Virtual Machine Monitor)虚拟机监视器的软件,我们知道那时候工艺技术并不发达,电脑也不像现在这样属于每家每户的标配,IBM为了解决电脑使用…

    2017-03-08
  • shell中if条件字符串、数字比对,[[ ]]和[ ]区别

    今天学习shell, if条件流程控制,但发现if[ ]]和if[ ]什么时候用不是清楚,正好看到一篇文章,非常好,转载,留个备份。 参考: http://www.51testing.com/?uid-7701-action-viewspace-itemid-13731 http://blog.csdn.net/sunboy_2050/article/det…

    Linux干货 2016-08-12
  • 20161014作业

    2016/10/14作业: ##操作类: 1. 设置自己的终端提示符,要求字符终端登录时: a> 需要带颜色 b> 需要显示当前执行到了第几条命令 c> 显示当前登录终端,主机名和当前时间 2、使用shutdown命令于5分钟后重启自己的PC机 3. 学习man,学会使用a> ls递归列出/usr目录下所有文件, b> 列出目录…

    Linux干货 2016-10-20