Tomcat server.xml详解

https://www.cnblogs.com/kismetv/p/7228274.html#title3-4

为了更加深入地学习tomcat,我查阅了很多资料,上面链接的文章写的非常好!为整理近日所学而写的这篇博客。

<Server>
	<Service>
		<Connector />
		<Connector />
		<Engine>
			<Host>
		    	<Context/><!--现在常常使用自动部署,不推荐配置Context元素,Context小节有详细说明 -->
			</Host>
		</Engine>
	</Service>
</Server>

1.Server

server在最外层,代表整个tomcat容器,在整个xml文件中是唯一的

shutdown属性表示关闭Server的指令;port属性表示Server接收shutdown指令的端口号,设为-1可以禁掉该端口

2.Service

在一个tomcat容器中,可以包含一个或者多个Service,当客户端访问时,根据访问的端口以及所使用的协议确定使用哪一个Service来进行服务,Service中可以包含多个Connector(接受请求),但只能有一个Engine(处理请求)

name属性用于标识Service。

通常Server都会默认包含一个名为“Catalina”的Service

3.Connector

用于接受连接请求,创建Request和Response对象,分配线程来让Engine来处理请求,最后把产生的结果返回给客户端

port属性指定该连接器所监听的端口号,protocol属性指定请求所使用的协议,redirectPort属性表示当强制要求https而请求是http时,重定向至端口号为8443的Connector,connectionTimeout表示连接的超时时间。

通常会定义两个Connector:一个用于处理http请求,使用8080端口,也就是我们最熟知的一个连接器;另一个用于处理AJP请求,使用8009端口,用于接收处理nginx和apache等HTTP服务器转发过来的请求,因为tomcat作为一个servlet容器,静态资源的处理速度较慢,且其缺少诸如SSL传输层加密的相关组件,通常在生产环境下会将tomcat与其他HTTP服务器集成使用。

4.Engine

在Service中是唯一的,用于处理Connector所接收的请求,处理后返回给Connector

name属性用于日志和错误信息的文件名前缀,在Server中必须唯一;defaultHost表示默认主机,在请求指定的主机不存在时,使用默认的主机来处理请求,所以Engine中必须有一个Host组件的name属性与defaultHost所指定的值一致。虽然实际上你主机名都输错了,服务器根本就不会接受到这个请求……所以这个默认主机没什么鸟用……

5.Host

每个Host组件代表Engine中的一个虚拟主机。

unpackWARs指定了是否将代表Web应用的WAR文件解压;如果为true,通过解压后的文件结构运行该Web应用,如果为false,直接使用WAR文件运行Web应用。

autoDeploy:Tomcat在运行时定期检查新的Web应用或Web应用的更新。

deployOnStartup:Tomcat在启动时检查Web应用

appBase:虚拟主机中放WEB应用的根目录

6.Context

Context元素代表在特定虚拟主机上运行的一个Web应用。每个Web应用基于WAR文件,或WAR文件解压后对应的目录(这里称为应用目录)。

TOMCAT支持应用的热部署,也就是不需要关闭TOMCAT就能实现项目的部署以及修改,关于WEB应用的部署分为动态部署,和静态部署。

关于动态部署:Host元素的deployOnStartup和autoDeploy属性设置为true,xmlBase属性指定Web应用的XML配置文件所在的目录,默认值为conf/<engine_name>/<host_name>,例如第一部分的例子中,主机localhost的xmlBase的默认值是$TOMCAT_HOME/conf/Catalina/localhost。

检查Web应用更新

一个Web应用可能包括以下文件:XML配置文件,WAR包,以及一个应用目录(该目录包含Web应用的文件结构);其中XML配置文件位于xmlBase指定的目录,WAR包和应用目录位于appBase指定的目录。

Tomcat按照如下的顺序进行扫描,来检查应用更新:

A、扫描虚拟主机指定的xmlBase下的XML配置文件

B、扫描虚拟主机指定的appBase下的WAR文件

C、扫描虚拟主机指定的appBase下的应用目录


关于静态部署:使用server.xml的Context元素,path属性表示访问项目时的URL映射,docBase属性项目:项目根目录或者war文件 reloadable是否监控WEB-INF/classes和WEB-INF/lib目录下class文件的改动,crossContext属性:若为true获得跨域环境,可以获取其他应用程序的引用,可用来做同一个主机不同应用程序的跨域session的通信等。具体代码如下

request.getSession().setAttribute("user","蒋周杰");                //web1
ServletContext ContextA =request.getSession().getServletContext(); 
ContextA.setAttribute("session", request.getSession());
HttpSession sessionB = request.getSession();                      //web2
ServletContext ContextB = sessionB.getServletContext();  
ServletContext ContextA= ContextB.getContext("/web1");// 这里面传递的是 WebappA的虚拟路径
HttpSession sessionA =(HttpSession)ContextA.getAttribute("session");

如何确定请求由谁处理?

当请求被发送到Tomcat所在的主机时,如何确定最终哪个Web应用来处理该请求呢?

(1)根据协议和端口号选定Service和Engine

Service中的Connector组件可以接收特定端口的请求,因此,当Tomcat启动时,Service组件就会监听特定的端口。在第一部分的例子中,Catalina这个Service监听了8080端口(基于HTTP协议)和8009端口(基于AJP协议)。当请求进来时,Tomcat便可以根据协议和端口号选定处理请求的Service;Service一旦选定,Engine也就确定。

通过在Server中配置多个Service,可以实现通过不同的端口号来访问同一台机器上部署的不同应用。

(2)根据域名或IP地址选定Host

Service确定后,Tomcat在Service中寻找名称与域名/IP地址匹配的Host处理该请求。如果没有找到,则使用Engine中指定的defaultHost来处理该请求。在第一部分的例子中,由于只有一个Host(name属性为localhost),因此该Service/Engine的所有请求都交给该Host处理。

(3)根据URI选定Context/Web应用

这一点在Context一节有详细的说明:Tomcat根据应用的 path属性与URI的匹配程度来选择Web应用处理相应请求,这里不再赘述。

(4)举例

以请求http://localhost:8080/app1/index.html为例,首先通过协议和端口号(http和8080)选定Service;然后通过主机名(localhost)选定Host;然后通过uri(/app1/index.html)选定Web应用。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值