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可以禁掉该端口
在一个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.ContextContext元素代表在特定虚拟主机上运行的一个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应用。
上一篇: 智能指针 unique_ptr 详解