web应用服务器-tomcat笔记

Web应⽤服务器-Tomcat笔记

主要课程内容

  • 第一部分: Tomcat系统架构与原理分析
  • 第二部分: Tomcat服务器核心配置详解
  • 第三部分: Tomcat对Https的支持与性能优化

第一部分: Tomcat系统架构与原理分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O9fJsRA0-1590573958422)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526152345264.png)]

b/s服务,及浏览器(谷歌,http协议)请求服务器(tomcat)

第1节 浏览器访问服务器的流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nZYTzfNx-1590573958424)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526113805229.png)]

1.用户点击页面发起请求到浏览器中

2.浏览器给服务器发送TCP连接请求

3.服务器接收到请求并与浏览器建立连接

4.浏览器生成HTTP格式的数据包

5.浏览器发送请求数据包给服务器

6.服务器解析HTTP请求数据包

7.服务器通过解析的数据,执行请求

8.服务器生成HTTP格式的响应数据包

9.服务器发送响应数据包给浏览器

10.浏览器解析HTTP格式数据包

11.浏览器把解析的数据包呈现出静态数据给用户

注意:浏览器与服务器直接的协议是http协议,是应用层协议,用于定义通讯格式的,具体底层的传输协议是TCP/IP协议

第2节 Tomcat系统总体架构

2.1 tomcat请求的大致流程

tomcat是一个http服务器(能够接受与处理http请求)

浏览器想某一个网站发送请求,是发送http请求到服务器tomcat,在远端tomcat,是不同的请求交个不同的java程序去执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tFwXy0u8-1590573958427)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526114927091.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qSUYdQmH-1590573958428)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526115015647.png)]

所以最终HTTP服务器接受到请求后,把请求交给servlet容器去处理,servlet容器通过servlet接口调用业务类,这样就解决HTTP服务器与业务解耦问题

而servlet容器与servlet接口这一套内容我们叫做servlet规范

tomcat有着两个重要的身份

  1. http服务器
  2. servlet容器
2.2 tomcat servlet容器处理流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zjhaU079-1590573958429)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526134138941.png)]

当用户请求某一个URL资源时

  1. http服务器会把请求信息使用servletRequest对象封装起来
  2. 进一步去调用servlet容器中的某一个具体的Servlet
  3. Servlet容器拿到请求后,根据URL和Servlet映射关系,找到对应的Servlet
  4. 如果Servlet没有被加载,就通过反射机制去创建这个Servlet,并且调用它的init方法来完成初始化
  5. 接着调用具体的service()方法来处理请求,请求处理结果通过ServletResponse对象封装
  6. 把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端
2.3 Tomcat系统总体架构

通过2.1 与2.2的讲解,我们知道tomcat有两个非常重要的组成成分

  1. 和客户端浏览器进行交互,进行socket通信.将字节流和Request/Response等对象进行转换
  2. servlet容器处理业务流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zs9pVnvx-1590573958430)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526134953850.png)]

Tomcat设计了两个核心组件**连接器组件(Connector)容器组件(container)**来完成两大核心功能

  • 连接器,负责对外交流: 处理Socket连接,负责⽹络字节流与Request和Response对象的转化;
  • 容器,负责内部处理:加载和管理Servlet,以及具体处理Request请求;

第 3 节 Tomcat 连接器组件-Coyote

3.1 Coyote 简介

Coyote 是Tomcat 中连接器的组件名称 , 是对外的接⼝。客户端通过Coyote与服务器建⽴连接、发送请 求并接受响应 。

  1. Coyote 封装了底层的⽹络通信(Socket 请求及响应处理)
  2. Coyote 使Catalina 容器(容器组件)与具体的请求协议及IO操作⽅式完全解耦
  3. Coyote 将Socket 输⼊转换封装为 Request 对象,进⼀步封装后交由Catalina 容器进⾏处理,处 理请求完成后, Catalina 通过Coyote 提供的Response 对象将结果写⼊输出流
  4. Coyote 负责的是具体协议(应⽤层)和IO(传输层)相关内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Xcs6lQF-1590573958430)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526135507815.png)]

3.2 Tomcat Coyote ⽀持的 IO模型与协议

Tomcat⽀持多种应⽤层协议和I/O模型,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pw09onJB-1590573958431)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526135606518.png)]

