Tomcat:server.xml

最近在做一个项目,有三个组一起做,实际上做成了三个小项目。做到上周,需要做成War部署到Tomcat上时,出现了一些问题,导致了险些通宵的结果,为了避免再遇到这种情况,决定好好了解下Tomcat的配置。

首先,我写了一份server.xml的主要标签的中文注解,有不少内容参考的是这篇文章,在此对原作者表示感谢。

<?xml version="1.0" encoding="UTF-8"?>


<!-- Server元素为根元素:shutdown属性表示关闭Server的指令;port属性表示Server接收shutdown指令的端口号,设为-1可以禁掉该端口。 -->
<Server port="8005" shutdown="SHUTDOWN" port="-1">
  <!-- Listener(即监听器)定义的组件,可以在特定事件发生时执行特定的操作;被监听的事件通常是Tomcat的启动和停止。 -->
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- GlobalNamingResources元素定义了全局资源,通过配置可以看出,该配置是通过读取$TOMCAT_HOME/ conf/tomcat-users.xml实现的。 -->
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <!-- Connector和Engine元素的集合,一个Service下可以有多个Connector元素 但是只能有一个Engine元素 -->
  <Service name="Catalina">

	<!-- 1.配置客户端在8080端口上通过Http协议访问Tomcat,超时时间为20秒。 -->
	<!-- 2.如果资源被强制要求使用https访问,则会被重定向到8443端口 -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- 1.配置客户端在8009端口上通过AJP协议访问Tomcat。 -->
	<!-- 2.JAP协议负责与其他Http服务器建立联系,比如:
	Tomcat可以作为JSP/Servlet的容器,但是处理静态资源文件Apache更快
	因此出现需要两个服务器集成的情况时,就可以使用该协议 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


	
	<!-- 1.Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端。 -->
	<!-- 2.
		a.	name属性用于日志和错误信息,在整个Server中应该唯一。
		b.	defaultHost属性指定了默认的host名称,当发往本机的请求指定的host名称不存在时,一律使用defaultHost指定的host进行处理。
	因此,defaultHost的值,必须与Engine中的一个Host组件的name属性值匹配-->
    <Engine name="Catalina" defaultHost="localhost"> 

	  <!-- 略:Realm提供了一种用户密码与web应用的映射关系,从而达到角色安全管理的作用 -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
	   <!-- 1.Engine组件中可以内嵌1个或多个Host组件,每个Host组件代表Engine中的一个虚拟主机。 -->
	   <!-- 2.Host虚拟主机的作用,是运行多个Web应用(一个Context代表一个Web应用),并负责安装、展开、启动和结束每个Web应用。 -->
	   <!-- 3.Host组件代表的虚拟主机,对应了服务器中一个网络名实体(如”www.test.com”,或IP地址”116.25.25.25”); -->
	   <!-- 4.客户端通常使用主机名来标识它们希望连接的服务器;该主机名也会包含在HTTP请求头中。
	   Tomcat从HTTP头中提取出主机名,寻找名称匹配的主机。如果没有匹配,请求将发送至默认主机。
	   因此默认主机不需要是在DNS服务器中注册的网络名,因为任何与所有Host名称不匹配的请求,都会路由至默认主机。 -->
	   <!-- 5.
		a.	name指定虚拟主机的主机名
		b.	unpackWARs指定了是否将代表Web应用的WAR文件解压;如果为true,通过解压后的文件结构运行该Web应用,如果为false,直接使用WAR文件运行Web应用
		c.	deployOnStartup(自动部署)为true时:Tomcat在启动时检查Web应用,且检测到的所有Web应用视作新应用
		d.	autoDeploy(自动部署)时:Tomcat在运行时定期检查新的Web应用或Web应用的更新
		e.	appBase相对路径,代表Tomcat根目录下webapps文件夹。默认值是webapps
		f.	xmlBase 指定Web应用的XML配置文件所在的目录,默认值为conf/engine_name/host_name -->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
		<!--1.	 单词Valve的意思是“阀门”,在Tomcat中代表了请求处理流水线上的一个组件;Valve可以与Tomcat的容器(Engine、Host或Context)关联。 -->
		<!--2.	 AccessLogValve的作用是通过日志记录其所在的容器中处理的所有请求,在本例中,Valve放在Host下,便可以记录该Host处理的所有请求。
			AccessLogValve记录的日志就是访问日志,每天的请求会写到一个日志文件里。 -->
		<!--3.	
				a. className:规定了Valve的类型,是最重要的属性;本例中,通过该属性规定了这是一个AccessLogValve。
				b. directory:指定日志存储的位置,本例中,日志存储在$TOMCAT_HOME/logs目录下。
				c. prefix:指定了日志文件的前缀。
				d. suffix:指定了日志文件的后缀。通过directory、prefix和suffix的配置,在$TOMCAT_HOME/logs目录
				e. pattern:指定记录日志的格式 -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
			   
		<!-- 1.Context元素代表在特定虚拟主机上运行的一个Web应用。 -->
		<!-- 2.Context是Host的子容器,每个Host中可以定义任意多的Context元素 -->
		<!-- 3.没有出现Context元素的配置:Tomcat开启了自动部署,Web应用没有在server.xml中配置静态部署,而是由Tomcat通过特定的规则自动部署 -->
		<!-- 4.
			a.	docBase指定了该Web应用使用的WAR包路径,在自动部署场景下,docBase不在appBase目录中,才需要指定。
				如果docBase指定的WAR包或应用目录就在appBase中,则不需要指定。
			b.	path指定了访问该Web应用的上下文路径,当请求到来时,Tomcat根据Web应用的 path属性与URI的匹配程度来选择Web应用处理相应请求
				例如,Web应用app1的path属性是”/app1”,Web应用app2的path属性是”/app2”,那么请求/app1/index.html会交由app1来处理;而请求/app2/index.html会交由app2来处理。
				path属性为””,那么这个Context是虚拟主机的默认Web应用;当请求的uri与所有的path都不匹配时,使用该默认Web应用来处理.
				
				在自动部署场景下,不能指定path属性,path属性由配置文件的文件名、WAR文件的文件名或应用目录的名称自动推导出来。
				如扫描Web应用时,发现了xmlBase目录下的app1.xml,或appBase目录下的app1.WAR或app1应用目录,则该Web应用的path属性是”app1”。
				如果名称不是app1而是ROOT,则该Web应用是虚拟主机默认的Web应用,此时path属性推导为””
				
				静态部署时,可以显式指定path属性,但是仍然受到了严格的限制:
				只有当自动部署完全关闭(deployOnStartup和autoDeploy都为false)或docBase不在appBase中时,才可以设置path属性
			c.	reloadable属性指示tomcat是否在运行时监控在WEB-INF/classes和WEB-INF/lib目录下class文件的改动。如果值为true,那么当class文件改动时,会触发Web应用的重新加载。
				在开发环境下,reloadable设置为true便于调试;
				但是在生产环境中设置为true会给服务器带来性能压力,因此reloadable参数的默认值为false。 -->
		<Context path="test" docBase="D:/xxx/yyy/zzz" reloadable="true" />

      </Host>
    </Engine>
  </Service>
</Server>