tomcat核心组件及server.xml配置讲解

<!--tomcat最核心组件:Server Service Connector Engine Host Context;
  其他组件都可归为内嵌组件(即是嵌入在这几种组件中的)
-->
<!--每一个元素标签都对应tomcat的一个组件,通过元素配置实现对组件的控制, -->
server.xml配置文件结构如下:

<Server port="8005" shutdown="SHUTDOWN">
    <Service name="Catalina">
        <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
        <Engine name="Catalina" defaultHost="localhost">
            <Host name="localhost"  appBase="webapps" xmlBase="conf/Catalina/localhost/web.xml"
                  unpackWARs="true" autoDeploy="true" deployOnStartup="true">
            </Host>
            <Host name="www.baidu.com"  appBase="web-baidu"
                  unpackWARs="true" autoDeploy="true">
            </Host>

            <Host name="www.sina.com"  appBase="web-sina"
                  unpackWARs="true" autoDeploy="true">
                <Context  docBase="" path="" reloadable="">
                </Context>

                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                       prefix="localhost_access_log" suffix=".txt"
                       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
            </Host>
        </Engine>
    </Service>
</Server>


<?xml version='1.0' encoding='utf-8'?>
<!--tomcat最核心组件:Server Service Connector Engine Host Context;
  其他组件都可归为内嵌组件(即是嵌入在这几种组件中的)
-->
<!--每一个元素标签都对应tomcat的一个组件,通过元素配置实现对组件的控制, -->

<!--server :顶层元素,代表整个tomcat容器,必须唯一,整个配置文件的根元素
 作用:提供一个接口让客户端能够访问到里面的Service集合,同时维护它所包含的
       所有Service的生命周期(包括如何初始化、如何结束服务、如何找到客户端要访问的Service等)
 shutdown:表示关闭Server的指令;
 port:表示Server接收shutdown指令的端口号,设为-1可禁掉该端口
