04-Web网页技术-Tomcat专题

目录

1.tomcat 基础

1.1.Tomcat的安装,启动,本地访问

1.2.Tomcat源码的运行

2.tomcat 架构

2.1http工作原理

2.2Tomcat整体架构

2.2.1 http服务器请求处理

2.2.2 servlet容器工作流程

2.2.3 Tomcat整体架构

2.3 连接器 - coyote

2.3.1 连接器 - 架构介绍

2.3.2 IO模型与协议

2.3.3 连接器组件

2.3.4 源码解析

2.4 容器 - Catalina

2.4.1 Catalina 地位

2.4.2 Catalina 结构

2.4 .3 Cataliner 结构

2.5 容器 启动流程

2.5.1 流程

 2.5.2 源码解析

 2.5.3 总结​编辑

 2.6 Tomcat 请求处理流程

2.6.1 请求流程​编辑

 2.6.2 请求流程源码解析

 3. Jasper

3.1. Jasper 简介

3.2. JSP 编译方式

3.2.1 运行时编译​编辑

 3.2.2 编译结果​编辑

 3.2.3 预编译​编辑

 3.3. JSP 编译原理

3.3.1 代码分析

 3.3.2 编译流程​编辑

 4.Tomcat服务器配置

4.1 Server.xml

4.1.1 Server​编辑

4.1.2 Service

 4.1.3 Executor

 4.1.4 Connector

4.1.5 Engine​编辑

4.1.6 Host​编辑

 4.1.7 Context​编辑

 4.2 tomcat-users.xml

5.web 应用配置

5.1 ServletContext 初始化参数

 5.2 会话配置

 5.3 Servlet配置

 5.4 Listener的配置​编辑 5.5 Filter的配置

 5.6 欢迎页面配置

 5.7.错误页面配置

 6. Tomcat 管理配置

6. 1 host - manager

 6. 2 manager

 7. JVM 配置

7.1 JVM 内存模型图

 7.2 JVM 配置选项

8.Tomcat 集群

8.1 简介​编辑

 8.2 环境准备

8.2 .2 准备 Tomcat

8.2 .3 安排配置 Nginx

8.3 Nginx 的负载均衡策略

1.轮询​编辑

 2.weight权重

 3.ip_hash​编辑

 8.4 Session 共享方案​编辑

 8.4.1 ip_hash 策略​编辑

 8.4.2 Session复制​编辑

 8.4.3 SSO - 单点登录​编辑

 9.Tomcat 安全

9.1 配置安全​编辑

 9.2 应用安全​编辑

 9.3 传输安全

9.3.1 HTTPS介绍​编辑

 9.3.2 Tomcat 支持HTTPS​编辑

10. Tomcat 性能调优

10.1 Tomcat 性能测试​编辑

 10.2 Tomcat 性能优化

10.2.1 JVM参数调优​编辑

 10.2.2 Tomcat配置调优

11.Tomcat 附加功能


1.tomcat 基础

1.1.Tomcat的安装,启动,本地访问

1.2.Tomcat源码的运行

添加pom文件,引入入Tomcat项目的依赖

将Tomcat添加成maven项目

运行Tomcat的启动类,bootstrap的main()方法,

Tomcat启动报错,添加一段代码, 需要配置一个jsp的初始化器,位置ConfigContext类,方法configureStart中加上一行代码:

context.addServletContainerInitializer(new JasperInitializer(), null);

然后启动即可访问。

可借鉴:Tomcat源码编译运行【笔记】_柏斯特的博客-CSDN博客_tomcat 源码运行报错

2.tomcat 架构

2.1http工作原理

2.2Tomcat整体架构

2.2.1 http服务器请求处理

2.2.2 servlet容器工作流程

2.2.3 Tomcat整体架构

2.3 连接器 - coyote

2.3.1 连接器 - 架构介绍

2.3.2 IO模型与协议

2.3.3 连接器组件

2.3.4 源码解析

2.4 容器 - Catalina

2.4.1 Catalina 地位

2.4.2 Catalina 结构

2.4 .3 Cataliner 结构

 tomcat 的conf 的server.xml配置文件里面:

根标签是server,一个server里面的会有多个service,一个service里面有多个Connector,

一个service里面有一个Container,Container里面包含Engine,host(虚拟主机),Context,

在host(虚拟主机)里面可以配置我们自己的context,例如:

<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" />
        -->
        <!--    解决无法登录问题-->
       <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>

 Tomcat的源码 Container的源码结构:

2.5 容器 启动流程

2.5.1 流程

 

 2.5.2 源码解析

 2.5.3 总结

 2.6 Tomcat 请求处理流程