在 8.0 之前 ,Tomcat 默认采⽤的I/O⽅式为 BIO,之后改为 NIO。 ⽆论 NIO、NIO2 还是 APR, 在性 能⽅⾯均优于以往的BIO。 如果采⽤APR, 甚⾄可以达到 Apache HTTP Server 的影响性能。

3.3 Coyote 的内部组件及流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s7mf7A6N-1590573958432)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526135721372.png)]

组件描述这样
EndPointEndPoint 是 Coyote 通信端点,即通信监听的接⼝,是具体Socket接收和发 送处理器,是对传输层的抽象,因此EndPoint⽤来实现TCP/IP协议的
ProcessorProcessor 是Coyote 协议处理接⼝ ,如果说EndPoint是⽤来实现TCP/IP协 议的,那么Processor⽤来实现HTTP协议,Processor接收来⾃EndPoint的 Socket,读取字节流解析成Tomcat Request和Response对象,并通过 Adapter将其提交到容器处理,Processor是对应⽤层协议的抽象
ProtocolHandlerCoyote 协议接⼝, 通过Endpoint 和 Processor , 实现针对具体协议的处 理能⼒。Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocol , AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol , Http11Nio2Protocol ,Http11AprProtocol
Adapter由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了⾃⼰的 Request类来封装这些请求信息。ProtocolHandler接⼝负责解析请求并⽣成 Tomcat Request类。但是这个Request对象不是标准的ServletRequest,不 能⽤Tomcat Request作为参数来调⽤容器。Tomcat设计者的解决⽅案是引 ⼊CoyoteAdapter,这是适配器模式的经典运⽤,连接器调⽤ CoyoteAdapter的Sevice⽅法,传⼊的是Tomcat Request对象, CoyoteAdapter负责将Tomcat Request转成ServletRequest,再调⽤容器

第4节 Tomcat Servlet容器-Catalina

4.1 Tomcat 模块分层结构图及Catalina位置

Tomcat是⼀个由⼀系列可配置(conf/server.xml)的组件构成的Web容器,⽽Catalina是Tomcat的 servlet容器。

从另⼀个⻆度来说,Tomcat 本质上就是⼀款 Servlet 容器, 因为 Catalina 才是 Tomcat 的核⼼ , 其 他模块都是为Catalina 提供⽀撑的。 ⽐如 : 通过 Coyote 模块提供链接通信,Jasper 模块提供 JSP 引 擎,Naming 提供JNDI 服务,Juli 提供⽇志服务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3KsMYqej-1590573958432)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526144232410.png)]

4.2 Servlet 容器 Catalina 的结构

Tomcat(我们往往有⼀个认识,Tomcat就是⼀个Catalina的实例,因为Catalina是Tomcat的核⼼)

Catalina结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qS6fbFYK-1590573958433)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526144346903.png)]

其实,可以认为整个Tomcat就是⼀个Catalina实例,Tomcat 启动的时候会初始化这个实例,Catalina 实例通过加载server.xml完成其他实例的创建,创建并管理⼀个Server,Server创建并管理多个服务, 每个服务⼜可以有多个Connector和⼀个Container。

  • 一个catalina实例

    • 一个server实例
      • 多个service实例
        • 每一个service实例有多个connector实例与一个container实例
  • Catalina

    负责解析Tomcat的配置⽂件(server.xml) , 以此来创建服务器Server组件并进⾏管理

  • Server

    服务器表示整个Catalina Servlet容器以及其它组件,负责组装并启动Servlaet引擎,Tomcat连接 器。Server通过实现Lifecycle接⼝,提供了⼀种优雅的启动和关闭整个系统的⽅式

  • Service

    服务是Server内部的组件,⼀个Server包含多个Service。它将若⼲个Connector组件绑定到⼀个 Container

  • Container

    容器,负责处理⽤户的servlet请求,并返回对象给web⽤户的模块

4.3 Container组件的具体结构

Container组件下有⼏种具体的组件,分别是Engine、Host、Context和Wrapper。这4种组件(容器) 是⽗⼦关系。Tomcat通过⼀种分层的架构,使得Servlet容器具有很好的灵活性。

  • Engine

    表示整个Catalina的Servlet引擎,⽤来管理多个虚拟站点,⼀个Service最多只能有⼀个Engine, 但是⼀个引擎可包含多个Host

  • Host

    代表⼀个虚拟主机,或者说⼀个站点,可以给Tomcat配置多个虚拟主机地址,⽽⼀个虚拟主机下 可包含多个Context

  • Context

    表示⼀个Web应⽤程序, ⼀个Web应⽤可包含多个Wrapper

  • Wrapper

    表示⼀个Servlet,Wrapper 作为容器中的最底层,不能包含⼦容器

