Tomcat学习笔记

概述

Web概念

  • 软件架构:

    • C/S 客户端/服务器端:QQ,360
    • B/S 浏览器/服务器端:京东、淘宝、网易
  • 资源分类:

    • 静态资源:所有用户访问后,得到的结果都是一样的,可以直接被浏览器解析
    • 动态资源:每个用户访问相同资源后,得到的结果可能不一样。动态资源被访问后,需要先转换为静态资源,再返回给浏览器,通过浏览器进行解析
  • 网络通信三要素:

    • IP:电子设备在网络中的唯一标识
    • 端口:应用程序在计算机中的唯一标识。0~65536
    • 传输协议

Web服务器

  • 概念:
    • 服务器
      • 安装了服务器软件的计算机
    • 服务器软件
      • 接受用户的请求,处理请求,做出响应
    • web服务器软件
      • 接受用户的请求,处理请求,做出响应,在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目

基本操作

  • 启动停止:

    • 启动:双击bin/startup.bat
    • 停止:双击bin/shutdown.bat
    • 访问:http://localhost:8080
  • 整体架构:

    • 核心功能
      • 处理Socket连接,负责网络字节流与Request和Response对象的转化
      • 加载和管理Servlet,以及具体处理Request请求

请添加图片描述

连接器-Coyote

  • Coyote 是Tomcat的连接器框架的名称 , 是Tomcat服务器提供的供客户端访问的外部接 口。客户端通过Coyote与服务器建立连接、发送请求并接受响应 。
  • Coyote 封装了底层的网络通信(Socket 请求及响应处理),为Catalina 容器提供了统一 的接口,使Catalina 容器与具体的请求协议及IO操作方式完全解耦。Coyote 将Socket 输 入转换封装为 Request 对象,交由Catalina 容器进行处理,处理请求完成后, Catalina 通 过Coyote 提供的Response 对象将结果写入输出流 。
  • Coyote 作为独立的模块,只负责具体协议和IO的相关操作, 与Servlet 规范实现没有直 接关系,因此即便是 Request 和 Response 对象也并未实现Servlet规范对应的接口, 而 是在Catalina 中将他们进一步封装为ServletRequest 和 ServletResponse 。

请添加图片描述

  • 连接器组件

请添加图片描述

1.EndPoint: Coyote 通信端点,即通信监听的接口,是具体Socket接收和发送处理 器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议的

2.Processor:Coyote 协议处理接口 ,如果说EndPoint是用来实现TCP/IP协议的,那么 Processor用来实现HTTP协议,Processor接收来自EndPoint的Socket,读取字节流解 析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理

3.ProtocolHandler:Coyote 协议接口, 通过Endpoint 和 Processor , 实现针对具体协 议的处理能力

4.Adapter

容器-Catalina

  • Tomcat是一个由一系列可配置的组件构成的Web容器,而Catalina是Tomcat的servlet容器。
  • Catalina 是Servlet 容器实现,它通过松耦合的方式集成 Coyote,以完成按照请求协议进行数据读写。同时,它还包括我们的启动入口、Shell程序等。
  • Tomcat 本质上就是一款 Servlet 容器, 因此Catalina 才是 Tomcat 的核心 , 其他模块 都是为Catalina 提供支撑的。

请添加图片描述

  • 结构

请添加图片描述

  • 组件职责:
    • Catalina:负责解析Tomcat的配置文件 , 以此来创建服务器Server组件,并根据 命令来对其进行管理
    • Server:服务器表示整个Catalina Servlet容器以及其它组件,负责组装并启动 Servlet引擎,Tomcat连接器。Server通过实现Lifecycle接口,提供了 一种优雅的启动和关闭整个系统的方式
    • Service:服务是Server内部的组件,一个Server包含多个Service。它将若干个 Connector组件绑定到一个Container(Engine)上
    • Connector:连接器,处理与客户端的通信,它负责接收客户请求,然后转给相关 的容器处理,最后向客户返回响应结果
    • Container:容器,负责处理用户的servlet请求,并返回对象给web用户的模块

