Tomcat7配置指南
server.xml包含了影响Tomcat7的Servlet/JSP容器行为的绝大部分配置项。可以在该配置文件中使用Ant风格的变量替换。变量可以使用系统属性,对于propname,可以使用${propname}这种形式的占位符。
server.xml的整体结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<!-- Server是整个配置文件的根元素 --> <Server> <Listener /> <GlobalNamingResources> <Resource /> </GlobalNamingResources> <!-- Context处理针对某个特定Web应用程序的请求 --> <!-- 服务(Service)用于表示一组与一个引擎(Engine)关联的连接器(Connector) --> <Service> <!-- 连接器用于表示外部客户端与某个特定服务的接口 --> <Connector /> <!-- 引擎处理针对服务的所有请求 --> <Engine> <Realm /> <!-- 主机(Host)处理针对某个特定虚拟主机的所有请求 --> <Host /> </Engine> </Service> </Server> |
该元素代表整个Catalina容器,它是配置文件的根元素
属性名称 | 说明 |
className | 容器实现类的名称,必须实现org.apache.catalina.Server接口 |
address | 等待关闭命令的地址,默认localhost |
port | 等待关闭命令的端口,设置为-1可以禁止,禁用后shutdown.bat将不能正常工作 |
shutdown | 通过TCP连接接收的命令行字符串,用于关闭Tomcat |
元素名称 | 说明 |
Service | 一个或者多个service元素 |
GlobalNamingResources | 容器的全局JNDI资源 |
用于表示多个连接器与单个引擎的联合
属性名称 | 说明 |
className | 服务实现类的名称,必须实现org.apache.catalina.Service接口 |
name | 该服务的显示名,必须在Server下是唯一的 |
元素名称 | 说明 |
Connector | 支持一个到多个 |
Executor | 支持一个到多个 |
Engine | 支持一个,必须放在最后面 |
表示可以被多个组件(主要是Connector)共享的线程池。Executor必须实现org.apache.catalina.Executor接口。
它必须在Connector前面定义,才可以被其引用。
属性名称 | 说明 |
className | 实现类的名称,默认org.apache.catalina.core.StandardThreadExecutor |
name | 供其它组件引用的名称 |
StandardThreadExecutor提供的属性:
属性名称 | 说明 |
threadPriority | 线程优先级,默认Thread.NORM_PRIORITY,即5 |
daemon | 是否作为守护进程运行,默认true |
namePrefix | 线程的名字前缀 |
maxThreads | 该池的最大线程数,默认200 |
minSpareThreads | 最小空闲线程数,默认25 |
maxIdleTime | 关闭空闲线程的延迟时间,默认60000ms |
maxQueueSize | 排队等候处理的任务最大数量 |
prestartminSpareThreads | 是否启动时就创建minSpare数量的线程,默认false |
用于表示一个连接器。连接器分为两种:HTTP、AJP。前者支持HTTP/1.1协议,可以让Tomcat作为独立Web服务器运行。我们这里主要讨论HTTP连接器。
Connector可以使用在其前面定义的Executor
属性名称 | 说明 |
allowTrace | 是否支持HTTP的TRACE方法,默认false |
asyncTimeout | 异步请求的超时,默认10000ms |
enableLookups | 启用后可以通过DNS查找客户端的主机名,默认false |
maxHeaderCount | 请求中最多包含请求头的数量,如果超过限制,请求被拒绝,默认100 |
maxParameterCount | GET/POST请求参数(键值对)的最大数量,超过的被忽略,默认10000 |
maxPostSize | FORM URL参数解析能处理POST请求的最大尺寸,默认2MB |
maxSavePostSize | 容器在对客户端进行表单验证,或者客户端证书认证期间,最大缓存的POST请求大小,默认4KB |
parseBodyMethods |
用于像处理POST那样,解析其它HTTP方法的请求体部分,默认POST,支持逗号分隔的HTTP方法名,TRACE不支持。 该配置用于支持某些RESTful风格的APP,该APP期望通过请求体传递参数 |
port | 该连接器的监听端口 |
protocol |
制定用于处理入站请求的协议。默认值是在基于Java的阻塞协议和APR/本地库协议之间自动选择。如果PATH(Windows)或LD_LIBRARY_PATH(Linux)环境变量包含Tomcat本地库,则自动启用APR本地库协议。可以精确设定: org.apache.coyote.http11.Http11Protocol 阻塞的Java连接器 |
proxyName | 如果使用了代理配置,该配置的值将作为request.getServerName()的返回值 |
proxyPort | 如果使用了代理配置,该配置的值将作为request.getServerPort()的返回值 |
redirectPort | 如果如果连接器支持非SSL请求,当接收到某个匹配security-constraint的请求时,将自动重定向到此端口 |
scheme | 该属性影响request.getScheme()的返回值,默认值http,对于SSL连接器,应当设置为https |
secure | 该属性影响request.isSecure()的返回值,默认false,对于SSL连接器,应当设置为true |
URIEncoding | URI字节被编码的方式,默认ISO-8859-1 |
useBodyEncodingForURI | 用于指示contentType指定的编码方式是否用于URI解析,默认false |
acceptCount | 入站请求队列(当所有工作线程都被使用,新的请求将在此排队)的最大数量,超过此配置的连接请求被拒绝,默认100 |
acceptorThreadCount | 用于接受连接的线程数量,在多核心的服务器上、或者具有大量keep-alive连接的场景下可以增大此值,默认为1 |
acceptorThreadPriority | 用于接受连接的线程的优先级,默认java.lang.Thread.NORM_PRIORITY |
address | 连接器在哪个IP上监听,默认0.0.0.0,即所有IP |
bindOnInit | 控制何时绑定Socket,如果设置为false,则连接器启动后才会绑定 |
compressableMimeType |
逗号分隔的支持HTTP压缩的的MIME类型,默认text/html,text/xml,text/plain,text/css |
compression | 为节省服务器带宽,可以支持HTTP/1.1 GZIP压缩。该配置项可以配置为off/on/force,分别表示禁用、启用(压缩文本数据)、强制(压缩所有数据) |
compressionMinSize | 启用压缩的最小尺寸,默认2048 |
connectionLinger | 此连接器使用套接字被关闭时,套接字处于linger状态(等待所有数据报发出)秒数,默认-1表示禁用 |
connectionTimeout | 在接受(accept)连接请求后,等待请求数据到达的时间,默认60000ms |
connectionUploadTimeout | 文件上传最大超时时间,禁在disableUploadTimeout=false时有用 |
disableUploadTimeout | 如果设置为false,则可以自定义文件上传的超时 |
executor | 对Executor元素的name属性的引用。用于指定共享的线程池。设置该属性并且目标Executor存在,则连接器会使用目标Executor,所有线程有关的属性被忽视;否则会使用私有的Executor |
executorTerminationTimeoutMillis | 私有Executor在关闭连接器之前,等待请求处理线程终止的时间,默认BIO是0ms,NIO、APR是5000ms |
keepAliveTimeout | 在等待某个客户端下一个HTTP请求到达前,维持底层TCP连接的最大时间。默认值与connectionTimeout相同 |
maxConnections | 同时最大处理的连接数,如果超过该数目,Tomcat会继续接受(直到超过acceptCount),但是不处理请求,这些请求会一直阻塞知道活动连接数小于maxConnections。对于BIO,默认值与maxThreads相同;对于NIO,默认值10000;对于APR,默认值8192 |
maxHttpHeaderSize | HTTP请求/响应头的最大尺寸,默认8KB |
maxKeepAliveRequests | 最大keep-alive连接的数量,默认100 |
maxThreads | 此连接器最多创建的请求处理线程的数量。默认值200 |
minSpareThreads | 一直保持运行的线程的最小数量,默认10 |
noCompressionUserAgents | 不使用压缩的user-agent类型,使用正则式 |
processorCache | 缓存处理器对象(Processor Object)有利于提高性能。使用Servlet 3.0异步处理时,设置为期望的最大同时请求数;否则设置为maxThreads大小,默认200 |
restrictedUserAgents | 指定一个正则式,匹配的user-agent将不使用keep-alive |
server | 覆盖响应头server,默认Apache-Coyote/1.1 |
socketBuffer | 套接字输出缓冲的大小,默认9000字节 |
SSLEnabled | 设置为true,为该连接器启用SSL支持。启用后,应当设置scheme、secure |
tcpNoDelay | 启用服务器端套接字对象的TCP_NO_DELAY,默认true |
threadPriority | 处理线程的优先级,默认java.lang.Thread.NORM_PRIORITY |
upgradeAsyncWriteBufferSize | 对于无法在单步操作完成的异步写,分配的默认缓冲大小,无法写入的数据将放在缓冲中直到其可被写入,默认8192字节 |
BIO/NIO连接器支持的Java TCP套接字属性 | |
int socket.rxBufSize | 套接字接收缓冲(SO_RCVBUF),默认使用JVM缺省值 |
int socket.txBufSize | 套接字发送缓冲(SO_SNDBUF),默认使用JVM缺省值 |
bool socket.tcpNoDelay | 与tcpNoDelay属性同功 |
bool socket.soKeepAlive | 套接字保活设置(SO_KEEPALIVE),默认使用JVM缺省值 |
bool socket.ooBInline | 套接字OOBINLINE设置,默认使用JVM缺省值 |
bool socket.soReuseAddress | 套接字地址重用属性(SO_REUSEADDR),默认使用JVM缺省值 |
bool socket.soLingerOn |
分别为:是否启用套接字SO_LINGER,套接字SO_LINGER的时间。与connectionLinger 同功 |
int socket.soLingerTime | |
int socket.soTimeout | 与connectionTimeout同功 |
int socket.performanceConnectionTime | 与TCP性能有关的配置项,参考Java API:Socket.setPerformancePreferences |
int socket.performanceLatency | |
int socket.performanceBandwidth | |
int socket.unlockTimeout | 连接器停止后,套接字解锁时间,默认250ms |
BIO特有配置 | |
disableKeepAlivePercentage | keep-alive最多占用的处理线程的比例,超过后将禁止使用keep-alive |
NIO特有配置 | |
int pollerThreadCount | 用于轮询事件的线程的数量。默认1。由于操作系统在accept连接时会持有全局锁,修改此配置一般不会带来性能提升 |
int pollerThreadPriority | 轮询线程的优先级,默认java.lang.Thread.NORM_PRIORITY |
int selectorTimeout | 轮询线程调用select()时的超时时间,默认1000ms。由于连接清理由轮询线程执行,所有不应该设置的过大 |
bool useComet | 是否允许 comet servlets,这是一种异步的、推送式的通信机制。默认true |
bool useSendfile | 是否支持sendfile特性,以提升通过网络发送文件的性能。默认true |
bool socket.directBuffer | 是否使用直接ByteBuffer。如果启用,应当设置-XX:MaxDirectMemorySize=xxm。默认false |
int socket.appReadBufSize | 每个建立的TCP连接具有一个读ByteBuffer,该属性控制此Buffer的大小。默认8192字节。对于较小的并发度,可以适当增加此值;对于极多的keep-alive连接应当减少此值或者增加堆尺寸 |
int socket.appWriteBufSize | 每个建立的TCP连接具有一个写ByteBuffer,该属性控制此Buffer的大小。默认8192字节。此默认值偏小,除非需要处理上万的同时连接请求,应当增加此值;对于极多的keep-alive连接应当减少此值或者增加堆尺寸 |
int socket.bufferPool | NIO连接器缓存的NioChannel对象的数量,缓存这种对象有利于减少垃圾回收。默认500 |
int socket.bufferPoolSize |
NioChannel缓存亦可以字节而不是个数配置,规则如下: NioChannel的BufferPoolSize = ReadBufSize + WriteBufSize SecureNioChannel的BufferPoolSize = appReadBufSize + appWriteBufSize + networkReadBufSize + networkWriteBufSize 默认值1000*1000*100字节(100MB) |
int socket.processorCache | NIO连接器缓存SocketProcessor对象的数量,缓存这种对象有利于减少垃圾回收。默认500 |
int socket.keyCache | NIO连接器缓存KeyAttachment对象的数量,缓存这种对象有利于减少垃圾回收。默认500 |
int socket.eventCache | NIO连接器缓存PollerEvent对象的数量,缓存这种对象有利于减少垃圾回收。默认500 |
int selectorPool.maxSelectors | 最大的Selector对象数量,默认200。命令行参数org.apache.tomcat.util.net.NioSelectorShared=false时可以配置该参数 |
int selectorPool.maxSpareSelectors | 池中维持的空闲Selector对象的最大数量 |
int oomParachute | NIO连接器实现了一种OutOfMemoryError策略,它持有一块内存,当OOM发生时,这块内存立即释放,VM可以利用此空间进行清理。默认1mb |
APR特有配置 | |
deferAccept | 设置此连接器的侦听套接字的TCP_DEFER_ACCEPT标记,默认true(如果OS支持) |
pollerSize | 同时支持Keep-alive的连接数,默认8192 |
pollTime | 轮询间隔,默认2000ms |
sendfileSize | 同时最多支持异步发送静态文件的套接字数量,默认1024 |
threadPriority | Poller线程的优先级,默认5 |
useComet | 是否使用comet servlets,默认true |
useSendfile | 是否使用sendfile特性,默认true |
BIO/NIO支持的SSL相关属性 | |
algorithm | 证书编码算法,默认是KeyManagerFactory.getDefaultAlgorithm()的返回值,SUN的JDK返回SunX509 |
useServerCipherSuitesOrder | 设置为true,强制使用服务器的密码顺序;否则根据客户端自动选择。仅Java8+支持 |
ciphers | 逗号分隔的、支持的密码算法,仅列出的且SSL实现支持的算法会被使用。ALL表示启用所有算法,应当仅用于测试 |
clientAuth | 设置为true,在accept之前要求客户端提供一个有效的证书链;设置为want,要求客户端提供证书,但是没有的话也不会失败;设置为false默认不需要客户端证书 |
clientCertProvider | 客户端证书不是以java.security.cert.X509Certificate形式提供时,需要设置该选项 |
crlFile | 用于验证客户端证书有效性的证书吊销列表文件 |
keyAlias | keystore中服务器私钥/证书的别名,如果不指定,将使用keystore中第一个读取到的key |
keyPass | keystore文件中服务器证书的访问密码,默认changeit |
keystoreFile | keystore文件的路径,默认从用户的HOME目录中寻找*.keystore文件 |
keystorePass | keystore文件本身的密码,默认与keyPass相同 |
keystoreProvider | keystore提供者的名称 |
keystoreType | keystore文件的类型,默认JKS |
sessionCacheSize | SSL会话缓存的数量,默认0,表示无限制 |
sessionTimeout | SSL会话过期时间,默认86400s |
sslEnabledProtocols | 逗号分隔的SSL协议类型。如果不指定,使用JVM缺省值 |
sslImplementationName | SSL实现的类名,默认org.apache.tomcat.util.net.jsse.JSSEImplementation |
sslProtocol | 使用的SSL协议,默认TLS |
trustManagerClassName | 受信任管理器类的名称,目标类必须实现javax.net.ssl.X509TrustManager且具有0参构造器。如果不指定,trust store属性被忽略 |
trustMaxCertLength | 验证客户端证书时,最多允许的中间证书数量,默认5 |
truststoreAlgorithm | truststore使用的算法,默认javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm() |
truststoreFile | truststore文件的位置,默认使用系统属性javax.net.ssl.trustStore |
truststorePass | truststore的访问密码,默认使用系统属性javax.net.ssl.trustStorePassword |
truststoreProvider | truststore的提供者,默认使用系统属性javax.net.ssl.trustStoreProvider,如果没有此系统属性,则使用keystoreProvider |
truststoreType | truststore的keystore类型,默认使用系统属性 javax.net.ssl.trustStoreType,如果没有此系统属性,则使用keystoreType |
Engine用于表示整个Service的请求处理机制,它接收一个或者多个Connecter的请求,并返回处理好的响应。
Cluster、Engine、Host、Context统称为容器,他们有一些共同的属性,例如Realm。
属性名称 | 说明 |
backgroundProcessorDelay | 该引擎及其子容器的backgroundProcess方法被调用的延迟。默认10s |
className | 引擎实现类的名称,必须实现org.apache.catalina.Engine接口。默认org.apache.catalina.core.StandardEngine |
defaultHost | 默认的host名称,必须是某个嵌套的host元素的name属性。用于识别默认处理请求的虚拟主机 |
jvmRoute |
在负载均衡场景下,用于实现会话关联(session affinity)的标识符,此标识符在Tomcat集群内必须唯一。标识符将被附加到生成的会话标识符的尾部,以便于前端代理总是把特定会话的请求发送给特定的Tomcat实例。 亦可通过系统属性jvmRoute来设置 |
name | 该引擎的逻辑名称,在错误信息、日志中使用,必须唯一 |
startStopThreads | 用于并发启动host子元素的线程数量。设置为0,将使用Runtime.getRuntime().availableProcessors() |
元素名称 | 说明 | ||||
Host | 支持一个或者多个,每个代表单独的虚拟主机。至少具有一个host元素,且其name=engine.defaultHost | ||||
Realm | 支持一个。用于指定用户、及其关联角色的数据库,此数据库在所有Host、Context中共享,除非他们单独设定 | ||||
Value |
可以用于定制多种特性 访问日志元素:可以作为Engine、Host、Context的子元素,记录Web服务的访问日志
请求过滤元素:可以作为Engine、Host、Context的子元素,通过IP地址、主机名来接受或者拒绝请求
|
||||
Listener |
引擎生命周期监听器配置。任何实现org.apache.catalina.LifecycleListener接口的类被支持 |
该元素用于代表一个虚拟主机,虚拟主机通常用于和服务器的某个网络名称(域名,例如blog.gmem.cc)关联。通过虚拟主机别名,可以把多个网络名称关联到一个虚拟主机。
一个Engine内可以包含多个虚拟主机,每个虚拟主机内部可以嵌套Context。
属性名称 | 说明 |
appBase | 该虚拟主机的应用根目录,支持绝对路径,默认webapps |
xmlBase | 该虚拟主机的部署描述符文件所在目录,默认 conf/[engine_name]/[host_name] |
createDirs | 是否在启动时自动创建缺少的appBase、xmlBase目录 |
autoDeploy | 是否支持自动部署,如果设置为true,Tomcat定期检查appBase、xmlBase目录,检查是否有新的应用或者部署描述符的变化。默认true |
backgroundProcessorDelay | backgroundProcess延迟调用时间,默认-1,表示依赖于上层Engine的配置 |
className | 虚拟主机实现类的名称,必须实现org.apache.catalina.Host。默认org.apache.catalina.core.StandardHost |
deployIgnore | 用于限制autoDeploy、deployOnStartup的路径的正则式,路径相对于appBase |
deployOnStartup | 是否在Tomcat启动时自动部署,默认true |
failCtxIfServletStartFails | 对虚拟主机下每个Context生效,是否只要有一个load-on-startup的Servlet失败,即导致Context失败。默认false |
name | 通常是该虚拟主机对应的网络名称(域名) |
startStopThreads | 该虚拟主机用于并发启动Context的线程数,默认Runtime.getRuntime().availableProcessors() |
undeployOldVersions | 是否自动移除老的、不使用的版本的应用程序 |
org.apache.catalina.core.StandardHost的属性 | |
copyXML | 设置为true,则自动把嵌入在应用war包的/META-INF/context.xml中的部署描述符拷贝到xmlBase,下次启动将生效。默认false。如果deployXML=false该配置无效 |
deployXML | 设置为false,可以禁止 /META-INF/context.xml生效 |
unpackWARs | 设置为true,war包自动解压,否则直接运行war |
workDir | 该虚拟主机的工作目录,默认$CATALINA_BASE/work的某个子文件夹 |
元素名称 | 说明 |
Realm | 供此主机下所有Context共享的Realm |
Value | 访问日志、请求过滤器、单点登录配置 |
Alias | 定义此虚拟主机的别名,可以关联多个解析到当前服务器的域名 |
Listener | 生命周期监听器 |
在很多应用场景下,一个虚拟主机下的多个Web应用需要使用单点登录特性。可以参考如下的方式启用某个虚拟主机的单点登录支持:
1 2 3 |
<Host name="localhost" > <Valve className="org.apache.catalina.authenticator.SingleSignOn"/> </Host> |
单点登录依据如下规则运作:
- 虚拟主机下所有Web应用共享同一Realm,因此Context不得自行定制Realm
- 用户访问非受保护资源时,不需要进行验证
- 用户一旦访问受保护资源时,必须使用正在访问的Web应用定义的登录方法进行验证
- 一旦验证完毕,用户关联的角色将用于所有Web应用的访问控制
- 一旦用户从某个Web应用登出,后续对受保护资源的访问需要身份验证
- SSO使用HTTP Cookie来发送每个请求,Cookie中包含用户的标识符
Realm元素代表了一个包含用户名、密码、角色(相当于Unix的groups)信息的数据库,不同的Realm实现允许Tomcat与既有的用户身份验证与授权机制结合,实现Servlet规范规定的容器管理安全性(Container Managed Security)
属性名称 | 说明 |
className | Realm实现类,必须实现org.apache.catalina.Realm接口,该属性必须指定 |
org.apache.catalina.realm.JDBCRealm 该Realm允许Tomcat连接到关系型数据库来获取用户名、密码及其关联的角色。当验证新的登录请求时,用户密码的修改会立即被感知 |
|
allRolesMode | 处理web.xml中定义的授权约束时,对特殊角色“*”的处理方式。默认值strict表示用户必须授予web.xml中定义的一个角色;authOnly表示仅仅进行身份验证,不检查其角色;strictAuthOnly与authOnly类似,但是如果角色是在web.xml中定义的,则用户必须被授予一个角色 |
connectionName | JDBC用户名 |
connectionPassword | JDBC密码 |
connectionURL | JDBC的URL |
digest | 用于散列数据库中的用户密码的算法,如果不指定,认为是明文密码 |
digestEncoding | 散列算法的字符集,默认使用平台的缺省编码 |
driverName | JDBC驱动类名 |
roleNameCol | 定义在用户角色表中的角色列 |
userCredCol | 定义在用户表中的密码列 |
userNameCol | 定义在用户表、角色表中的用户名列 |
userRoleTable | 角色表名称 |
userTable | 用户表名称 |
X509UsernameRetrieverClassName | 当使用客户端X509证书时,该配置指定从证书中获取用户名的类。该类必须实现org.apache.catalina.realm.X509UsernameRetriever接口。默认使用证书的SubjectDN字段作为用户名 |
org.apache.catalina.realm.UserDatabaseRealm 基于一个全局的JNDI资源来实现Realm |
|
allRolesMode | (同上) |
resourceName | 全局的UserDatabase资源名称,Realm用来定位用户名、密码、角色 |
X509UsernameRetrieverClassName | (同上) |
org.apache.catalina.realm.JAASRealm 通过JAAS(Java认证与授权服务)框架来验证用户身份的Realm。基于JASS的登录模块(javax.security.auth.spi.LoginModule)和安全主体(javax.security.Principal),可以开发自己的安全机制,或者与任何第三方安全机制进行集成。 |
|
allRolesMode | (同上) |
appName | JAAS LoginConfig中的应用程序名称 |
userClassNames | 逗号分隔的类名,用于生成用户的安全主体对象 |
configFile | JAAS配置文件,如果不指定,使用JVM默认的JAAS配置 |
roleClassNames | 逗号分隔的类名,用于生成角色的安全主体对象 |
useContextClassLoader | 使用上下文类加载器来加载用户定义的LoginModule、Principal 类 |
X509UsernameRetrieverClassName | (同上) |
org.apache.catalina.realm.CombinedRealm 可以通过一个或者多个子Realm来进行身份验证。子Realm元素嵌套指定 |
|
org.apache.catalina.realm.LockOutRealm 是CombinedRealm的子类型,提供锁定机制,防止用户猜测密码反复尝试 |
|
allRolesMode | (同上) |
cacheSize | 认证失败的用户的缓存,默认1000 |
failureCount | 锁定前允许的最大失败次数,默认5 |
lockOutTime | 锁定时间,默认300s |
元素名称 | |
Realm | CombinedRealm的实现(例如LockOutRealm)支持嵌套的Realm元素 |
用于表示一个运行在某个特定虚拟主机下的Web应用。每个Web应用对应于符合Servlet 2.2+规范的war包,或者war包解压的目录结构。
Tomcat通过定义的Context path来将HTTP请求与相应的Web应用关联起来。
每个Context在虚拟主机下必须具有唯一的名称,且应当有一个Context Path为0长字符串的Context作为虚拟主机的默认上下文,默认上下文处理与其它上下文不匹配的所有请求。
Tomcat支持在同一个Context path下部署一个Web应用的多个版本,遵守如下规则:
- 如果请求中不包含会话信息,使用最新的应用版本
- 如果请求中包含会话信息,检查每个版本的会话管理器,找到匹配的应用版本并使用
- 在第2条中,如果找不到匹配的应用版本,则使用最新的版本
虚拟主机可以配置undeployOldVersions属性,使旧版本的Web应用在无人使用时自动移除。
context name、context path、context version、 base file name是一组相关的概念,可以参考下表的例子理解:
Context Path | Context Version | Context Name | Base File Name | 样例文件名称 (.xml, .war和目录) |
/foo | None | /foo | foo | foo.xml, foo.war, foo |
/foo/bar | None | /foo/bar | foo#bar | foo#bar.xml, foo#bar.war, foo#bar |
Empty String | None | Empty String | ROOT | ROOT.xml, ROOT.war, ROOT |
/foo | 42 | /foo##42 | foo##42 | foo##42.xml, foo##42.war, foo##42 |
/foo/bar | 42 | /foo/bar##42 | foo#bar##42 | foo#bar##42.xml, foo#bar##42.war, foo#bar##42 |
Empty String | 42 | ##42 | ROOT##42 | ROOT##42.xml, ROOT##42.war, ROOT##42 |
如果想使用于War包或者目录名称无关的上下文路径来部署一个Web应用,可以:
- 禁用autoDeploy、deployOnStartup,并且在server.xml中定义所有的上下文
- 或者,将目录或者War包置于虚拟主机的appBase目录之外,然后使用context.xml、docBase属性来定义Web应用
不建议在server.xml中定义上下文,因为server.xml只能在Tomcat重启时加载。
单个上下文可以使用如下方式明确定义:
- 在Web应用的/META-INF/context.xml文件中定义。如果虚拟主机配置了copyXML该文件会被拷贝到$CATALINA_BASE/conf/[enginename]/[hostname]/目录下,并且重命名为Web应用的文件基名.xml
- 在$CATALINA_BASE/conf/[enginename]/[hostname]/ 目录下直接定义XML文件,上下文路径、版本将通过文件基名判定
- 在server.xml的Host元素内部定义
默认的上下文配置信息会应用到所有相关的上下文,并且被上下文的同名属性覆盖:
- $CATALINA_BASE/conf/context.xml:应用到所有Web应用的上下文配置
- $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default,应用到虚拟主机下所有Web应用的上下文配置
除了明确定义,在启用了autoDeploy、deployOnStartup的情况下,Tomcat会自动识别Web应用。
属性名称 | 说明 |
allowCasualMultipartParsing | 默认false,设置为非false将导致Tomcat与Servlet规范不兼容。如果设置为true,调用 HttpServletRequest.getPart*或者HttpServletRequest.getParameter*时Tomcat会自动解析multipart/form-data请求体 |
backgroundProcessorDelay | (同Host) |
className | 上下文实现类的名称,必须实现org.apache.catalina.Context。默认 org.apache.catalina.core.StandardContext |
cookies | 默认true,设置为true将使用Cookie来存放会话标识符。设置为false将依赖于应用的会话重写来传递会话标识符 |
crossContext | 默认false,设置为true将使当前上下文中的ServletContext.getContext()调用返回同一虚拟主机下其他请求分发器对象 |
docBase | 应用程序目录或者War包所在位置,可以指定相对于虚拟主机appBase的路径,或者绝对路径 |
failCtxIfServletStartFails | (同Host) |
logEffectiveWebXml | 设置为true,将在INFO级别打印有效的web.xml,有效web.xml有应用程序的web.xml与Tomcat默认web.xml、以及注解等合并而成 |
override | 设置为true,将忽略全局或者主机默认的context.xml配置 |
path | 该Web应用的上下文路径(Context path ) |
reloadable | 设置为true,Tomcat将监控/WEB-INF/classes/、/WEB-INF/lib中类的变化,一旦发现变化将自动重新加载Web应用。默认false |
sessionCookieDomain | 会话Cookie的域(Domain)设置,可以用来实现二级域名会话共享,例如可以设置为".gmem.cc" |
sessionCookieName | 会话Cookie名称的设置,默认JSESSIONID |
sessionCookiePath |
会话Cookie存放路径,如果设置为"/",那么该主机下所有其他也设置为"/"的Web应用将共享Session ID 路径用于指定Cookie关联的Web页面,如果创建一个路径/wp-admin的Cookie,那么域/wp-admin/目录下所有的地址均共享此会话 |
sessionCookiePathUsesTrailingSlash | 某些浏览器(例如IE)会将/foo的Cookie传递给/foobar应用,设置为true可以阻止这一行为,默认true |
swallowOutput | 重定向stdout、stderr到Web应用的日志,默认false |
useHttpOnly | 设置HttpOnly标记,以防止客户端脚本访问Session ID,默认true |
org.apache.catalina.core.StandardContext | |
addWebinfClassesResources | 除了Web应用JAR包的 META-INF/resources之外,WEB-INF/classes/META-INF/resources中的内容也作为静态资源。仅支持Servlet3.0+ |
aliases |
该属性用于配置一些额外的位置,用于指定Web应用的资源。格式必须为:"/aliasPath1=docBase1,/aliasPath2=docBase2" aliasPathN表示子路径,前导必须为/,不支持"/" docBaseN表示子路径对应的War包或者目录 |
cacheMaxSize | 静态资源缓存池最大尺寸,默认10240KB(10MB) |
cacheObjectMaxSize | 会被缓存的静态资源的最大尺寸,默认512KB |
cacheTTL | 缓存条目重验证时间,默认5000ms |
cachingAllowed | 是否支持静态资源缓存,默认true |
copyXML | 设置为true,将拷贝 /META-INF/context.xml的上下文描述符到虚拟主机的XMLBase目录下 |
unloadDelay | 等待Servlet卸载的时间,默认2000ms |
unpackWAR | 覆盖Host的设置 |
useNaming | 设置为true,Tomcat将为该应用启用一个JNDI初始上下文(InitialContext) |
workDir | 设置工作目录 |
元素名称 | 说明 |
Loader | 配置应用程序加载器,一般默认加载器足够使用 |
Manager | 配置使用的会话管理器,用于创建、销毁、持久化该Web应用的HTTP会话 |
Realm | (同Host) |
Value | (同Host) |
Listener | (同Host) |
Resources | 配置资源管理器,用于访问该应用关联的静态资源,默认资源管理器足够 |
Resource | 定义JNDI资源 |
WatchedResource | 用于监控应用状态并重启应用,其元素文本必须是一个字符串 |
Parameter | 用于配置上下文参数 |
用于管理特定应用程序的会话。该元素可以配置在Context元素内部。
属性名称 | 说明 |
className | 会话管理器实现类的名称,必须是org.apache.catalina.Manager接口的实现,默认org.apache.catalina.session.StandardManager |
distributable | 设置为true则会话管理器强制Servlet规范的要求——这意味着所有的会话属性必须是java.io.Serializable |
maxActiveSessions | 支持的最大会话数量 |
maxInactiveInterval | 会话超时,默认1800s |
sessionIdLength | Session ID的长度,默认16。应当通过嵌套的SessionIdGenerator元素设置 |
org.apache.catalina.session.StandardManager | |
pathname | 会话持久化文件的绝对或者相对路径,应用重启后将恢复会话,默认SESSIONS.ser |
processExpiresFrequency | 会话过期处理的频度,默认6 |
secureRandomClass | 继承自java.security.SecureRandom的用于生成Session ID的类。默认java.security.SecureRandom |
secureRandomProvider | 用于创建java.security.SecureRandom实例的类 |
secureRandomAlgorithm | java.security.SecureRandom使用的算法 |
org.apache.catalina.session.PersistentManager 必须设置系统属性:org.apache.catalina.session.StandardSession.ACTIVITY_CHECK或者org.apache.catalina.STRICT_SERVLET_COMPLIANCE以使持久化会话管理器正常工作。 PersistentManager会把不活动的会话交换到持久化存储中,在正常的重启过程中,也会保存/恢复相应的会话 |
|
maxIdleBackup | 会话空闲最大时间,超过此时间则可能被持久化,默认禁用 |
maxIdleSwap | 会话空闲最大时间,超过此时间则应该被持久化,默认禁用 |
saveOnRestart | 当Tomcat或者应用被重启/重新载入时,是否所有的会话应该被持久化 |
processExpiresFrequency | (同上) |
secureRandomClass | (同上) |
secureRandomProvider | (同上) |
secureRandomAlgorithm | (同上) |
元素名称 | 说明 |
SessionIdGenerator | 会话ID生成器 |
Store | 仅用于持久化的管理器实现,用于指定会话的存储 |
用于表示某个持久化的会话管理器的存储方式,支持文件、数据库等方式
属性名称 | 说明 |
className | Store实现类的名称,必须实现org.apache.catalina.Store接口 |
checkInterval | 检查会话expired,以交换出去的间隔时间,默认60s |
org.apache.catalina.session.FileStore | |
directory | 存放每个会话文件的相对或者绝对路径 |
用于为会话管理器指定Session ID的生成规则
属性名称 | 说明 |
className | 实现类的名称,必须是org.apache.catalina.SessionIdGenerator的实现。默认org.apache.catalina.util.StandardSessionIdGenerator |
jvmRoute | 当前Tomcat实例的路由标记,将被附加到Session ID以实现会话关联的负载均衡 |
sessionIdLength | Session ID的长度 |
1 2 3 4 5 6 7 |
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="/usr/local/ssl2/server/server.p12" keystorePass="111111" keystoreType="PKCS12" truststoreFile="/usr/local/ssl2/jks/trust.keystore" truststorePass="123456" truststoreType="JKS" SSLCertificateFile="/usr/local/ssl2/server/server-cert.cer" SSLCertificateKeyFile="/usr/local/ssl2/server/server-key.pem" /> |
Leave a Reply