Tomcat 基础及配置

Posted 深蓝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat 基础及配置相关的知识,希望对你有一定的参考价值。

一、原理

1. 浏览器访问服务器流程

    1. 用户输入请求到浏览器
    2. 浏览器发送TCP连接请求
    3. 服务器接收到(忽略nginx等情况)请求并三次握手建立连接
    4. 浏览器生成HTTP的数据包并发送
    5. 服务器收到并解析
    6. 服务器执行请求并封装结果发送
    7. 浏览器收到HTTP格式数据包并解析渲染

2. Tomcat请求处理流程

首先,Tomcat是一个HTTP服务器

Tomcat中的HTTP服务器(Connectot组件)在接收到请求之后把请求交给Servlet容器(Conntainer组件)来处理(解耦),Servlet容器通过Servlet接口调用业务类,Servlet容器这一套内容叫做Servlet规范

3. Servlet容器处理流程

  1. HTTP服务器把请求信息使用ServletRequest对象封装
  2. 根据配置,找到url和Servlet的映射, 调用Servlet容器中的某个具体Servlet
  3. 如果Servlet还没有加载,就用反射机制创建这个Servlet,并调用Servlet的init方法来完成初始化
  4. 调用这个Servlet的service方法处理请求,处理结果用ServletResponse对象封装
  5. ServletResponse 对象返回给HTTP服务器,HTTP服务器把响应发给客户端

二、组件

1. 连接器组件Coyote

客户端通过Coyote与服务器建立连接,发送并响应请求

  1. Coyote 封装底层网络通信(Socket请求及响应处理)
  2. Coyote 使 Catalina容器(容器组件)与具体的请求及I/O操作解耦
  3. Coyote 将Socket 输入封装Request对象,容器处理后,Catelina通过Response对象将结果写入输出流
  4. Coyote 去负责具体应用层协议和传输层io相关内容

    ### 2. Servlet 容器 Catalina

Tomcat由一系列可配置(server.xml)的组件构成的web容器,Catalina是它的Servlet容器。某种方面说,Tomcat就是一个Servlet容器,Catalina是它的核心组件。

三、核心配置

配置文件server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 根元素,定义一个Server实例,自己标签:Listener、GlobalNamingResources、Service-->
<!-- 监听8005,状态为关闭状态 这里不需要改-->
<Server port="8005" shutdown="SHUTDOWN">
  <!-- 定义监听器 以下都无需更改-->
  <!-- 打印JVM、操作系统相关日志 无需更改 -->
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- 加载销毁Apr 无需更改 -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!-- 避免JRE内存溢出 -->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <!-- 加载和停止全局命名服务 -->
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <!-- 在Context停止时重建 Executor 池中的线程,避免 ThreadLocal 相关的内存泄漏 -->
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- 定义全局JNDI资源 一般无需修改-->
  <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>

  <!-- 定义service服务容器,一个server可以有很多service -->
  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    
    <!-- 配置Service共享线程池 -->
    <!-- 默认情况下,Service 并未添加共享线程池配置。 如果我们想添加一个线程池, 可以在 <Service> 下添加如下配置: 
          name: 线程池名称,用于 Connector中指定
          namePrefix: 所创建的每个线程的名称前缀,一个单独的线程名称为 namePrefix+threadNumber
          maxThreads: 池中最大线程数 
          minSpareThreads: 活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在 
          maxIdleTime: 线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒
          maxQueueSize: 在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限。除非特殊情况,这个值 不需要更改,否则会有请求不会被处理的情况发生 prestartminSpareThreads: 启动线程池时是否启动 minSpareThreads部分线程。默认值为false,即不启动 
          threadPriority: 线程池中线程优先级,默认值为5,值从1到10 
          className: 线程池实现类,未指定情况下,默认实现类为org.apache.catalina.core.StandardThreadExecutor。如果想使用自定义线程池首先需要实现 org.apache.catalina.Executor接口
    -->
    <Executor 
      name="commonThreadPool"
      namePrefix="thread-exec-"
      maxThreads="200"
      minSpareThreads="100"
      maxIdleTime="60000"
      maxQueueSize="Integer.MAX_VALUE" 
      prestartminSpareThreads="false"
      threadPriority="5" 
      className="org.apache.catalina.core.StandardThreadExecutor"
      />
 
    <!-- 一个Service容器可以有多个连接器,每个连接启动一个线程 -->
    <!-- 
      port: 端口号,Connector 用于创建服务端Socket 并进行监听,以等待客户端请求链接。如果该属性设置为0,Tomcat将会随机选择一个可用的端口号给当前Connector使用
      protocol: 当前Connector 支持的访问协议。默认为 HTTP/1.1,并采用自动切换机制选择一个基于 JAVA NIO的链接器或者基于本地APR的链接器根据本地是否含有Tomcat的本地库判定) 
      connectionTimeOut: Connector 接收链接后的等待超时时间, 单位为毫秒。 -1 表示不超时。 
      redirectPort: 当前Connector不支持SSL请求,接收到了一个请求,并且也符合security-constraint约束,需要SSL传输,Catalina自动将请求重定向到指定的端口。
      executor: 指定共享线程池的名称, 也可以通过maxThreads、minSpareThreads 等属性配置内部线程池。
      URIEncoding: 用于指定编码URI的字符编码, Tomcat8.x版本默认的编码为 UTF-8 , Tomcat7.x版本默认为ISO-8859-1
    -->
    <!--org.apache.coyote.http11.Http11NioProtocol , 非阻塞式 Java NIO 链接器--> 
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <!-- 使用共享线程池,不明确线程池就会有自己维护的线程池,造成资源浪费 -->
    <!-- 
    <Connector port="8080" 
               protocol="HTTP/1.1"
               executor="commonThreadPool" 
               maxThreads="1000" 
               minSpareThreads="100" 
               acceptCount="1000" 
               maxConnections="1000" 
               connectionTimeout="20000" 
               compression="on" 
               compressionMinSize="2048" 
               disableUploadTimeout="true" 
               redirectPort="8443" 
               URIEncoding="UTF-8" /> -->
    
 
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Servlet引擎 -->
    <!--
      name: 用于指定Engine的名称, 默认为Catalina
      defaultHost: 默认使用的虚拟主机名称,当客户端请求指向下边配置Host的主机无效时,将交由默认的虚拟主机处理,默认为localhost
    -->
    <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标签用于配置虚拟主机 -->
      <!-- 默认处理 ,appbase是相对路径,unpackWARs解压war包,autoDeploy自动部署-->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <!-- 访问请求日志的 阀  ,存放路径为相对路径-->
        <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>

      <!-- 监听 www.abc.com:8080 -->
      <Host name="www.abc.com"  appBase="webapps1"
            unpackWARs="true" autoDeploy="true">

        <!--
        docBase:Web应用目录或者War包的部署路径。可以是绝对路径,也可以是相对于 Host appBase的 相对路径。
        path:Web应用的Context 路径。如果我们Host名为localhost, 则该web应用访问的根路径为: http://localhost:8080/web_demo。
        -->
        <Context docBase="/Users/yingdian/web_demo" path="/web3"></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>

以上是关于Tomcat 基础及配置的主要内容,如果未能解决你的问题,请参考以下文章

SSL基础知识及Nginx/Tomcat配置SSL

Tomcat (安装及web实现 基础)

20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础

Tomcat安装配置优化及负载均衡详解

逆向及Bof基础实践

Tomcat中JVM内存溢出及合理配置