Container

  • Tomcat设计了4种容器,分别是Engine、Host、Context和Wrapper。这4种容器不是平行关系,而是父子关系。Tomcat通过一种分层的架构,使得Servlet容器具有很好的灵活性

请添加图片描述

  • 组件
    • Engine:表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service 最多只能有一个Engine,但是一个引擎可包含多个Host
    • Host:代表一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主 机地址,而一个虚拟主机下可包含多个Context
    • Context:表示一个Web应用程序, 一个Web应用可包含多个Wrapper
    • Wrapper:表示一个Servlet,Wrapper 作为容器中的最底层,不能包含子容器
  • 组合模式

请添加图片描述

  • 启动流程
    • 启动tomcat , 需要调用 bin/startup.bat (在linux 目录下 , 需要调用 bin/startup.sh) ,在startup.bat 脚本中, 调用了catalina.bat
    • 在catalina.bat 脚本文件中,调用了BootStrap 中的main方法
    • 在BootStrap 的main 方法中调用了 init 方法 , 来创建Catalina 及 初始化类加载器
    • 在BootStrap 的main 方法中调用了 load 方法 , 在其中又调用了Catalina的load方法
    • 在Catalina 的load方法中 , 需要进行一些初始化的工作, 并需要构造Digester 对象, 用于解析XML
    • 在调用后续组件的初始化操作,加载Tomcat的配置文件,初始化容器组件,监对应的端口号,准备接受客户端请求

Jasper

  • 对于基于JSP的web应用来说,我们可以直接在JSP页面中编写Java代码,添加第三方的 标签库,以及使用EL表达式。但是无论经过何种形式的处理,最终输出到客户端的都是 标准的HTML页面,并不包含任何的java相关的语法。也就是说,我们可以把jsp看做是一种运行在服务端的脚本

  • Jasper模块是Tomcat的JSP核心引擎,JSP本质上是一个Servlet。Tomcat使用 Jasper对JSP语法进行解析,生成Servlet并生成Class字节码,用户在进行访问jsp时,会访问Servlet,最终将访问的结果直接响应在浏览器端

  • 编译方式

    • 运行时编译:Tomcat 并不会在启动Web应用的时候自动编译JSP文件, 而是在客户端第一次请求时,才编译需要访问的JSP文件
      • Tomcat 在默认的web.xml 中配置了一个org.apache.jasper.servlet.JspServlet,用于处 理所有的.jsp 或 .jspx 结尾的请求,该Servlet 实现即是运行时编译的入口
    • 预编译:在Web应用启动时,一次性将Web应用中的所有的JSP页面一次性编译完成。在这种情况下,Web应用运行过程中,便可以不必再进行实时编译,而是直接调用JSP页面对应的Servlet完成请求处理, 从而提升系统性能

Tomcat服务器配置

  • server.xml:server.xml 是tomcat 服务器的核心配置文件,包含了Tomcat的 Servlet 容器 (Catalina)的所有配置
    • Server:Server是server.xml的根元素,用于创建一个Server实例,默认使用的实现类是 org.apache.catalina.core.StandardServer
    • Service:该元素用于创建 Service 实例,默认使用 org.apache.catalina.core.StandardService
    • Executor:默认情况下,Service 并未添加共享线程池配置。 如果我们想添加一个线程池, 可以在 下添加如下配置
      • < Executor name=“tomcatThreadPool”
        namePrefix=“catalina‐exec‐”
        maxThreads=“200”
        minSpareThreads=“100”
        maxIdleTime=“60000”
        maxQueueSize=“Integer.MAX_VALUE”
        prestartminSpareThreads=“false”
        threadPriority=“5”
        className=“org.apache.catalina.core.StandardThreadExecutor”/ >
    • Connector:Connector 用于创建链接器实例。默认情况下,server.xml 配置了两个链接器,一个支持HTTP协议,一个支持AJP协议。因此大多数情况下,我们并不需要新增链接器配置,只是根据需要对已有链接器进行优化
    • Engine:Engine 作为Servlet 引擎的顶级元素,内部可以嵌入: Cluster、Listener、Realm、 Valve和Host
    • Host:Host元素用于配置一个虚拟主机
    • Context:Context 用于配置一个Web应用