上述组件的配置其实就体现在conf/server.xml中

第二部分: Tomcat服务器核心配置文件详解

配置文件server.xml

核⼼配置在tomcat⽬录下conf/server.xml⽂件

<?xml version="1.0" encoding="UTF-8"?>
<!-- Server 根元素,创建⼀个Server实例,⼦标签有 Listener、GlobalNamingResources、Service -->
<!-- port:关闭服务器的监听端⼝ shutdown:关闭服务器的指令字符串 -->
<Server port="8005" shutdown="SHUTDOWN">
  <!-- 以⽇志形式输出服务器 、操作系统、JVM的版本信息 -->
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <!-- 加载(服务器启动) 和 销毁 (服务器停⽌) APR。 如果找不到APR库, 则会输出⽇志, 并 不影响 Tomcat启动 -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <!-- 避免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" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
			 GlobalNamingResources 中定义了全局命名服务
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
				 可编辑的用户数据库也可以由
   			 UserDatabaseRealm对用户进行身份验证
    -->
    <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服务,⼀个Server标签可以有多个Service服务实例 -->
  <!-- 该标签⽤于创建 Service 实例,默认使⽤ org.apache.catalina.core.StandardService。 
			 默认情况下,Tomcat 仅指定了Service 的名称, 值为 "Catalina"。 
 		 	 Service ⼦标签为 : Listener、Executor、Connector、Engine, 
			 其中: 
				Listener ⽤于为Service添加⽣命周期监听器, 
				Executor ⽤于配置Service 共享线程池, 
				Connector ⽤于配置Service 包含的链接器, 
				Engine ⽤于配置Service中链接器对应的Servlet 容器引擎 
	-->
  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--连接器可以使用共享的执行程序,可以定义一个或多个命名线程池 -->
    <!-- 默认情况下,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"/>
    <!--
    <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
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
    -->
    <!--
				默认情况下,tomcat启动两个连接器,一个HTTP协议 一个AJP协议,一般情况下,我们不需要去创建连接器,只需要按需求优化
  	-->
    <!-- 	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版本默认为ISO8859-1 -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443
         This connector uses the NIO implementation. The default
         SSLImplementation will depend on the presence of the APR/native
         library and the useOpenSSL attribute of the
         AprLifecycleListener.
         Either JSSE or OpenSSL style configuration may be used regardless of
         the SSLImplementation selected. JSSE style configuration is used below.
    -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
    -->
    <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
         This connector uses the APR/native implementation which always uses
         OpenSSL for TLS.
         Either JSSE or OpenSSL style configuration may be used. OpenSSL style
         configuration is used below.
    -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxThreads="150" SSLEnabled="true" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
                         certificateFile="conf/localhost-rsa-cert.pem"
                         certificateChainFile="conf/localhost-rsa-chain.pem"
                         type="RSA" />
        </SSLHostConfig>
    </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 -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <!-- 	
					name: ⽤于指定Engine 的名称, 默认为Catalina 
					defaultHost:默认使⽤的虚拟主机名称, 当客户端请求指向的主机⽆效时, 将交由默认的虚拟主机处 理, 默认为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">
        <!--
					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>

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

第三部分 Tomcat对Https的支持与性能优化

第1节 Tomcat对https的支持

Https是⽤来加强数据传输安全的

1.1 HTTPS 简介

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-voJLAisI-1590573958433)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526155412188.png)]

Http超⽂本传输协议,明⽂传输 ,传输不安全,https在传输数据的时候会对数据进⾏加密

ssl协议

TLS(transport layer security)协议

1.2HTTPS和HTTP的主要区别
  • HTTPS协议使⽤时需要到电⼦商务认证授权机构(CA)申请SSL证书
  • HTTP默认使⽤8080端⼝,HTTPS默认使⽤8443端⼝
  • HTTPS则是具有SSL加密的安全性传输协议,对数据的传输进⾏加密,效果上相当于HTTP的升级版
  • HTTP的连接是⽆状态的,不安全的;HTTPS协议是由SSL+HTTP协议构建的可进⾏加密传输、身份认证的⽹络协议,⽐HTTP协议安全
