本文即将介绍的是Server.xml - Tomcat的主配置文件。该文件存放在安装目录下的conf文件夹中。为了让大家有个直观的认识,在此将Tomcat7的默认配置摘录如下:- <?xml version='1.0' encoding='utf-8'?>
- <Server port="8005" shutdown="SHUTDOWN">
- <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
- <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
- <Listener className="org.apache.catalina.core.JasperListener" />
- <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
- <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
- <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
- <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>
- <Service name="Catalina">
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
- <Engine name="Catalina" defaultHost="localhost">
- <Realm className="org.apache.catalina.realm.LockOutRealm">
- <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
- resourceName="UserDatabase"/>
- </Realm>
- <Host name="localhost" appBase="webapps"
- 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>
- </Engine>
- </Service>
- </Server>
复制代码
去掉元素属性,稍加整理,配置文件就变成了下面这样:
- <Server> <!-- 顶级元素 -->
- <Listener/> <!-- 组件 -->
- <GlobalNamingResources/> <!-- 组件 -->
- <Service> <!-- 另一个顶级元素 -->
- <Connector/> <!-- 接头 -->
- <Engine> <!-- 容器 -->
- <Realm/> <!-- 组件 -->
- <Host> <!-- 容器 -->
- <Valve/> <!-- 组件 -->
- <Context></Context> <!-- 容器 -->
- </Host>
- </Engine>
- </Service>
- </Server>
复制代码根据Tomcat自身的分类,上面这些元素可以分成四种:
顶级元素 - 即Server和Service,前者是本配置文件的根节点,后者则起到了一个包裹内部组件的作用。换句话说,它们都属于“单纯的、不具有具体职能的配置节点”。
容器 - Tomcat内真正负责处理请求并返回结果的组件。
Connector - Connector(接头)是一个特殊的组件,如果说整个Tomcat是一堵墙,它就是安装在墙上的插座。外部的客户端通过这些插座来跟Tomcat建立联系。
嵌套组件 - 这是一些嵌套在各种容器内部的组件,有些可以放在任意一层容器内,例如Listener;有些只能放在固定的位置,例如GlobalNamingResources。
下面将选择性地介绍这些元素。
顶级元素
Server 一个Tomcat只有一个Server.xml,即一个Tomcat实例只有一个Server。从实现来看,作为Server.xml的根节点,它不是一个容器,它只是单纯地扮演着一个包裹的角色。从命名来看,它又可以是整个Tomcat所有容器和作用于所用容器的组件的混合体。在此,我们把它当做是Tomcat实例本身。
★ 单机Tomcat实例个数 大部分情况下我们在一台服务器/云服务器上只跑一个tomcat,但也有两种特例:
一是为了测试,在一台机器上跑多个Tomcat,用以模拟多台服务器多个应用交互的效果。
二是通过nginx+多个tomcat组成负载均衡集群,以达到以下目的:
1、在32位系统上,由于寻址空间、内核预留内存等我们不太需要关心的机制,单个进程可以使用的内存上限大概是1.5G~2G(windows)和2G~3G(linux)。因此,大内存服务器上如果要充分利用内存就只能多开Tomcat。理论上64位系统没有这个问题。但由于内存指针膨胀和数据类型对齐补白等同样不太需要关心的机制,运行在64位系统上的JVM需要消耗更多的内存(《深入理解Java虚拟机》),因此,多数应用还是采用在32位系统上部署虚拟集群的方式。
2、配置太大的内存可能会降低JVM进行垃圾回收的频率,也就意味着每一次垃圾回收都是一个耗时日久的大工程,甚至可能导致宕机。一般建议单个JVM最大内存不超过1.5G。
3、从稳定性上考虑,个别tomcat挂了也不会导致服务下线。
★ Server元素属性
- <Server port="8005" shutdown="SHUTDOWN" />
复制代码Server可配置的属性很少。根据上面摘录的默认配置,Server会侦听localhost的TCP端口8005,当该端口接收到字符串"SHUTDOWN"时,即执行关闭Tomcat操作。
★ Server 的嵌套组件 Server有两种特有的组件,一个是GlobalNamingResources(全局命名资源),一个是Service(服务)。除此之外,还可以有Listener(监听器)这种可以作用于不同层次容器的组件。Server默认配置了六种Listener,其作用会在后面介绍。配置在Server这一层的Listener对所有容器起作用。
Service Service是另一个混合体。一个Service就是一个完整的服务,负责将若干个Connector和一个Engine(引擎)包裹在一起。除此之外,Service还可以配置一个Executor(共享线程池)用于管理所有Connector的线程数量。
★ service元素属性
- <Service name="Catalina">...</Service>
复制代码Service的属性比Server更少,一般只用到了name这个属性。默认配置定义了一个名为“Catalina”的 Service。什么是Catalina呢?Cataline是一个太平洋小岛的名字,而Tomcat开发团队的一个核心人员Craig McClanahan喜欢这个小岛,所以...
★ Service 的嵌套组件 如图所示,Service有Executor、Connector和Engine三种组件。其中,每个Connector负责侦听一个TCP端口,接收相应的请求,并转发给绑定的Engine处理。Engine处理完后,通过Connector把结果返回给客户端。在配置了Executor的情况下,所有Connector的线程受Executor统一管理。
更多介绍,阅读原文:
- https://mp.weixin.qq.com/s?__biz=MjM5NzM0MjcyMQ==&mid=2650070777&idx=3&sn=a56a311fc33f585604c9b13eff8f832e&chksm=bedb059789ac8c811720947a85b720497cc7ded7597c20c606343d4d1f93c740dac4ae951c15&mpshare=1&scene=23&srcid=04026yYFRVxrnUrhVlu2eNsz#rd
复制代码
|