Web应用配置

  • web.xml是web应用的描述文件,它支持的元素及属性来自于Servlet 规范定义。在 Tomcat 中,Web应用的描述信息包括tomcat/conf/web.xml中默认配置以及Web应用WEB-INF/web.xml下的定制配置

1.ServletContext 初始化参数:我们可以通过添加ServletContext 初始化参数,它配置了一个键值对,这样我们可以在应用程序中使用javax.servlet.ServletContext.getInitParameter()方法获取参数

<context‐param>
<param‐name>contextConfigLocation</param‐name>
<param‐value>classpath:applicationContext‐*.xml</param‐value>
<description>Spring Config File Location</description>
</context‐param>

2.会话配置:用于配置Web应用会话,包括超时时间、Cookie配置以及会话追踪模式。它将覆盖server.xml和context.xml中的配置

<session‐config>
<session‐timeout>30</session‐timeout>
<cookie‐config>
<name>JESSIONID</name>
<domain>www.itcast.cn</domain>
<path>/</path>
<comment>Session Cookie</comment>
<http‐only>true</http‐only>
<secure>false</secure>
<max‐age>3600</max‐age>
</cookie‐config>
<tracking‐mode>COOKIE</tracking‐mode>
</session‐config>

3.Servlet配置:Servlet的配置主要是两部分,servlet和servlet-mapping

