Tomcat的server.xml配置文件解析
来源:互联网 发布:江铠同翟天临分手知乎 编辑:程序博客网 时间:2024/04/26 18:01
原帖地址:http://blog.csdn.net/roderick2015/article/details/52749116,转载请注明。
server.xml是我们配置和优化Tomcat时最重要的文件,Tomcat的几大核心组件都在这里配置,它上手容易,即食即用,见效快。对想要理解Tomcat原理的读者来说就更必不可少了,下面是它的标签结构。
<Server> <Service> <Connector/> <Engine> <Host> </Host> </Engine> </Service></Server>
东西并不多,我们先弄清它的层次结构和关系,再讲配置就是水到渠成的事情了,结构图如下所示。
我们由内往外分析,从图的右边Servlet开始看。
Wrapper
在Tomcat中Servlet由Wrapper封装,为什么要封装呢?Servlet只是一个接口,但有好几种实现,比如做Web开发经常使用的HttpServlet和JSP页面都属于Servlet的不同实现(对JSP页面有疑惑的读者可以从JspPage接口开始了解),因此封装后就可以屏蔽差异化,统一处理了,这种方式在很多地方都有使用。我们可以在conf/web.xml里配置全局的Servlet(Wrapper),比如处理JSP的JspServlet。
Context
往上一层的Context,代表应用程序,也就是我们放在webapps下的每个目录,对应着一个Context,比如开发中使用的ServletContext其实是Tomcat采用门面模式封装了Context后的ApplicationContextFacade。为啥用门面模式?把不需要的藏起来呗,你一个小应用要这么多干嘛。
Host
Host表示站点,它还有另一个名字大家应该听过,叫虚拟主机。像Tomcat多虚拟主机配置,就是在Engine下配置多个Host,每个Host再指定不同的域名。站点怎么理解?它的默认指定路径是webapps,意思就是整个webapps里的东西就是一个站点,Context只是站点上的一个小应用。比如平时本地开发,默认是localhost域名,在webapps里放了个test子应用,那就是通过localhost/test访问。
Engine and Container
Engine直译是引擎的意思,它可以添加多个Host进行管理,但Container只能有一个Engine,一个Service也只能有一个Container,所以这里是一对一的关系。说到Container,它可是Tomcat里容器的大哥大,我们看下下面这张结构图就清楚了。
可以看到Engine、Host、Context和Wrapper都作为子容器继承自Container,其中ContainerBase提供默认实现。
Connector
接下来是Connector,它负责处理Service的网络连接,还能把Socket转成Request和Response,当然最终传到Servlet中给咱使用也经过了门面模式的封装。
Server and Service
Server是Tomcat的顶层容器,它可以启动多个Service。Service负责提供具体的服务,这里提一下配置多个Service和多个Host的区别,Host负责指定站点的目录和域名,如果你只是为了给多个域名部署不同的站点,那么配置多个Host就可以了,因为单个Engine中的Host是共享Connector的,所以监听的端口和协议都是一样的,如果你需要把站点发布在不同的端口上,那就添加多个Service。当然你也可以直接在单机部署多个Tomcat来实现,除非做负载均衡或者服务器内存比较大,需要分割给多个Tomcat以提高JVM垃圾回收的效率,否则不建议这么做。
简单了解Tomcat层次结构和关系后,下面是Server.xml的配套注释。
<!-- 表示会在8005端口监听SHUTDOWN指令,收到则关闭Tomcat。为了安全可以设为-1来禁止该功能 --><Server port="8005" shutdown="SHUTDOWN"> <!-- Server的监听器 --> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!-- 监听JSP页面,比如我们在开发过程中,修改JSP页面后它会对页面重新编译,所以我们可以及时的看到页面变化。--> <Listener className="org.apache.catalina.core.JasperListener" /> <!-- 监听JRE内存泄露--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <!-- 全局 JNDI 资源配置 --> <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配置线程连接池,可以让多个Connector共享一个Executor,也可单个配置。 下面的配置是最大线程数150,最小线程数4,这个线程数也不能乱配,一般是根据系统的 core数和实际流量来定,可以通过测试来找到最优值,资源就这么多,线程开多了反而浪费资源。 线程池配置默认是注释的,Tomcat会采用默认属性。 --> <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> --> <!-- 表示监听8080端口,采用HTTP1.1协议,20秒请求超时,如果是SSL请求会重定向到8443端口, 我这里加了个针对中文乱码的UTF-8编码。 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> <!-- 如果需要指定Executor按以下配置--> <!-- <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> --> <!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <!-- 设置了默认的Host,当下面的Host匹配失败时,会使用该域名 --> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <!-- 指定域名为localhost,对应的站点目录是webapps,unpackWARs表示是否自动解压war文件, autoDeploy表示是否自动部署 --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 这个Valve的作用是在logs目录下生成请求日志,不清楚的读者可以了解下Tomcat的Pipeline和Valve --> <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>
配置文件中的Connector一共有三种运行模式:
1.BIO模式
也就是阻塞模式:即线程会干等你的处理结果,如果处理时间比较长,那这个线程就啥也干不了了,所以并发数一般就几百。
2.Apr模式
由Apache提供的运行时环境,并发处理优于BIO模式,但是比较复杂导致维护成本提高,而且得预装Apr和native。
3.NIO模式
使用的是JAVA的NIO处理,即同步非阻塞 IO,虽然不断询问会造成CPU浪费,但避免了阻塞从而提高并发。
从Tomcat7开始,部署在Windows7或以上系统中默认使用Apr模式,可以在启动日志中查看,如下图所示。
在Linux系统中,Tomcat8默认使用NIO模式,如果安装了Apr,会被AprLifecycleListener监听并自动使用Apr模式,无需配置。Tomcat7则使用的是BIO模式,如果想使用NIO模式,需要把< Connector />中的protocol改为org.apache.coyote.http11.Http11NioProtocol。
单从Tomcat的默认最大连接数来看,BIO模式是200,NIO模式10000,APR模式8192。但并发处理能力还是需要根据实际情况和代码实现来决定,比如你的系统有很多处理较慢或是keep-alive的情况,使用BIO肯定就悲剧了,具体可以参考这篇帖子进一步学习,讲解的非常详细。
- Tomcat的服务器配置文件server.xml解析
- Tomcat的服务器配置文件server.xml解析
- Tomcat的服务器配置文件server.xml解析
- Tomcat的server.xml配置文件解析
- 深度解析tomcat核心配置文件server.xml
- tomcat配置文件web.xml与server.xml解析--重要
- tomcat配置文件web.xml与server.xml解析--重要
- tomcat配置文件web.xml与server.xml解析--重要
- tomcat配置文件web.xml与server.xml解析--重要
- Tomcat Server.xml配置文件
- Tomcat Server.xml配置文件
- Tomcat配置文件server.xml
- Tomcat Server.xml配置文件
- Tomcat Server.xml配置文件
- Tomcat Server.xml配置文件
- Tomcat Server.xml配置文件
- tomcat配置文件server.xml
- Tomcat Server.xml配置文件
- android中?attr/**与@drawable/**或@color/**等的区别
- JsonView beta1
- Android逆向工程之反编译注入代码
- Java NIO学习笔记之二-图解ByteBuffer
- 项目中有多个resource文件夹时,load问题
- Tomcat的server.xml配置文件解析
- 几个字符串函数的实现
- String类型内存转换,你明白为什么吗?
- android studio找不到subversion
- CAT 配置文件加载说明
- 枚举
- 修改vmware虚拟机的虚拟磁盘卷标
- 设计模式之单例模式
- java 双重检测