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