Tomcat服务器配置
server.xml
server.xml 是tomcat 服务器的核心配置文件,包含了Tomcat的 Servlet 容器(Catalina)的所有配置
Server
<Server port="8005" shutdown="SHUTDOWN">
...
</Server>
- Server是server.xml的根元素,用于创建一个Server实例,默认使用的实现类是org.apache.catalina.core.StandardServer。
- 子元素
- port : Tomcat 监听的关闭服务器的端口。
- shutdown: 关闭服务器的指令字符串。
- 子标签
-
Listener:监听器(默认5种)
<!‐‐ 用于以日志形式输出服务器 、操作系统、JVM的版本信息 ‐‐> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <!‐‐ 用于加载(服务器启动) 和 销毁 (服务器停止) APR。 如果找不到APR库, 则会输出日志, 并不影响Tomcat启动 ‐‐> <Listener className="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on" /> <!‐‐ 用于避免JRE内存泄漏问题 ‐‐> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <!‐‐ 用户加载(服务器启动) 和 销毁(服务器停止) 全局命名服务 ‐‐> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <!‐‐ 用于在Context停止时重建Executor 池中的线程, 以避免ThreadLocal 相关的内存泄漏 ‐‐> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
-
GlobalNamingResources:定义了全局命名服务
<!‐‐ Global JNDI resources Documentation at /docs/jndi‐resources‐howto.html ‐‐> <GlobalNamingResources> <!‐‐ Editable user database that can also be used by UserDatabaseRealm to authenticate users ‐‐> <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
<Service name="Catalina"> ... </Service>
- 一个Server服务器,可以包含多个Service服务。
- 默认使用 org.apache.catalina.core.StandardService。
- 默认情况下,Tomcat 仅指定了Service 的名称, 值为 “Catalina”。
- 子标签:
-
Listener: 用于为Service添加生命周期监听器
-
Executor:用于配置Service 共享线程池(Service 默认并未添加共享线程池配置,如果不配置共享线程池,那么会给每个Connecto都独立创建一个线程池。)
<Executor name="tomcatThreadPool" namePrefix="catalina‐exec‐" maxThreads="200" minSpareThreads="100" maxIdleTime="60000" maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5" className="org.apache.catalina.core.StandardThreadExecutor"/>
属性说明:
- name:线程池名称,用于 Connector中指定。
- namePrefix:所创建的每个线程的名称前缀,一个单独的线程名称为namePrefix+threadNumber。
- maxThreads:池中最大线程数。
- minSpareThreads:活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。
- maxIdleTime:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒。
- maxQueueSize:在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限。除非特殊情况,这个值不需要更改,否则会有请求不会被处理的情况发生。
- prestartminSpareThreads:启动线程池时是否启动 minSpareThreads部分线程。默认值为false,即不启动。
- threadPriority:线程池中线程优先级,默认值为5,值从1到10。
- className:线程池实现类,未指定情况下,默认实现类为org.apache.catalina.core.StandardThreadExecutor。如果想使用自定义线程池首先需要实现org.apache.catalina.Executor接口。
-
Connector: 用于配置Service 包含的链接器(默认情况下,server.xml 配置了两个链接器,分别支持HTTP协议、AJP协议。大多数情况下不需要新增链接器配置,只根据需要对已有链接器进行优化)
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
属性说明:
- port: 端口号,Connector 用于创建服务端Socket 并进行监听, 以等待客户端请求链接。如果该属性设置为0,Tomcat将会随机选择一个可用的端口号给当前Connector使用。
- protocol : 当前Connector 支持的访问协议。 默认为 HTTP/1.1 , 并采用自动切换机制选择一个基于 JAVA NIO 的链接器或者基于本地APR的链接器(根据本地是否含有Tomcat的本地库判定)。如果不希望采用上述自动切换的机制, 而是明确指定协议, 可以使用以下值。
- Http协议:
- org.apache.coyote.http11.Http11NioProtocol , 非阻塞式 Java NIO 链接器
*org.apache.coyote.http11.Http11Nio2Protocol , 非阻塞式 JAVA NIO2 链接器
*org.apache.coyote.http11.Http11AprProtocol , APR 链接器
- org.apache.coyote.http11.Http11NioProtocol , 非阻塞式 Java NIO 链接器
- AJP协议
- org.apache.coyote.ajp.AjpNioProtocol , 非阻塞式 Java NIO 链接器
- org.apache.coyote.ajp.AjpNio2Protocol ,非阻塞式 JAVA NIO2 链接器
- org.apache.coyote.ajp.AjpAprProtocol , APR 链接器
- Http协议:
- connectionTimeOut : Connector 接收链接后的等待超时时间, 单位为 毫秒。 -1 表示不超时。
- redirectPort:当前Connector 不支持SSL请求, 接收到了一个请求, 并且也符合security-constraint 约束, 需要SSL传输,Catalina自动将请求重定向到指定的端口。
- executor : 指定共享线程池的名称, 也可以通过maxThreads、minSpareThreads等属性配置内部线程池。
- URIEncoding : 用于指定编码URI的字符编码, Tomcat8.x版本默认的编码为 UTF-8 ,Tomcat7.x版本默认为ISO-8859-1。
- maxConnections:最大连接数,建议2000左右
- acceptCount:最大等待数(连接数=maxConnections+acceptCount,还多的会被拒绝)
- maxThreads:最大线程数
<Connector port="8080" protocol="HTTP/1.1" executor="tomcatThreadPool" maxThreads="1000" minSpareThreads="100" acceptCount="1000" maxConnections="1000" connectionTimeout="20000" compression="on" compressionMinSize="2048" disableUploadTimeout="true" redirectPort="8443" URIEncoding="UTF‐8" />
-
Engine:用于配置Service中链接器对应的Servlet 容器引擎
<Engine name="Catalina" defaultHost="localhost"> ... </Engine>
- 子元素:
- name: 用于指定Engine 的名称, 默认为Catalina 。该名称会影响一部分Tomcat的存储路径(如临时文件)。
- defaultHost : 默认使用的虚拟主机名称, 当客户端请求指向的主机无效时, 将交由默认的虚拟主机处理, 默认为localhost。
- 子标签
- Host:Host 元素用于配置一个虚拟主机
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> ... </Host>
- 属性说明:
- name: 当前Host通用的网络名称, 必须与DNS服务器上的注册信息一致。 Engine中包含的Host必须存在一个名称与Engine的defaultHost设置一致。
- appBase: 当前Host的应用基础目录, 当前Host上部署的Web应用均在该目录下(可以是绝对目录,相对路径)。默认为webapps。
- unpackWARs: 设置为true, Host在启动时会将appBase目录下war包解压为目录。设置为false, Host将直接从war文件启动。
- autoDeploy: 控制tomcat是否在运行时定期检测并自动部署新增或变更的web应用。
- 如果在Engine下配置Realm, 那么此配置将在当前Engine下的所有Host中共享。 同样,如果在Host中配置Realm , 则在当前Host下的所有Context中共享。
- Context中的Realm优先级 > Host 的Realm优先级 > Engine中的Realm优先级。
- 属性说明:
- 子标签
- Alias:给 Host添加别名(可以实现同一个Host拥有多个网络名称)
<Host name="www.web1.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Alias>www.web2.com</Alias> </Host>
- Context:配置一个Web应用,默认的配置如下
<Context docBase="myApp" path="/myApp"> .... </Context>
- 属性描述:
- docBase:Web应用目录或者War包的部署路径。可以是绝对路径,也可以是相对于Host appBase的相对路径。
- path:Web应用的Context 路径。如果我们Host名为localhost, 则该web应用访问的根路径为: http://localhost:8080/myApp。
- 支持的内嵌元素为:CookieProcessor, Loader, Manager,Realm,Resources,WatchedResource,JarScanner,Valve。
<Host name="www.tomcat.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context docBase="D:\servlet_project03" path="/myApp"></Context> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host>
- 属性描述:
- Alias:给 Host添加别名(可以实现同一个Host拥有多个网络名称)
- Host:Host 元素用于配置一个虚拟主机
- 子元素:
-
-
tomcat-users.xml
- 该配置文件中,主要配置的是Tomcat的用户,角色等信息,用来控制Tomcat中manager, host-manager的访问权限。
- 从早期的Tomcat版本开始,就提供了Web版的管理控制台,他们是两个独立的Web应用,位于webapps目录下。Tomcat 提供的管理应用有用于管理的Host的host-manager和用于管理Web应用的manager。
host-manager
-
Tomcat启动之后,可以通过 http://localhost:8080/host-manager/html 访问该Web应用。
-
host-manager 默认添加了访问权限控制,当打开网址时,需要输入用户名和密码(conf/tomcat-users.xml中配置) 。
-
所以要想访问该页面,需要在conf/tomcat-users.xml 中配置,并分配对应的角色:
<role rolename="admin‐gui"/> <role rolename="admin‐script"/> <user username="yzx" password="yzx" roles="admin‐script,admin‐gui"/>
admin-gui:用于控制页面访问权限
admin-script:用于控制以简单文本的形式进行访问
manager
- manager 的访问地址为 http://localhost:8080/manager
- manager也添加了页面访问控制,因此我们需要为登录用户分配角色
<role rolename="manager‐gui"/> <role rolename="manager‐script"/> <user username="yzx" password="yzx" roles="admin‐script,admin‐gui,manager‐gui,manager‐script"/>
web.xml
web.xml 是web应用的描述文件, 它支持的元素及属性来自于Servlet 规范定义 。
- 在Tomcat 中, Web 应用的描述信息包括 tomcat/conf/web.xml 中默认配置 以及 Web
应用 WEB-INF/web.xml 下的定制配置。
catalina.bat / catalina.sh
配置JVM
- catalina.bat(windows)
set JAVA_OPTS=‐server ‐Xms2048m ‐Xmx2048m ‐XX:MetaspaceSize=256m ‐
- catalina.sh(linux)
JAVA_OPTS="‐server ‐Xms1024m ‐Xmx2048m ‐XX:MetaspaceSize=256m ‐XX:MaxMetaspaceSize=512m ‐XX:SurvivorRatio=8"
Tomcat集群(Session复制)
- 在Tomcat的conf/server.xml 配置如下:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
- 在Tomcat部署的应用程序 servlet_demo01 的web.xml 中加入如下配置 :
<distributable/>
注意
- 上述方案,适用于较小的集群环境(节点数不超过 4个)
- 如果集群的节点数比较多的话,通过这种广播的形式来完成Session的复制,会消耗大量的网络带宽,影响服务的性能。