-->
<Server port="8005" shutdown="SHUTDOWN">
    <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

    <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 :顶层元素,可以有一个或多个,包括一个Engine元素及一组Connector元素 
     作用:将Connector与Engine组装在一起,对外提供服务;可包含多个Connector,但只能有一个Engine;
     其中Connector的作用是接收客户端请求,Engine则是处理接收到的请求;
    -->
    <Service name="Catalina">    <!--这里Service名为Catalina,也可以为配置为tomcat提供的其他Service,监听端口不一样-->

        <!--Connector :连接器,代表外部客户端发送请求到特定service的接口;同时也是外部客户端
          从特定service接收响应的接口;
          作用:接收连接请求,创建Request和Response对象 用于和请求端交换数据;然后分配线程让Engine来处理这个请求,
                并把产生的Request和Response对象传给Engine.
           port: 客户端请求Service的端口号
           protocol:请求的协议
           connectionTimeout:连接的超时时间
           redirectPort:表示当强制要求HTTPS而请求是http时,将连接重定向到8443端口
           额外话:实际上,即使在正式的生产环境中,常常配置的也是8080端口,而非80端口;
                   因为 在实际中,很少将tomcat直接对外开放来接收请求,而是在tomcat与客户端之间加了一层代理服务器(如nginx)
                   用于请求的转发、负载均衡、处理静态文件等;tomcat与nginx一般是在同一个局域网内,所以一般不用80端口。
        -->
        <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />

        <!--配置这个Connector,代表客户端可以通过8009端口号使用AJP协议访问tomcat;
           AJP协议负责和其他的http服务器(如Apache)建立连接,在把tomcat与其他http服务器集成时,就需要用到这个连接。
           之所以使用tomcat和其他服务器集成,是因为tomcat可以用作servlet/JSP容器,但是对于静态资源的处理速度较慢,
           性能不如Apache、IIS等http服务器;因此常常将tomcat与Apache等集成,tomcat作servlet容器,Apache处理静态资源,
           这里的AJP协议则是负责两者的连接的
        -->
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

        <!-- 容器:(Engine、Host、Context),容器的作用是处理Connector接收进来的请求,并产生相应的响应
        Engine Host Context三者都是容器,但并非是平行关系,而是父子(包含)关系,其中
        Engine包含Host,Host包含Context。
        Engine:可以处理Service中所有请求;
        Host:可以处理发向一个特定虚拟主机的所有请求;
        Context:可以处理一个特定Web应用所有请求;
       -->
        <!-- Engine在Service中有且只有一个,负责处理请求,其从一个或多个Connector中接收请求并处理,
             并将完成的响应返回给Connector,最终传给客户端。
             name:用于日志和错误信息;
             defaultHost:制定默认的Host名称,当发往本机的请求指定的Host名称不存在时,一律使用其指定的Host进行处理;
             因此,defaultHost的值必须与该Engine下的一个Host的name属性值匹配。
        -->
        <Engine name="Catalina" defaultHost="localhost">
            <Realm className="org.apache.catalina.realm.LockOutRealm">
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                       resourceName="UserDatabase"/>
            </Realm>

            <!-- Host是Engine的子容器,Engine下可以有一个或多个Host组件,每个Host代表Engine中的一个虚拟主机
                 但至少有一个,且其中一个(有且只有一个)的name属性值必须与Engine的name属性相匹配。
             作用:运行多个Web应用(一个Context代表一个Web应用),并负责安装、展开、启动和结束每个Web应用。
             一个Host对应了服务器中一个网络名实体(如www.baidu.com,或ip地址 123.12.34.22),为了使用户可以通过
             网络名连接tomcat服务器,这个名字应该中DNS服务器上注册;客户端通常使用主机名来标识它们希望连接的服务器
             该主机名会包含中http请求头中,tomcat从http请求头提取出主机名,寻找匹配的主机来发送资源寻找请求,若没有
             匹配上,请求将发往默认主机,所以默认主机可以不需要在DNS服务器上注册。
     
                 这里为了方便讲解,我将配置三个Host,其中:
             appBase:代表资源寻找的文件目录;
             unpackWARs:代表是否将代表Web应用的WAR文件解压(这里开发过web项目的同学应该知道,部署tomcat时,资源是放在WAR包下的)
                         为true 代表通过解压后的文件结构运行该Web应用;为false代表直接使用WAR文件运行Web应用。
             autoDeploy:是否自动部署(运行期间定期检查),即如果更新资源后,是否会自动检查更新并部署,
                         为true代表会自动更新资源部署,
             deployOnStartup:是否自动部署(启动tomcat时检查),即如果检查到新的Web应用或者Web应用有更新时,触发部署
                         为true代表会自动更新资源部署,以上两种检查更新都是检查appBase与xmlBase两个目录下资源是否有变动
             xmlBase: 默认目录为conf/Engine_name/host_name,如该配置文件就是conf/Catalina/localhost,不配置该项代表使用默认
            -->

            <!-- 该Host的name与Engine的defaultHost相匹配,如果发送到本机的请求中没有指定host,
                 则默认进入该主机(webapps目录下)寻找所请求的资源
            -->
            <Host name="localhost"  appBase="webapps" xmlBase="conf/Catalina/localhost/web.xml"
                  unpackWARs="true" autoDeploy="true" deployOnStartup="true">
            </Host>

            <!-- 如果发送到本机的请求中指定host为"www.baidu.com",
                 则进入该主机(web-baidu目录下)寻找所请求的资源
            -->
            <Host name="www.baidu.com"  appBase="web-baidu"
                  unpackWARs="true" autoDeploy="true">
            </Host>

            <!-- 如果发送到本机的请求中指定host为"www.sina.com",
                 则进入该主机(web-sina目录下)寻找所请求的资源
            -->
            <Host name="www.sina.com"  appBase="web-sina"
                  unpackWARs="true" autoDeploy="true">

                <!--一个Context代表一个Web应用,一个Host下可以有多个Context,代表可以把多个Web应用部署中一台虚拟主机下
                   docBase:指定Web应用使用的WAR包路径,或应用目录;注意:在自动部署场景下,docBase不在appBase目录中,才需要
                            指定,如果docBase指定的WAR或应用目录已经在appBase下了,就没必要指定,因为tomcat会直接扫描appBase目录了。
                   path: 指定web应用的上下文路径,当请求到来时,tomcat根据web应用的path属性与URL的匹配程度来选择web应用处理相应请求
                  例如:web应用app1的path是/app1; web应用app2的path是app2,当请求/app1/index.jsp来到时将交由app1来处理;
                  若path属性为“ ”(空),那么这个Context将是所在的虚拟主机的默认Web应用,当请求URL都匹配不上path时,将交由该
                  Context来处理。注意:自动部署场景下,不能指定path属性,path属性由配置文件名、WAR文件名或应用目录名自动推导出来,
                  
                   reloadable:指示tomcat是否在运行时监控WEB-INF/classes和WEB-INF/lib目录下的class文件的改动,为true时,
                   当检测到有改动,会触发web应用的重新加载,开发时一般设置为true,便于调试;生产环境中为true会个服务器带来一些
                   性能压力,默认为false。
                -->
                <Context  docBase="" path="" reloadable="">

                </Context>
                <!--Valve的意思是“阀门“,可以与三种容器的任意一种关联,valve不止这里的一种,每种有自己的特性
                   这里的AccessLogValve的作用是记录该虚拟主机处理的所有请求的日志;每天的日志记录到一个文件,
                   classesName:类型
                   pattern:日志记录的格式,%h:远程主机名/ip  %l:远程逻辑用户名, %u:授权的远程用户名  
                   %t:时间  %r:请求的第一行  %s:响应状态码 200、404等  %b:响应的数据量,不包括请求头。
                -->
                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                       prefix="localhost_access_log" suffix=".txt"
                       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
            </Host>
        </Engine>
    </Service>
</Server>

猜你喜欢

转载自blog.csdn.net/it_0101/article/details/77893466