一,server.xml的元素整体结构
<Server>
<Service>
<Connector />
<Connector />
<Engine>
<Host>
<Context />
<Context />
</Host>
<Host>
<Context />
<Context />
</Host>
</Engine>
</Service>
</Server>
二,对各以上元素详解
1,server
<Server port="8005" shutdown="SHUTDOWN"></Server>
这是 server.xml 的顶级元素,在配置文件是唯一的。上面配置表示监听8005端口,向8005端口发送 “SHUTDOWN” 字符串即可关闭tomcat(注:必须是大写)。所以我们也可以直接使用 telnet 关闭 tomcat,如下:
telnet localhost 8005, 输入SHUTDOWN即可关闭tomcat
2,Service
该元素用于创建服务实例,默认使用: org.apache.catalina.core.StandardService。一个Server服务器,可以包含多个Service服务。
2.1 Service元素的属性
className: 实现Service的类名,不写默认是org.apache.catalina.core.StandardService。
name: 服务的名称,默认为Catalina。
2.2 Service 内嵌的子元素: Executor、Connector、Engine
2.2.1 Executor :配置Connector连接器可以共享的执行器(包含线程池)。
如:
-
<!-- 执行器线程池 -->
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="800"
minSpareThreads="20"
maxIdleTime="60000"
maxQueueSize="Integer.MAX_VALUE"
prestartminSpareThreads="true"
threadPriority="5"
className="org.apache.catalina.core.StandardThreadExecutor"/>
属性说明:
2.2.2 Connector:配置Connector连接器接收请求、返回响应,一个Service可以配置多个Connector。
如:
<Connector port="8060" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Connector port="8070" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
属性说明:
- port: 端口号,Connector用于创建服务端Socket并进行监听,以等待客户端请求链接。如果该属性设置为0,Tomcat将会随机选择一个可用的端口号给当前Connector使用。
- protocol: 当前Connector支持的访问协议。默认为 HTTP/1.1 就是NIO。
- connectionTimeOut: 连接等待超时时间,单位为(毫秒),-1表示不超时。
- redirectPort: 当前Connector不支持SSL请求,接收到了一个请求,将请求重定向到指定的端口。
- executor: 指定共享线程池的名称,可以通过maxThreads、minSpareThreads等属性配置线程池。
2.2.3 Engine :配置引擎作为处理请求的入口,引擎实现分析请求中包含的HTTP头,并传递它们到适当的主机,一个Service 只能有一个Engine。
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="D:\TomCat\test"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="www.a.com" autoDeploy="false">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context path="/app3" docBase="D:\TomCat\testStatic" debug="0" reloadable="true"/>
</Host>
</Engine>
一个Engine可以配置多个Host,Host可以理解为虚拟主机,Engine接受到请求之后就会分配给这些虚拟主机处理。
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="D:\TomCat\test" unpackWARs="true" autoDeploy="true"></Host>
<Host name="www.a.com" autoDeploy="false"></Host>
<Host name="www.b.com" autoDeploy="false"></Host>
</Engine>
Host 的属性Host.name 可以理解为虚拟主机的域名或者ip,当是域名时 (比如www.a.com,www.b.com) 需要在DNS服务器中注册或者在本地host文件中注册。Host中必须有一个 Host.name 与 Engine.localhost 相同否则tomcat启动出错,因为任何与所有Host名称不匹配的请求,都会路由至默认主机。
Engine 分配请求时就是根据 Host.name 确定分配哪个虚拟主机处理的,比如有下面的配置:
<!--
配置了一个Service服务实例,两个Connector分别负责监听来自8050和8040端口的请求,接受到这两个端口的请求后交给Engine处理。
Engine 配置了两个虚拟主机,分别为Host.localhost、Host.www.a.com
-->
<Service name="myService">
<Connector port="8050" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8040" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="D:\TomCat\test"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="www.a.com" autoDeploy="false">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context path="/app3" docBase="D:\TomCat\testStatic" debug="0" reloadable="true"/>
</Host>
</Engine>
</Service>
当我们在网页上访问:
http://localhost:8050/ 或者 http://localhost:8040/
就会交给 Host.localhost 这个主机处理。
当我们在网页上访问:
http://www.a.com:8050/ 或者 http://www.a.com:8040/
就会交给 Host.www.a.com 这个主机处理。
Host 有一个子元素:
<Context></Context>
我们可以理解为一个web应用,可以是一个war包,war解压后的文件夹,或者就是一个本地的文件夹。所以我们可以这样配置:
<Service name="myService">
<Connector port="8050" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8040" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="D:\TomCat\test" unpackWARs="true" autoDeploy="true"></Host>
<Host name="www.a.com" autoDeploy="false">
<Context path="/app3" docBase="D:\TomCat\testStatic" debug="0" reloadable="true"/>
</Host>
</Engine>
</Service>
第一个 Host .localhost 配置了appBase,并没有配置 Context ,因为配置了appBase,tomcat启动时会自动到配置的目录下解压(unpackWARs=“true”)该目录下的war,生成war名对应的目录,并自动帮我们配置context,且path属性就是war包的名字。(比如 这里有个 app2.war 解压后就会生成app2目录)
就相当于:
<Host name="localhost" appBase="D:\TomCat\test" unpackWARs="true" autoDeploy="true">
<Context path="/app2" docBase="D:\TomCat\test\app2" debug="0" reloadable="true"/>
</Host>
第二个 Host .www.a.com 的context直接配置了本地文件 ( docBase=“D:\TomCat\testStatic” ) ,这里 D:\TomCat\testStatic 如下:
这样当我们访问:
http://www.a.com:8040/app3/4.JPG
就会访问到对应的文件
<Context 标签有一个属性:
path="/app3"
这个属性就是访问路径,当Host下配置多个<Context 时区分使用哪个,比如:
<Host name="localhost" appBase="D:\TomCat\test" unpackWARs="true" autoDeploy="true">
<Context path="/app1" docBase="D:\TomCat\test\app1" debug="0" reloadable="true"/>
<Context path="/app2" docBase="D:\TomCat\test\app2" debug="0" reloadable="true"/>
</Host>
当我们访问:
http://localhost:8040/app1/
交给 app1处理
http://localhost:8040/app2/
就交给 app2处理