<servlet>
<servlet‐name>myServlet</servlet‐name>
<servlet‐class>cn.itcast.web.MyServlet</servlet‐class>
<init‐param>
<param‐name>fileName</param‐name>
<param‐value>init.conf</param‐value>
</init‐param>
<load‐on‐startup>1</load‐on‐startup>
<enabled>true</enabled>
</servlet>
<servlet‐mapping>
<servlet‐name>myServlet</servlet‐name>
<url‐pattern>*.do</url‐pattern>
<url‐pattern>/myservet/*</url‐pattern>
</servlet‐mapping>

4.Listener配置:Listener用于监听servlet中的事件

<listener>
<listener‐class>
org.springframework.web.context.ContextLoaderListener
</listener‐class>
</listener>

5.Filter配置:filter 用于配置web应用过滤器,用来过滤资源请求及响应

<filter>
<filter‐name>myFilter</filter‐name>
<filter‐class>cn.itcast.web.MyFilter</filter‐class>
<async‐supported>true</async‐supported>
<init‐param>
<param‐name>language</param‐name>
<param‐value>CN</param‐value>
</init‐param>
</filter>
<filter‐mapping>
<filter‐name>myFilter</filter‐name>
<url‐pattern>/*</url‐pattern>
</filter‐mapping>

Tomcat管理配置

1.host-manager:Tomcat启动之后,可以通过 http://localhost:8080/host-manager/html 访问该Web应用。 host-manager 默认添加了访问权限控制,当打开网址时,需要输入用户名和密码(conf/tomcat-users.xml中配置)。所以要想访问该页面,需要在conf/tomcat-users.xml 中配置,并分配对应的角色:

admin-gui:用于控制页面访问权限

admin-script:用于控制以简单文本的形式进行访问

<role rolename="admin‐gui"/>
<role rolename="admin‐script"/>
<user username="itcast" password="itcast" roles="admin‐script,admin‐
gui"/>

2.manager:manager的访问地址为 http://localhost:8080/manager,同样,manager也添加了页 面访问控制,因此我们需要为登录用户分配角色为:

<role rolename="manager‐gui"/>
<role rolename="manager‐script"/>
<user username="itcast" password="itcast" roles="admin‐script,admin‐
gui,manager‐gui,manager‐script"/>

JVM配置

  • 最常见的JVM配置当属内存分配,因为在绝大多数情况下,JVM默认分配的内存可能不能够满足我们的需求,特别是在生产环境,此时需要手动修改Tomcat启动时的内存参数分配。
  • 内存模型

请添加图片描述

  • 配置选项
set JAVA_OPTS=‐server ‐Xms2048m ‐Xmx2048m ‐XX:MetaspaceSize=256m 
‐XX:MaxMetaspaceSize=256m ‐XX:SurvivorRatio=8
  • 参数
    • -Xms:堆内存的初始大小
    • -Xmx:堆内存的最大大小
    • -XX:MetaspaceSize:元空间内存初始大小, 在JDK1.8版本之前配 置为 -XX:PermSize(永久代)
    • -XX:MaxMetaspaceSize:元空间内存最大大小, 在JDK1.8版本之前配 置为 -XX:MaxPermSize(永久代)
    • -XX:SurvivorRatio:指定伊甸园区 (Eden) 与幸存区大小比例

Tomcat集群

  • 由于单台Tomcat的承载能力是有限的,当我们的业务系统用户量比较大,请求压力比较大时,单台Tomcat是扛不住的,这个时候,就需要搭建Tomcat的集群,而目前比较流 程的做法就是通过Nginx来实现Tomcat集群的负载均衡。

请添加图片描述

  • 环境准备

1.在服务器上, 安装两台tomcat, 然后分别改Tomcat服务器的端口号 :

2.在当前服务器上 , 安装Nginx , 然后再配置Nginx, 配置nginx.conf :

upstream serverpool{
server localhost:8888;
server localhost:9999;
}
server {
listen 99;
server_name localhost;
location / {
proxy_pass http://serverpool/;
}
}

3.轮询、weight权重、ip_hash

4.共享方案:在Tomcat集群中,如果应用需要用户进行登录,那么这个时候,用于tomcat做了负载均 衡,则用户登录并访问应用系统时,就会出现问题

请添加图片描述

解决:

  • ip_hash 策略:一个用户发起的请求,只会请求到tomcat1上进行操作,另一个用户发起的请求只在 tomcat2上进行操作 。那么这个时候,同一个用户发起的请求,都会通过nginx的 ip_hash策略,将请求转发到其中的一台Tomcat上。
  • Session复制

5.SSO-单点登录:SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,也是用来解决集群环境Session共享的方案之一

请添加图片描述

Tomcat安全

  • 配置安全

    • 删除webapps目录下的所有文件,禁用tomcat管理界面
    • 注释或删除tomcat-users.xml文件内的所有用户权限
    • 更改关闭tomcat指令或禁用
    • 定义错误页面
  • 应用安全

    • 在大部分的Web应用中,都会实现自己的安全管理模块,用于控制应用系统的安全访问,基本包含两个部分:认证和授权。对于当前的业务系统,可以自己做一套适用 于自己业务系统的权限模块,也有很多的应用系统直接使用一些功能完善的安全框架,将其集成到我们的web应用中,如:SpringSecurity、Apache Shiro等。
  • 传输安全:Tomcat支持HTTPS

    • 生成秘钥库文件:

      • keytool ‐genkey ‐alias tomcat ‐keyalg RSA ‐keystore tomcatkey.keystore
      • 输入对应的密钥库密码,秘钥密码等信息之后,会在当前文件夹中出现一个秘钥库文件:tomcatkey.keystore
    • 将秘钥库文件tomcatkey.keystore复制到tomcat/conf目录下

    • 配置tomcat/conf/server.xml

    • <Connector port="8443"
      protocol="org.apache.coyote.http11.Http11NioProtocol"
      maxThreads="150" schema="https" secure="true" SSLEnabled="true">
      <SSLHostConfig certificateVerification="false">
      <Certificate
      certificateKeystoreFile="D:/DevelopProgramFile/apache‐tomcat‐8.5.42‐
      windows‐x64/apache‐tomcat‐8.5.42/conf/tomcatkey.keystore"
      certificateKeystorePassword="itcast" type="RSA" />
      </SSLHostConfig>
      </Connector>
      
    • 访问Tomcat ,使用https协议

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值