1.3 HTTPS⼯作原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KSeGDd7F-1590573958434)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526155636076.png)]

1.4 Tomcat 对 HTTPS 的配置
  1. 使⽤ JDK 中的 keytool ⼯具⽣成免费的秘钥库⽂件(证书)。

    keytool -genkey -alias lagou -keyalg RSA -keystore lagou.keystore
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JvUUOwKV-1590573958435)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526155846461.png)]

  2. 配置conf/server.xml

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
    maxThreads="150" schema="https" secure="true" SSLEnabled="true">
    	<SSLHostConfig> 
        <!--
    			certificateKeystoreFile:秘钥的地址
    			certificateKeystorePassword:密码
    			type:加密算法
    		-->
      	<Certificate certificateKeystoreFile="/Users/yingdian/workspace/servers/apache-tomcat-8.5.50/conf/lagou.keystore" certificateKeystorePassword="lagou123" type="RSA"/>
    	</SSLHostConfig> 
    </Connector>
    
  3. 使⽤https协议访问8443端⼝(https://localhost:8443)。

第2节 Tomcat 性能优化策略

2.1 系统性能的衡量指标,主要是响应时间和吞吐量。
  • 响应时间:执⾏某个操作的耗时;
  • 吞吐量:系统在给定时间内能够⽀持的事务数量,单位为TPS(Transactions PerSecond的缩写,也 就是事务数/秒,⼀个事务是指⼀个客户机向服务器发送请求然后服务器做出反应的过程。
2.2 Tomcat优化从两个⽅⾯进⾏
  • JVM虚拟机优化(优化内存模型)
  • Tomcat⾃身配置的优化(⽐如是否使⽤了共享线程池?IO模型?)
2.3 虚拟机运⾏优化(参数调整)

Java 虚拟机的运⾏优化主要是内存分配和垃圾回收策略的优化:

  • 内存直接影响服务的运⾏效率和吞吐量
  • 垃圾回收机制会不同程度地导致程序运⾏中断(垃圾回收策略不同,垃圾回收次数和回收效率都是 不同的)

Java 虚拟机内存相关参数

参数参数作用优化建议
-server启动Server,以服务端模式运⾏服务端模式建议开启
-Xms最⼩堆内存建议与-Xmx设置相同
-Xmx最⼤堆内存建议设置为可⽤内存的80%
-XX:MetaspaceSize元空间初始值
-XX:MaxMetaspaceSize元空间最⼤内存默认⽆限
-XX:NewRatio年轻代和⽼年代⼤⼩⽐值,取值为整数,默认为2不需要修改
-XX:SurvivorRatioEden区与Survivor区⼤⼩的⽐值,取值为整 数,默认为8不需要修改

JVM内存模型回顾

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IJuevmNo-1590573958436)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526161103214.png)]

参数调整示例

JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m XX:MaxMetaspaceSize=512m"
2.4 垃圾回收(GC)策略

垃圾回收性能指标

  • 吞吐量:⼯作时间(排除GC时间)占总时间的百分⽐, ⼯作时间并不仅是程序运⾏的时间,还包 含内存分配时间。
  • 暂停时间:由垃圾回收导致的应⽤程序停⽌响应次数/时间。

垃圾收集器

  • 串⾏收集器(Serial Collector)

    单线程执⾏所有的垃圾回收⼯作, 适⽤于单核CPU服务器

    ⼯作进程-----|(单线程)垃圾回收线程进⾏垃圾收集|—⼯作进程继续

  • 并⾏收集器(Parallel Collector)

    ⼜称为吞吐量收集器(关注吞吐量), 以并⾏的⽅式执⾏年轻代的垃圾回收, 该⽅式可以显著降 低垃圾回收的开销(指多条垃圾收集线程并⾏⼯作,但此时⽤户线程仍然处于等待状态)。适⽤于多 处理器或多线程硬件上运⾏的数据量较⼤的应⽤

    ⼯作进程-----|(多线程)垃圾回收线程进⾏垃圾收集|—⼯作进程继续

  • 并发收集器(Concurrent Collector)

    以并发的⽅式执⾏⼤部分垃圾回收⼯作,以缩短垃圾回收的暂停时间。适⽤于那些响应时间优先于 吞吐量的应⽤, 因为该收集器虽然最⼩化了暂停时间(指⽤户线程与垃圾收集线程同时执⾏,但不⼀ 定是并⾏的,可能会交替进⾏), 但是会降低应⽤程序的性能

  • CMS收集器(Concurrent Mark Sweep Collector)

    并发标记清除收集器, 适⽤于那些更愿意缩短垃圾回收暂停时间并且负担的起与垃圾回收共享处 理器资源的应⽤

  • G1收集器(Garbage-First Garbage Collector)

    适⽤于⼤容量内存的多核服务器, 可以在满⾜垃圾回收暂停时间⽬标的同时, 以最⼤可能性实现 ⾼吞吐量(JDK1.7之后)

