小程序网站开发怎么样,免费的素材库,网页设计就是做网站优化的吗,wordpress媒体库里文件转载自 Tomcat server.xml配置示例几乎所有容器类型的应用都会包含一个名为 server.xml 的文件结构。基本上#xff0c;其中的每个元数据或者配置都是容器完成初始化所需要的。正是由于这些内容都是可配置的#xff0c;使得软件设计者或架构师可以在容器运行时或销毁时其中的每个元数据或者配置都是容器完成初始化所需要的。正是由于这些内容都是可配置的使得软件设计者或架构师可以在容器运行时或销毁时停止的情况下注入需要的服务。明白这一点其重要性不亚于明白代码或软件的工作机制。
对于这篇文章我们将通过分析 server.xml 文件来理解和配置 appache tomcat 服务器。
准备工作
安装 Apache Tomcat 7。从 apache tomcat 的网站获取源码
安装教程可以点击这里。
1、Tomcat 安装目录
安装完成 的tomcat被放在了你的本地存储中。对于 windows 通常在 “ Program Files ” 文件夹下对于 Mac 或者 Linux可能在 /user/var/opt 或 /User//Application 文件夹下。进入该目录可以看到下面这几个文件和文件夹
binTomcat 二进制启动脚本。conf应用于所有 webapp 的全局配置。默认会提供如下配置catalina.policy 提供特殊的安全策略。两个 Properties 文件catalina.properties 和 logging.properties 四个 XML 配置文件server.xmlTomcat 主配置文件、web.xmlweb 应用全局部署描述、context.xmlTomcat 特殊配置全局选项和 tomcat-user.xml授权和访问控制用户名密码和角色数据库。每个引擎在conf 目录下都有一个对应的子目录例如Catalina反过来对于每个 host 都有一个二级子目录比如localhost。可以将上下文信息配置放在这里类似于 context.xml 但是对于每个在 host 下的 webapp 该文件命名为 webapp.xml 。lib确保目录下的 JAR-file 对于所有 webapp 都有效。默认安装包括 servlet-api.jarServletjasper.jarJSP和 jasper-el.jarEL。外部的 JAR 文件也可以放在这里如 MySQL JDBC 驱动mysql-connector-java-5.1.{xx}-bin.jar )和 JSTLjstl.jar 和 standard.jar。logs包括引擎日志文件 Catalina.{yyyy-mm-dd}.log host 日志文件 localhost.{yyyy-mm-dd}.log和其它应用的日志文件如 manager 和 host-manager。访问日志由 AccessLogValve 创建也放在这里。
webapps默认为 appBase – web应用的根目录。work: contains the translated servlet source files and classes of JSP/JSF. Organized in hierarchy of engine name (Catalina), host name (localhost), webapp name, followed by the Java classes package structure.temp临时文件。
2、Tomcat 架构
Tomcat 是一个 HTTP 服务器。也是一个servlet 容器可以执行 Java Servlet将 JavaServer PageJSP和 JavaServerFacesJSF转换为 Java Servlet。Tomcat 采用了层次化和模块化的架构如下图片1.0 Tomcat 架构3、主配置文件server.xmlserver.xml
“server.xml” 是 Tomcat 的主配置文件在 CATALINA_HOMEconf 目录下可以看到。重构后删掉注释和格式化后的默认”server.xml“文件如下
?xml version1.0 encodingutf-8?
Server port8005 shutdownSHUTDOWNListener classNameorg.apache.catalina.core.JasperListener /Listener classNameorg.apache.catalina.core.AprLifecycleListener SSLEngineon /Listener classNameorg.apache.catalina.core.JreMemoryLeakPreventionListener /Listener classNameorg.apache.catalina.mbeans.GlobalResourcesLifecycleListener /Listener classNameorg.apache.catalina.core.ThreadLocalLeakPreventionListener /GlobalNamingResourcesResource nameUserDatabase authContainertypeorg.apache.catalina.UserDatabasedescriptionUser database that can be updated and savedfactoryorg.apache.catalina.users.MemoryUserDatabaseFactorypathnameconf/tomcat-users.xml //GlobalNamingResourcesService nameCatalinaConnector port8080 protocolHTTP/1.1connectionTimeout20000redirectPort8443 /Connector port8009 protocolAJP/1.3 redirectPort8443 /Engine nameCatalina defaultHostlocalhostRealm classNameorg.apache.catalina.realm.LockOutRealmRealm classNameorg.apache.catalina.realm.UserDatabaseRealmresourceNameUserDatabase//RealmHost namelocalhost appBasewebappsunpackWARstrue autoDeploytrueValve classNameorg.apache.catalina.valves.AccessLogValve directorylogsprefixlocalhost_access_log. suffix.txtpattern%h %l %u %t %r %s %b //Host/Engine/Service
/Server3.1、Server
Server第二行是顶级组件代表一个 Tomcat 实例。可以包含一个或多个 Services 其中每个 Service 都有自己的 Engines 和 Connectors。
Server port8005 shutdownSHUTDOWN ...... /Server3.1.1、基本属性className使用 Java 实现类的名称。这个类必须实现 org.apache.catalina.Server 接口。如果没有指定类名将会使用标准实现。address server 在这个 TCP/IP 地址上监听一个 shutdown 命令。如果没有指定地址将会使用 localhost。portserver 在这个端口上监听一个 shutdown 命令。设置为 -1 表示禁用 shutdown 命令。shutdown连接到指定端口的 TCP/IP 收到这个命令字符后将会关闭 Tomcat。
3.2、ListenersServer 可以包含几个监听器。一个监听器监听指定事件并对其作出响应。
JasperListener 作用于 Jasper JSP 引擎该引擎负责对更新后的 JSP 页面进行重编译。
Listener classNameorg.apache.catalina.core.JasperListener /GlobalResourcesLifecycleListener 作用于全局资源保证 JNDI 对资源的可达性比如数据库。
Listener classNameorg.apache.catalina.mbeans.GlobalResourcesLifecycleListener /3.2.1、基本属性SSLEngine使用的SSLEngine名称。off不使用 SSLon使用 SSL 但不指定引擎。默认值是 on。会初始化本地 SSL 引擎对于使用 SSLEnabled 属性的 APR/native connector 来讲该选项必须可用。SSLRandomSeed指定伪随机数生成器PRNG的随机数种子源默认值为 builtin。在开发环境下可能要将其设置为 /dev/urandom , 以获得更快地启动速度。FIPSMode设置为 on 会请求 OpenSSL 进入 FIPS 模式如果 OpenSSL 已经处于 FIPS 模式将会保留该模式。设置为 enter 会强制 OpenSSL 进入 FIPS 模式如果 OpenSSL 已经处于 FIPS 模式将会产生一个错误。设置为 require 要求 OpenSSL 已经处于 FIPS 模式如果 OpenSSL 当前没有处于 FIPS 模式将会产生一个错误。
3.3、全局命名资源9到15行的元素定义了 JNDIJava 命名和目录接口资源其允许 Java 软件客户端通过名称搜寻和查找数据。
默认配置通过10到14行的元素定义了一个名称为 UserDatabase 的 JNDI通过”conf/tomcat-users.xml“得到了一个用于用户授权的内存数据库。
GlobalNamingResourcesResource nameUserDatabase authContainertypeorg.apache.catalina.UserDatabasedescriptionUser database that can be updated and savedfactoryorg.apache.catalina.users.MemoryUserDatabaseFactorypathnameconf/tomcat-users.xml /
/GlobalNamingResources你也可以定义其它全局化JNDI资源来实现连接池比如 MySQL 数据库。
3.4、Services一个 Service 可以连接一个或多个 Connectors 到一个引擎。默认配置定义了一个名为“Catalina”的 Service 连接了两个 ConnectorsHTTP 和 AJP 到当前的引擎。
Service nameCatalina ...... /Service3.4.1、基本属性className该实现使用的 Java 类名称。这个类必须实现 org.apache.catalina.Service 接口。如果没有指定类名称将会使用标准实现。nameService 的显示名称如果采用了标准的 Catalina 组件将会包含日志信息。每个 Service 与某个特定的 Server 关联的名称必须是唯一的。
3.5、Connectors一个 Connector 关联到一个 TCP 端口负责处理 Service 与客户端之间的交互。默认配置定义了两个 Connectors。
HTTP/1.1处理 HTTP 请求使得 Tomcat 成为了一个 HTTP 服务器。客户端可以通过 Connector 向服务器发送 HTTP 请求接收服务器端的 HTTP 响应信息。
Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /与生产服务默认使用80端口不同Tomcat HTTP 服务默认在 TCP 端口8080上运行 。你可以选择1024到65535之间的任意数字作为端口号来运行 Tomcat 服务器前提是该端口没有被任何其它应用使用。connectionTimeOut 属性定义了这个 connector 在链接获得同意之后获得请求 URI line请求信息响应的最大等待时间毫秒数。默认为20秒。redirect 属性会把 SSL 请求重定向到 TCP 的8443端口。AJP/1.3Apache JServ Protocol connector 处理 Tomcat 服务器与 Apache HTTP 服务器之间的交互。
Connector port8009 protocolAJP/1.3 redirectPort8443 /可以将 Tomcat 和 Apache HTTP 服务运行在一起Apache HTTP 服务器处理静态请求和 PHPTomcat 服务器负责处理 Java Servlet/JSP 。可以参阅“Tomcat 与 Apache 协同工作如何配置”。
3.6、容器包含了 Engine、Host、Context和 Cluster 的 Tomcat 称为容器。最高级的是 Engine最底层的是 Context。某些组件比如 Realm 和 Valve也可以放在容器中。
3.7、引擎引擎是容器中最高级别的部分。可以包含一个或多个 Host。Tomcat 服务器可以配置为运行在多个主机名上包括虚拟主机。
Engine nameCatalina defaultHostlocalhost/Catalina 引擎 从 HTTP connector 接收 HTTP 请求并根据请求头部信息中主机名或 IP 地址重定向到正确的主机上。
3.7.1、基本属性backgroundProcessorDelay —— 这个值表示了在这个引擎和它的子容器上调用 backgroundProcess 方法之间间隔的秒数包括所有 host 和 context。值为非负时不会调用子容器意味着其使用自身的处理线程。设置为正值会产生一个衍生线程。等待指定的时间之后该线程会在这个引擎和它的所有子容器上调用 backgroundProcess 方法。如果没有指定默认值为10即会有10秒的延迟。className实现该引擎使用的 Java 类名。该类必须实现 org.apache.catalina.Engine 接口。如果没有指定会使用标准值下面有定义。defaultHost默认主机名定义了处理指向该服务器的请求所在主机的名称但名称不是在这个文件中配置。jvmRoute在负载均衡场景下必须定义该参数来保证 session affinity 可用对于集群中所有 Tomcat 服务器来讲定义的名称必须是唯一的 该名称将会被添加到生成的会话标示符中因此允许前端代理总是将特定会话转发到同一个 Tomcat 实例。nameEngine 的逻辑名称用在日志和错误信息中。当在相同的 Server 中使用多个 Service 元素时每个 Engine 必须指定一个唯一的名称。startStopThreadsEngine 在启动 Host 子元素时将会并发使用的线程数目。如果设置为0将会使用 Runtime.getRuntime().availableProcessors() 的值。设置为负数将会使用 Runtime.getRuntime().availableProcessors() value 的值如果结果小于1将会使用 1 个线程。如果没有指定默认值为 1 。
3.8、Realm一个 Realm域就是一个包含 user、password 和 role 认证比如访问控制的数据库。你可以在任何容器中定义 Realm 例如 Engine、Host、Context 和 Cluster。
Realm classNameorg.apache.catalina.realm.LockOutRealmRealm classNameorg.apache.catalina.realm.UserDatabaseRealm resourceNameUserDatabase/
/Realm默认配置定义了一个 Catalina Engine 的 RealmUserDatabaseRealm对用户访问 engine 的权限进行控制。其使用定义在 GlobalNamingResources 中名字为 UserDatabase 的 JNDI。
除了 UserDatabaseRealm 以外还有JDBCRealm授权用户是否可以通过 JDBC 驱动链接到关系型数据库DataSourceRealm通过 JNDI 连到数据源JNDIRealm连接到一个 LDAP 目录和 MemoryRealm 将 XML 文件加载到内存。
3.8.1、基本属性className使用 Java 实现类的名称。这个类必须实现 org.apache.catalina.Realm 接口。
3.9、Hosts一个 Host 定义了在 Engine 下的一个虚拟机反过来其又支持多个 Contextweb 应用。
Host namelocalhost appBasewebapps unpackWARstrue autoDeploytrue/默认配置定义了一个名为 localhost 的主机。appBase 属性定义了所有 webapp 的根目录在这种情况下是 webapps。默认情况下每一个 webapp 的 URL 和它所在的目录名称相同。例如默认的 Tomcat 安装目录的 webapps 下提供了四个 web 应用docs、examples、host-manager 和 manager。只有 ROOT 是个例外它用一个空字符串定义。也就是说它的 URL 是 http://localhost:8080/。unpackWARs 属性指定了放到 webapps 目录下的 WAR-file 是否应该被解压。对于 unpackWARs”false“Tomcat 将会直接从 WAR-file 运行应用而不解压这可能导致应用运行变慢。autoDeploy 属性指定了是否自动部署放到 webapps 目录下的应用。
3.9.1、基本属性appBase虚拟机应用的根目录。该目录是一个可能包含部署到虚拟机上 web 应用的路径名。也可能是一个指定的绝对路径名或者是一个相对于 $CATALINA_BASE 目录的路径名。如果没有指定默认会使用 webapps。xmlBase虚拟机 XML 根目录。该目录是一个可能包含部署到虚拟机上context XML 描述符的路径名。也可能是一个指定的绝对路径名或者是一个相对于 $CATALINA_BASE 目录的路径名。如果没有指定默认会使用 conf/ 目录。createDirs如果设置为 trueTomcat 将会在启动阶段尝试创建一个由 appBase 和 xmlBase 属性定义的目录。默认值是 true。如果设置为 true 并且目录创建失败将会打印出一个错误信息但是不会终止启动过程。autoDeploy该属性的值指明了在 Tomcat 运行的时候是否需要定时检查新的或者更新后的 web 应用。如果为 trueTomcat 会定时检查 appBase 和 xmlBase 目录并对找到的新 web 应用和 context XML 描述符进行部署。更新 web 应用 或 XML 上下文描述符将会触发 web 应用的重载。默认值为 true。backgroundProcessorDelay表示在调用这台主机的 backgroundProcess 方法和它的子容器方法包括所有的 context之间延迟的秒数。如果延迟值不是负数的话不会调用子容器意味着会使用它们自己的处理线程。设置为正数会产生衍生线程。在等待指定的时间之后线程将会在该 host 上调用 backgroundProcess 方法包括它的所有子容器。host将会使用后台进程执行web 应用部署相关的任务。如果没有指定默认值为-1意味着 host 将会依赖于它的父引擎的后台处理线程。className使用的 Java 实现类的名称。该类必须实现 org.apache.catalina.Host 接口。deployIgnore一个正则表达式定义了在自动部署和启动时部署的情况下需要忽略的目录。这就允许你在版本控制系统中保持自己的配置例如不会将 .svn 或者 CVS 文件夹部署到 appBase 目录下。该正则表达式是相对于 appBase 的。同时也是固定的意味着是相对于整个文件或目录的名称进行的。因此foo 只会匹配名称为 foo 的文件或目录而不会匹配foo.war、foobar或者 myfooapp 这样的名称。如果想让“foo”匹配任意名称可以使用 .*foo.*。deployOnStartup指定在 Tomcat 启动时是否需要自动部署host下的 web 应用。默认值为 true。failCtxIfServletStartFails设置为 true时如果它的任意一个 load-on-startup0 的 servlet 停止自身启动后停止启动它的每一个子 context 。每一个子 context 可能覆盖这个属性。如果没有指定将会使用默认值 false。name通常是虚拟主机的网络名称注册在你的域名服务器上。无论指定的主机名称是什么样的Tomcat 在内部都会将其转换为小写。嵌套在 Engine 内部的 Host 其中必须有一个 Host 的名称匹配 Engine 的默认 Host 设置。 startStopThreadsHost 在启动子 Context 元素时会并发使用的线程数。如果自动部署被使用的话将会使用该线程池部署新的 Context。值为0时将会使用 Runtime.getRuntime().availableProcessors() 的值。值为负数时将会使用 Runtime.getRuntime().availableProcessors() 加上该值得和而和小于1时将会使用1个线程。如果没有指定会使用默认值1。undeployOldVersion该选项的值决定 Tomcat即自动部署进程部分是否会检查并发部署的过时 web 应用任何找到的应用都会被移除。只有在 autoDeploy 为 true 的情况下才会生效。如果没有指定将会使用默认值 false。
3.10、集群Tomcat 支持服务器集群。它可以复制整个集群的会话和上下文属性。也可以部署一个 WAR 文件到所有的集群上。
3.10.1、基本属性className集群主类当前只有一个是有效的 org.apache.catalina.ha.tcp.SimpleTcpCluster。channelSendOptions 组通讯tribe channel发送选项默认为8。该选项被用来标志所有的信息通过 SimpleTcpCluster 发送。该标志指定怎样发送信息是一个简单的逻辑或。channelStartOptions设置集群使用对象的启动和停止标志。默认是 Channel.DEFAULT会启动所有的 channel 服务包括发送者、接收者、组播发送者和组播接收者。heartbeatBackgroundEnabled标志是否在容器的后台线程中调用 channel 的心跳检测。默认是 false。当设置为 true 时不要忘了禁用 channel 心跳检测线程。notifyLifecycleListenerOnFailure当所有的 ClusterListener 不能接收 channel 消息时该标志位决定是否通知 LifecycleListeners。默认是 false。
3.11、ValveValve 阀门作为请求的前置处理程序可以在请求发送到应用之前拦截 HTTP 请求。可以定义在任何容器中比如 Engine、Host、Context和 Cluster。默认配置中AccessLogValve 会拦截 HTTP 请求并在日志文件中创建一个日志切入点如下
Valve classNameorg.apache.catalina.valves.AccessLogValve directorylogsprefixlocalhost_access_log. suffix.txtpattern%h %l %u %t %r %s %b /3.11.1、基本属性className设置为 org.apache.catalina.ha.tcp.ReplicationValvefilter —— 对于已知文件扩展名或 url 可以在请求中使用 Valve 通知 cluster 没有修改 session对于本次变化 cluster 没有必要通知 session 管理者。如果请求匹配该过滤器模型cluster 会假设 session 没有发生变化。一个filter 样例大概是这样的 filter“.*.gif|.*.js|.*.jpeg|.*.jpg|.*.png|.*.htm|.*.html|.*.css|.*.txt”。filter 使用 java.util.regex 的正则表达式。primaryIndicator布尔值。如果为 truereplication valve 将会把 primaryIndicatorName 属性定义的名称插入到 request 属性中。该值无论是 Boolean.TRUE 或者 Boolean.FALSE都会被放入 request 属性中。primaryIndicatorName默认值为 org.apache.catalina.ha.tcp.isPrimarySession这个值定义了一个 request 属性的名称值是一个布尔值表示会话所在的服务器是否为主服务器。statistics布尔值。如果想让 valve 收集请求的统计数据设置为 true。默认值为 false
以下是其它一些 valve
RemoteAddrValve阻截来自特定的 IP 地址的请求。RemoteHostValve阻截基于主机名称的请求。RequestDumperValve记录了请求的详细信息。SingleSignOn Valve当置于a下时允许单点登录到该主机下的所有应用上。
更多信息见于 server.xml 文件的顶层和嵌套级别的元素和属性可以在这里查看。
4、可选配置server-name.xml4.1、包括 server-.xml文件现在如果我们想要为应用修改 server.xml 文件该怎么做不能仅仅因为一个应用修改 server.xml 文件因为它可能会对所有应用部署的初始化产生影响。对于指定的应用如何隔离指定的变化
答案就是创建一个 server-name.xml
server-.xml 是一个自定义的文件包含了对于一个指定 app 需要隔离的配置变化。所有这种格式的文件都会在 server.xml 文件之后被调用。
4.2、使用自定义的 server-name.xml 代替 server.xml不推荐这么做但如果想满足下自己好奇心的除外你可以通过编辑 catalina.bat 文件来使用你自己的 server.xml 作为替代。
catalina.bat start -config confserver-name.xml总的来讲无论是 serve.xml 还是你自己的 server-name.xml 文件都是 container 的核心配置。对于应用开发者和发布管理员来讲是一种在部署 J2EE 应用的容器中放入资源文件的补充策略。其它无论以何种方式实现的 J2EE 标准容器厂商都有相同的配置文件允许自定义注入和绑定同时允许在部署、重新部署和卸载时控制哪些服务是有效的。