2.6.1 请求流程

 

 

 

 

 

 2.6.2 请求流程源码解析

1.idea中Tomcat运行项目过程:

idea跑项目运行Tomcat的时候,web项目会被解析到Tomcat的webapps目录:E:\tomcat\apache-tomcat-7.0.56\webapps

2.war包运行过程:

当你打包成war丢到这个目录的时候,Tomcat启动的时候会将war包进行解压,然后运行Tomcat的时候运行项目。

3.idea中引入Tomcat项目源码:

直接运行Tomcat的bootstrap类的main()方法即可以,

4.idea中将项目引入Tomcat项目源码中debug:

将自己的项目丢到Tomcat的源码中的apache-tomcat-7.0.56\webapps目录下即可,运行bootstrap类的main()方法

小技巧:

google浏览器:请求的时候顺带会发起一个请求Tomcat的icon图标的请求,会影响debug源码。

火狐浏览器:第一次请求和google一样,第二次就不会请求icon图标。

 

 3. Jasper

3.1. Jasper 简介

3.2. JSP 编译方式

3.2.1 运行时编译

 

 

 3.2.2 编译结果

 3.2.3 预编译

 3.3. JSP 编译原理

3.3.1 代码分析

 3.3.2 编译流程

 4.Tomcat服务器配置

4.1 Server.xml

4.1.1 Server

 <Server port="8005" shutdown="SHUTDOWN">

... </Server>

 GlobalNamingResources中定义了全局命名服务:4.1.2 Service

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

4.1.2 Service

 4.1.3 Executor

 

 

 4.1.4 Connector

 

 使用了executor参数的话,可以使用共享线程。

4.1.5 Engine

 uppackWARs: 参数的设置

true:Tomcat启动的时候会解压war包,

false:Tomcat不解压war包但是直接运行war包

4.1.6 Host

 4.1.7 Context

 4.2 tomcat-users.xml

5.web 应用配置

5.1 ServletContext 初始化参数

1.在web.xml 中配置

 2.然后使用获取初始化参数方法 getInitParameter()获取参数。

 5.2 会话配置

浏览器访问服务器的时候,服务器会返回一个sessionid 给浏览器,

浏览器第二次访问服务器的时候,会携带sessionid

 在项目的web.xml 中配置session信息:

 session配置解析:

 

 验证cookie 是否正确携带:

获取session中的 id 是否存在已配置的sessionid

 在浏览器中也可以查看(application-):

 5.3 Servlet配置

配置servlet的name, servlet的类

配置servlet-mapping对应的servlet的name, servlet映射对应的URL

在当前的servlet的配置中可以配置 针对于当前servlet的初始化参数配置 init-param

 配置参数解析:

 

 5.4 Listener的配置 5.5 Filter的配置

 

 5.6 欢迎页面配置

1. 在Tomcat的 conf/web.xml也存在 "欢迎页面配置",默认的全局的欢迎页面。

 2.但是我们也可以在自己的项目中配置 自己定义的路径的欢迎页面。

 5.7.错误页面配置

如果不配置错误页面的时候:错误信息会直接响应到页面上,

1.对用户展示不友好

2.项目使用的技术暴露,不安全 

所以需要定义一个错误页面:

出现错误的时候就会跳转到错误页面

这样的话:1.用户响应比较友好 2.安全

500:

 404

 6. Tomcat 管理配置

6. 1 host - manager