垃圾回收器参数

参数描述
-XX:+UseSerialGC启⽤串⾏收集器
-XX:+UseParallelGC启⽤并⾏垃圾收集器,配置了该选项,那么 -XX:+UseParallelOldGC默认 启⽤
-XX:+UseParNewGC年轻代采⽤并⾏收集器,如果设置了 -XX:+UseConcMarkSweepGC选 项,⾃动启⽤
-XX:ParallelGCThreads年轻代及⽼年代垃圾回收使⽤的线程数。默认值依赖于JVM使⽤的CPU个 数
-XX:+UseConcMarkSweepGC(CMS)对于⽼年代,启⽤CMS垃圾收集器。 当并⾏收集器⽆法满⾜应⽤的延迟需 求是,推荐使⽤CMS或G1收集器。启⽤该选项后, -XX:+UseParNewGC ⾃动启⽤。
-XX:+UseG1GC启⽤G1收集器。 G1是服务器类型的收集器, ⽤于多核、⼤内存的机器。 它在保持⾼吞吐量的情况下,⾼概率满⾜GC暂停时间的⽬标。

在bin/catalina.sh的脚本中 , 追加如下配置

JAVA_OPTS="-XX:+UseConcMarkSweepGC"
2.4 Tomcat 配置调优

Tomcat⾃身相关的调优

  • 调整tomcat线程池

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uxwGMohu-1590573958436)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526161936184.png)]

  • 调整tomcat的连接器

    调整tomcat/conf/server.xml 中关于链接器的配置可以提升应⽤服务器的性能。

    参数说明
    maxConnections最⼤连接数,当到达该值后,服务器接收但不会处理更多的请求, 额外的请求将会阻塞直到连接数低于maxConnections 。可通过ulimit -a 查看服务器 限制。对于CPU要求更⾼(计算密集型)时,建议不要配置过⼤ ; 对于CPU要求 不是特别⾼时,建议配置在2000左右(受服务器性能影响)。 当然这个需要服 务器硬件的⽀持
    maxThreads最⼤线程数,需要根据服务器的硬件情况,进⾏⼀个合理的设置
    acceptCount最⼤排队等待数,当服务器接收的请求数量到达maxConnections ,此时 Tomcat会将后⾯的请求,存放在任务队列中进⾏排序, acceptCount指的 就是任务队列中排队等待的请求数 。 ⼀台Tomcat的最⼤的请求处理数量, 是maxConnections+acceptCount
  • 禁⽤ AJP 连接器

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mcisljw6-1590573958437)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526162258886.png)]

  • 调整 IO 模式

    Tomcat8之前的版本默认使⽤BIO(阻塞式IO),对于每⼀个请求都要创建⼀个线程来处理,不适合⾼并发;Tomcat8以后的版本默认使⽤NIO模式(⾮阻塞式IO)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cMFsZGna-1590573958437)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526162327723.png)]

    当Tomcat并发性能有较⾼要求或者出现瓶颈时,我们可以尝试使⽤APR模式,APR(Apache Portable Runtime)是从操作系统级别解决异步IO问题,使⽤时需要在操作系统上安装APR和Native(因为APR 原理是使⽤使⽤JNI技术调⽤操作系统底层的IO接⼝)

  • 动静分离

    可以使⽤Nginx+Tomcat相结合的部署⽅案,Nginx负责静态资源访问,Tomcat负责Jsp等动态资 源访问处理(因为Tomcat不擅⻓处理静态资源)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值