设为首页 收藏本站
查看: 499|回复: 0

[经验分享] 通过server.xml来了解Tomcat结构及处理请求流程

[复制链接]

尚未签到

发表于 2017-2-9 10:47:10 | 显示全部楼层 |阅读模式
  <div class="iteye-blog-content-contain" style="font-size: 14px"></div>
  通过server.xml文件来分析
<!--?xml version="1.0" encoding="UTF-8" standalone="no"?--> 
 
<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<!-- Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" at this level.

     Documentation at /docs/config/server.html
 -->          注意:一个Tomcat容器只能有且只有一个Server元素,它是顶层类元素,可以包含多个Service
<Server port="8005" shutdown="SHUTDOWN">
     以下是几个监听器

  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->

 
<!--APR library loader. Documentation at /docs/apr.html -->
 
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
 
<!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
 
<Listener className="org.apache.catalina.core.JasperListener" />
 
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
 
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
 
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
 
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

 
<!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html

  -->
     全局JNDI资源,多用于配置datasource

  <GlobalNamingResources>
   
<!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->

   
<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>

 
<!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container",
       so you may not define subcomponents such as "Valves" at this level.

       Documentation at /docs/config/service.html
   -->    
     service是一个多个Connector的集合,用来充分利用容器,它的下级不能有service,下面可以有一个Engine和多个Connector

  <Service name="Catalina">

   
<!--The connectors can use a shared executor, you can define one or more named thread pools-->
   
<!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->



   
<!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080

    -->
     一个Connector代表一个访问点,监听某个端口,接受请求(请求交给指定的Engine处理)和返回应答。有两种Connector,一种是处理Browser的http请求,另一个监听来自其他webService请求(Apache)

    <Connector port="8080" protocol="HTTP/1.1"
              
connectionTimeout="20000"
               redirectPort="8443" />
     下面是使用线程池的Connector例子

    <!-- A "Connector" using the shared thread pool-->
   
<!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->

   
<!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the JSSE configuration, when using APR, the
         connector should be using the OpenSSL style configuration

         described in the APR documentation -->
     这个是利用APR提高Tomcat处理性能和安全性,但是配置复杂

    <!--
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />

    -->
     接受来自其他WebService请求的Connector

    <!-- Define an AJP 1.3 Connector on port 8009 -->
   
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


   
<!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

     负责处理所有Connector的请求,下面可以包含多个Host,每个Host都有不同的域名,Engine有个defaultHost,在没有找到指定域名的host时使用。
下面使用的是负载均衡的Engine
    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

    -->


    <Engine name="Catalina" defaultHost="localhost">

     
<!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)

          /docs/config/cluster.html (reference documentation) -->
     配置集群

      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->


     
<!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->

     
<Realm className="org.apache.catalina.realm.LockOutRealm">
       
<!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->

       
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
              
resourceName="UserDatabase"/>
      </Realm>
     Host代表一个虚拟主机,都有自己的域名,每个Host都有多个或者一个webapp,而每个webapp代表一个Context.
     Context在创建的时候会先根据tomcat的web.xml文件加载servlet然后根据webapp的web.xml文件加载,在得到请求后根据自己的servlet映射表寻找servlet.

      <Host name="localhost"  appBase="webapps"
           
unpackWARs="true" autoDeploy="true">

       
<!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->

       
<!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->


       
<!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->

       
<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>
 
 
元素名属性说明
Serverport指定端口负责监听Tomcat关闭请求
shutdown指定向端口发送命令的字符串
servicename指定servide名字
Connectorport指定服务器需要的端口号,并监听该端口号请求
minProcessors服务器启动时最小创建的处理请求的线程数
maxProcessors最大的处理请求的线程数
enableLookups如果为ture那么调用request.getRemoteHost()时返回DNS查询到的对方主机名。否则返回IP地址
redirectPort指定服务器处理http请求收到了SSL传输请求后重定向的端口号
acceptCount指定当所有线程都在被使用时,可以放到请求队列中的请求数目,超过该数目就不予处理
connectionTimeout连接超时时间ms为单位
EnginedefaultHost指定默认的Host主机名,这个Host必须存在
ContextdocBase应用程序路径或者WAR文件路径
pathURL路径前缀,如:http://localhost:8080/path/…
reloadable如果为ture,那么如果WEB-INF中的lib或者classes改变了,那么tomcat会自动重新装载程序,而不是重启tomcat
Hostname主机名
appBase指定应用程序存放路径
unpackWARstrue则回京war文件自动解压,否则不解压,直接运行
LoggerclassName指定logger使用的类名,但是必须实现org.apache.catalina.Logger接口
prefix指定log文件前缀
suffix指定log文件后缀
timestamptrue则在log文件上加上时间戳
Realm(表示存放用户名密码以及role的数据库)className 
Value(功能跟logger差不多)prefix指定log文件前缀
 suffix指定log文件后缀
 directory指定log文件存放位置
 className指定Value使用的类名,如用org.apache.catalina.values.AccessLogValue可以记录应用程序的访问信息
 pattern 
 
通过上面的节点嵌套顺序大致可以看出来,Tomcat处理一个请求的顺序:
假设客户端发起一个请求,地址为:http://localhost:8080/test/index.jsp
1、请求发到服务器的8080端口,被正在监听此端口的Connector获取到
2、Connector把收到的请求交给它所在的Service下的Engine处理,并等待回应
3、Engine得到请求,按照路径找到名为localhost的Host,如果没找到,就交给默认的Host处理。
4、Host接收到请求,并匹配路径为/test的Context,如果找不到就交给名为' 'Context处理
5、path为"/test"的Context收到请求,并在自己的映射表中找到/index.jsp对应的servlet
6、构造HttpServletRequest和HttpServletResponse对象,作为参数传给servlet
7、Context把处理后的HttpServletResponse对象传给Host
8、Host把HttpServletResponse对象传给Engine
9、Engine把HttpServletResponse对象传给Connector
10、Connector把HttpServletResponse对象返回给客户端
整个过程结束。

 
 
 
 
 
 
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-339663-1-1.html 上篇帖子: tomcat下摘要认证(数据库配置用户角色)+java代码模拟请求 下篇帖子: 通过server.xml来了解Tomcat结构及处理请求流程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表