tomcat的默认虚拟主机(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>
<!--    解决包无法登录问题-->
      <Realm className="com.minstone.tomcat.realm.JDBCRealm"/>

      <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" />
        -->
        <!--    解决包无法登录问题-->
       <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>

也可以修改默认的虚拟主机的地址

也可以配置多个虚拟主机

Tomcat的host-manger功能的使用需要2个角色,未配置角色的使用访问Tomcat的host-manger就会展示这样的页面:

 如何配置角色和用户?

在Tomcat\conf\tomcat-users.xml 里面配置role 和 user

<?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.
-->
<tomcat-users>
<!--
  NOTE:  By default, no user is included in the "manager-gui" role required
  to operate the "/manager/html" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary.
-->
<!--
  NOTE:  The sample user and role entries below are wrapped in a comment
  and thus are ignored when reading this file. Do not forget to remove
  <!.. ..> that surrounds them.
-->
<!--
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
-->
<!--配置role 和 user-->
 <role rolename="admin-gui"/>
 <role rolename="admin-script"/>
 <user username="user01" password="user01" roles="admin-gui,admin-script"/>
</tomcat-users>

配置完之后重启Tomcat,然后访问Tomcat的host-manager,输入用户名和密码就可以登录了

 登录:

 当自己配置的Tomcat的虚拟主机被关掉的时候,在浏览器访问的时候会去访问默认的虚拟主机

添加、移除、停止虚拟主机。

 查看参数,Tomcat、JVM等的版本信息:

 6. 2 manager

加载、停止服务

 当要访问Manger App的时候,会提示没有权限信息

 

 此时就需要去配置对应的角色:

在Tomcat\conf\tomcat-users.xml 里面配置role 和 user

<?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.
-->
<tomcat-users>
<!--
  NOTE:  By default, no user is included in the "manager-gui" role required
  to operate the "/manager/html" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary.
-->
<!--
  NOTE:  The sample user and role entries below are wrapped in a comment
  and thus are ignored when reading this file. Do not forget to remove
  <!.. ..> that surrounds them.
-->
<!--
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
-->
 <role rolename="admin-gui"/>
 <role rolename="admin-script"/>
 <role rolename="manager-gui"/>
 <role rolename="manager-script"/>
 <user username="user01" password="user01" roles="admin-gui,admin-script,manager-gui,manager-script"/>
</tomcat-users>

管理应用列表:

 我们还可以查看服务器的状态信息:

jvm的内存信息,线程信息

 7. JVM 配置

7.1 JVM 内存模型图

 7.2 JVM 配置选项

Tomcat服务器中的jvm参数的配置

Windows:E:\tomcat\apache-tomcat-7.0.56\bin\catalina.bat

linux:E:\tomcat\apache-tomcat-7.0.56\bin\catalina.sh

 在文件中配置就可以:

 JVM的参数说明:

 设置了Tomcat的JVM参数之后,

1.直接访问Tomcat的首页-》Manger App

2.查看Server Status 服务器的状态

3.查看JVM的内存分配

 

 

 堆设置的是 2048 MB = 546.5 + 1365.5 + 68 + 68 = 2048 MB

刚才设置的 eden元区 和 s0 s1区的比例是 8:1 -》

546.5 + 68 + 68 = 682.5

682.5 / 10 = 68.25

68.25 * 8 = 546

8.Tomcat 集群

8.1 简介

 8.2 环境准备

8.2 .2 准备 Tomcat

安装2个Tomcat服务器

 依次修改2份端口 (Tomcat的 server.xml)

第1份 Tomcat 的端口修改

1. 修改server的 监听shutdown指令的服务 的端口号改为8015

 2.修改connector 的 8080 端口为 8888

 3.将 AJP/ 1.3 Tomcat与其他服务器进行交互的端口8009 改为8019

 第2份 Tomcat 的端口 依次改为:

1. 修改server的 监听shutdown指令的服务 的端口号改为8025

2.修改connector 的 8080 端口为 9999

3.将 AJP/ 1.3 Tomcat与其他服务器进行交互的端口8009 改为8029

8.2 .3 安排配置 Nginx

在E:\nginx-1.16.1\conf\ngin.conf 配置文件中配置:

监听的端口号:99

服务名:localhost

反向代理的地址:http://serverpool/

serverpool 需要新增配置 upstream 负载均衡模块

 upstream 负载均衡模块 配置 代理的2个服务的ip:端口号

 如何测试,到底访问的是哪一台服务器?

1.修改Tomcat的 root 下面 的index.jsp 的页面文字,分别为8888, 9999

2.然后再分别启动2台服务器,并且启动Nginx服务器,Nginx\nginx.exe (双击Nginx.exe文件)

Nginx一闪而过,但是去控制台查看后台进程,Nginx是已经启动的

测试结果:

1.访问8888服务器:

2.访问9999服务器:

3.访问Tomcat的集群,访问Nginx配置的监听的端口和地址:localhost:88

第1次访问到了 8888 服务器

 第2次访问到了 9999服务器

后续继续访问,会访问8888,9999轮询访问。

8.3 Nginx 的负载均衡策略

1.轮询

 2.weight权重

测试给服务器设置不同的权重

 重新加载Nginx

 当我们生成环境的 不同的服务器的性能不同,可以设置不同的权重值

 3.ip_hash

 8.4 Session 共享方案

 8.4.1 ip_hash 策略

 8.4.2 Session复制

 如何实现在不同的服务器,第一次访问没有session 就存取一个session,当也是第一次访问第二台服务器的时候如何将刚才第一台服务器的session存储到第二台服务器?

1.将集群中的 Tomcat的 conf\server.xml 配置文件的集群配置 打开

 2.在服务器部署的项目的web.xml 里面配置 

最后重启集群中的2台Tomcat:

先访问第一个Tomcat,是没有session的,但是存进去了

 然后再访问第二台Tomcat,就提示已存在session,8888的session已复制到9999服务器

 当Tomcat的集群数量比较多的时候,当用户第一次访问的时候,需要将所有的session复制操作,需要执行 n-1次session复制的操作,这是弊端。资源浪费(广播的形式复制,浪费带宽,现在开发中几乎不使用)。Tomcat的官网说了,节点超过4个之后就不推荐使用此方案

 8.4.3 SSO - 单点登录

 9.Tomcat 安全

9.1 配置安全

 

 9.2 应用安全

 9.3 传输安全

9.3.1 HTTPS介绍

 

 9.3.2 Tomcat 支持HTTPS

10. Tomcat 性能调优

10.1 Tomcat 性能测试

 

 

 

 10.2 Tomcat 性能优化

10.2.1 JVM参数调优

 

 

GC参数:

选项        描述
XX:+UsrConcMarkSweepGC 对于老年代,启动CMS垃圾收集器,当并行收集器无法满足应用的延迟需求时,推荐使用CMS或G1收集器,启动该选项后,-XX:UseParNewGC自动启用(设置年轻代垃圾收集器ParNew)
 

查看Tomcat中的默认的垃圾收集器
1.在远程的Tomcat/bin/catalina.sh的配置中,加入如下配置
连接远程Tomcat的配置信息:
##指定远程地址,端口号等
JAVA_OPS="XXXXXXXXXXXXXXXXXXX"

保存-
重启Tomcat-
查看Tomcat的启动日志是否正常

2.打开jconsole(JDK\bin\jconsole.exe),查看远程的Tomcat的概要信息
连接远程Tomcat:
页面可以选择 
本地进程: 本地Tomcat运行项目
远程进程:ip:port
查看顶部的菜单“VM概要”:可查看JVM的实际参数,Tomcat默认的垃圾收集器
菜单“内存”:点击右上角的“执行GC(G)”之后就可以在”VM概要“页面查看
Tomcat的垃圾收集器,以及其他信息

我们也可以在测试的时候,将JVM参数调整之后,将GC的信息打印出来,便于为我们进行参数
调整提供依据,具体参数如下:

选项  描述
-XX:+PrintGC 打印每次GC的描述
-XX:+PrintGCDetails打印每次GC的详细信息

在bin/catalina.sh的脚本中,追加如下配置:
JAVA_OPS="-XX:-UsrConcMarkSweepGC -XX:+PrintGCDetails"
#查询Tomcat运行的端口号        
ps -ef|grep tomcat
#结果如下:
root 9897 1 6 02:15 pts/4 /usr/share/jdk1.8/bin/java -Djava.util.logging,config.fileXXXXXXXXXXXX
#    然后杀掉Tomcat进程:
kill -9 9897
#然后重启tomcat
/bin/catalina.sh
GC日志:
重启的时候就进行了一次GC,同时控制台中也打印了GC的详细信息,说明刚才我们的设置起作用了
垃圾收集器:
然后重新 打开jconsole 连接远程Tomcat,查看VM概要,可以看到垃圾收集器和刚才的垃圾收集器不一样,发生了变化
第一个:新生代使用的是并行的垃圾收集器‘ParNew’没有发生改变
第二个:被修改为了我们刚才配置的UsrConcMarkSweepGC(CMS的垃圾收集器,对于老年代)

操作:在菜单“内存”:点击右上角的“执行GC(G)”
可以在”VM概要“页面查看 GC执行次数+1
然后再控制台当时就可以看到GC的信息:Full GC CMS(垃圾收集器)内存的变化以及元空间等内存信息的变化

10.2.2 Tomcat配置调优

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

参数   描述
maxConnections最大连接数,当到达该值后,服务器接受但不会处理更多的请求,额外的请求将会阻塞直到连接数低于maxConnections。可通过ulimit-a查看服务器限制。对于CPU要求更高(计算型)时,建议不要配置过大;对于CPU要求不是特别高时,建议配置在2000左右,当然这个需要服务器对硬件的支持
maxThreads 最大线程数,需要根据服务器的硬件情况,进行一个合理的设置
acceptCount最大排队等待数,当服务器接受的请求数量达到maxConnections,此时Tomcat会将后面的请求,存放到任务队列中进行排序,acceptCount指的任务队列中排队的请求数。一台Tomcat的最大的请求处理数量,是maxConnections+acceptCount

11.Tomcat 附加功能

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值