一文带你详解了解Tomcat的Server配置( 二 )


在这个例子中,Tomcat监听HTTP请求,使用的是8080端口,而不是正式的80端口;实际上,在正式的生产环境中,Tomcat也常常监听8080端口,而不是80端口 。这是因为在生产环境中,很少将Tomcat直接对外开放接收请求,而是在Tomcat和客户端之间加一层代理服务器(如Nginx),用于请求的转发、负载均衡、处理静态文件等;通过代理服务器访问Tomcat时,是在局域网中,因此一般仍使用8080端口 。
(2)通过配置第2个Connector,客户端可以通过8009端口号使用AJP协议访问Tomcat 。AJP协议负责和其他的HTTP服务器(如Apache)建立连接;在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器 。之所以使用Tomcat和其他服务器集成,是因为Tomcat可以用作Servlet/JSP容器,但是对静态资源的处理速度较慢,不如Apache和IIS等HTTP服务器;因此常常将Tomcat与Apache等集成,前者作Servlet容器,后者处理静态资源,而AJP协议便负责Tomcat和Apache的连接 。Tomcat与Apache等集成的原理如下图(图片来源):

一文带你详解了解Tomcat的Server配置

文章插图
关于Connector的更多内容,可以参考我的另一篇文章:详解tomcat的连接数与线程池
4、Engine
Engine组件在Service组件中有且只有一个;Engine是Service组件中的请求处理组件 。Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端 。
前面已经提到过,Engine、Host和Context都是容器,但它们不是平行的关系,而是父子关系:Engine包含Host,Host包含Context 。
在第一部分的例子中,Engine的配置语句如下:
一文带你详解了解Tomcat的Server配置

文章插图
其中,name属性用于日志和错误信息,在整个Server中应该唯一 。defaultHost属性指定了默认的host名称,当发往本机的请求指定的host名称不存在时,一律使用defaultHost指定的host进行处理;因此,defaultHost的值,必须与Engine中的一个Host组件的name属性值匹配 。
5、Host
(1)Engine与Host
Host是Engine的子容器 。Engine组件中可以内嵌1个或多个Host组件,每个Host组件代表Engine中的一个虚拟主机 。Host组件至少有一个,且其中一个的name必须与Engine组件的defaultHost属性相匹配 。
(2)Host的作用
Host虚拟主机的作用,是运行多个Web应用(一个Context代表一个Web应用),并负责安装、展开、启动和结束每个Web应用 。
Host组件代表的虚拟主机,对应了服务器中一个网络名实体(如”www.test.com”,或IP地址”116.25.25.25”);为了使用户可以通过网络名连接Tomcat服务器,这个名字应该在DNS服务器上注册 。
客户端通常使用主机名来标识它们希望连接的服务器;该主机名也会包含在HTTP请求头中 。Tomcat从HTTP头中提取出主机名,寻找名称匹配的主机 。如果没有匹配,请求将发送至默认主机 。因此默认主机不需要是在DNS服务器中注册的网络名,因为任何与所有Host名称不匹配的请求,都会路由至默认主机 。
(3)Host的配置
在第一部分的例子中,Host的配置如下:
一文带你详解了解Tomcat的Server配置

文章插图
下面对其中配置的属性进行说明:
name属性指定虚拟主机的主机名,一个Engine中有且仅有一个Host组件的name属性与Engine组件的defaultHost属性相匹配;一般情况下,主机名需要是在DNS服务器中注册的网络名,但是Engine指定的defaultHost不需要,原因在前面已经说明 。
unpackWARs指定了是否将代表Web应用的WAR文件解压;如果为true,通过解压后的文件结构运行该Web应用,如果为false,直接使用WAR文件运行Web应用 。
Host的autoDeploy和AppBase属性,与Host内Web应用的自动部署有关;此外,本例中没有出现的xmlBase和deployOnStartup属性,也与Web应用的自动部署有关;将在下一节(Context)中介绍 。
6、Context
(1)Context的作用
Context元素代表在特定虚拟主机上运行的一个Web应用 。在后文中,提到Context、应用或Web应用,它们指代的都是Web应用 。每个Web应用基于WAR文件,或WAR文件解压后对应的目录(这里称为应用目录) 。
Context是Host的子容器,每个Host中可以定义任意多的Context元素 。
在第一部分的例子中,可以看到server.xml配置文件中并没有出现Context元素的配置 。这是因为,Tomcat开启了自动部署,Web应用没有在server.xml中配置静态部署,而是由Tomcat通过特定的规则自动部署 。下面介绍一下Tomcat自动部署Web应用的机制 。


推荐阅读