**Tomcat服务配置与性能优化*

Tomcat服务配置与性能优化

一. Tomcat的概述

1.1 概述

  • Apache软件基金会核心项目
  • 开源软件
  • 中小型应用服务器

1.2 市场占比

在这里插入图片描述

1.3 结构图

在这里插入图片描述

  • Connector:接收请求并转交给Container,相当于城墙的城门
  • Container: Servlet容器管理生命周期,处理业务逻辑,并返回给Container
  • Jasper: 将JSP文件编译为java文件,并转为Class文件
  • Naming:将名称和对象联系起来,可以使用名称来访问对象
  • Session: 管理和创建Session,以及Session的持久化
  • Logging: 记录相关日志,包含错误信息等
  • JMX: 可以远程监控Tomcat的运行状态;

1.4 Connecter组件

  • 接收客户端连接
  • 加工处理客户请求

1.5 Container组件

  • 所有子容器的父接口

  • 责任链设计模式: 将一系列的功能连成一条链,而进入的一个请求,则会通过这个链子,直到有一个功能能处理它

  • 结构图如下:
    在这里插入图片描述

  • 说明:

    • Engine: 用来管理多个站点
    • Host: 代表一个站点,也可以叫做虚拟主机,通过Host就可以添加站点;
    • Context: 代表一个应用程序,一个war包
    • Wrapper: 代表一个封装的Servlet

1.6 处理请求的顺序

在这里插入图片描述

处理后返回的对象就是Response对象

二. Tomcat安装

2.1 Windows安装Tomcat

  • 搭建运行基础环境: 首先下载JDK 1.8:

    • 安装JDK 1.8
    • 配置环境变量:
      • JAVA_HOME Path-> 安装地址
      • 打开命令行工具,输入: java -version 显示版本号后则安装成功
  • 下载Tomcat:

    1. 地址:hppts://tomcat.apache.org/download-70.cgi
    2. 图示:
      在这里插入图片描述
  • 安装Tomcat:

    • 解压tomcat
    • 点击startup.bat 运行 (可成功启动,但此时没有放入项目)
    • 将war包的项目放入Tomcat的webapps目录下,再点击startup.bat运行

2.2 Linux环境下安装Tomcat

  1. 校验是否已经安装过Java的Jdk java -version
  2. 进入JDK安装包所在的路径 cd /usr/local/java
  3. 解压JDK tar -zxvf jdk-8u161-linux-x64.tar.gz

以上操作图示如下:
在这里插入图片描述

  1. 配置环境变量: vi /etc/profile
    在这里插入图片描述

  2. 在peofile文件的最下方添加:
    在这里插入图片描述

这里的环境变量地址JAVA_HOME每个人的不一定一致,我们在安装JDK的时候可以使用PWD命令获取JDK安装地址,然后对应修改第一行的export JAVA_HOME内容;

  1. 测试命令: java -version [刚创建的环境变量可会立即生效,可断开连接后重新测试]

  2. 创建Tomcat文件夹,图示如下:

    • cd /usr/local/
    • mkdir tomcat
  3. 进入tomcat目录,并将tomcat的安装包放入:
    在这里插入图片描述

  4. 进入Bin目录,并启动Tomcat运行
    在这里插入图片描述

  5. 退出到日志目录,并查看启动日志:
    在这里插入图片描述

  6. 通过启动日志中显示的端口号,打开浏览器输入: 192.168.199.130:8080

  7. 将项目war包放入Tomcat的webapps目录下:
    在这里插入图片描述

  8. 启动项目,并打开项目中的接口进行测试:
    在这里插入图片描述

  9. 测试结果:
    在这里插入图片描述

2.3 项目结构:

  • bin: 用来存放tomcat可以运行的命令,以.sh结尾的是Linux的命令,以.bat结尾的是Windows的
  • conf: 配置文件
    • catalina-policy:防止用户代码和jsp代码破坏tomcat的容器
    • catalina.properties:不能被jsp和servlet修改的文件列表
    • context.xml它是context的配置文件,被所有应用程序使用的
    • logging-properties: tomcat使用的配置文件,配置了日志输入的格式等信息
    • server.xml: tomcat启动的配置文件,比如端口号等的修改就在里面,在tomcat启动的时候构建tomcat容器
    • tomcat-user.xml: tomcat的web页面,一些人员和管理员的信息可以在这里面进行配置
    • web.xml: 配置启动信息,比如启动页等;
    • lib: 启动的jar包
    • logs: 日志信息
    • temp: 临时文件,删了也没多大影响
    • webapps:存放应用程序,当tomcat启动的时候,会加载webapps目录下的项目 (当然也可以不用放在这里,如果是放在别的地方,需要在配置文件中添加文件的映射地址,这样在启动的时候,就会通过这个地址去寻找项目并加载到Tomcat中)
    • ROOT: 它是tomcat的一个根目录,我们放在这里面的图片可以通过ip+端口+图片名就可以访问到这个图片,不需要添加别的接口,如图所示:

在这里插入图片描述
- work: 用于存放编译后的文件

三. Tomcat常用配置选项修改

3.1 修改Tomcat端口号

  • 端口范围: 1~65535
  • 修改操作:
    1. 打开文件: conf/server.xml:
      在这里插入图片描述

监听关闭HTTP服务等的端口
在这里插入图片描述
HTTP端口,我们平时用的就是这个
在这里插入图片描述
连接其他服务的端口

3.2 修改内存

  • 内存模型:

    • 堆内存
    • 栈内存
    • 静态内存区
  • 内存异常:

    • OutOfMemoryError: Java heap space异常 堆内存满了 [程序有bug或者加载的过多]
    • OutOfMemoryError: PermGen space异常 静态内存区异常 [JDK8 以后修改了内存模型,放在了元空间,不会再出现这个异常了]
    • StackOverflowError异常: 栈内存溢出 [通常为死循坏或者递归导致]
  • 配置参数:

    • 配置地址: bin/catalina.bat的文件的第二行即可 [网上搜,也有其他的配置方式]
    • 配置内容:
set JAVA_OPTS="-server -Xms256m -Xmx512m VT-XX:MetaspaceSize=128m VT-XX:MaxMetaspaceSize=256m

图示:
在这里插入图片描述

  • 配置内存参数解析:
    • server: 运行模式(server的性能更好,而client是默认的运行模式)
    • Xms: Java Heap的初始内存(堆内存),最好不要超过内存的80%
    • Xmx: Java Heap的最大内存 建议设置为物理内存的50%,也最好不要超过80%
    • VT-XX:MetaspaceSize: 初始元空间大小
    • VT-XX:MaxMetaspaceSize: 最大元空间大小,默认无上限

调整内存的大小,是为了减少垃圾收集的次数,这样能将性能用来处理更多的请求;

3.3 热部署

  • 什么是热部署
    • 不用重新启动应用就可以动态加载项目
  • 如何配置热部署
    1. 第一种方式:直接将war包放入webapps
    2. 第二种方式:
      在这里插入图片描述

debug:表示日志打印级别 docBase映射项目地址 path:访问路径 reloadable:是否加载修改或新增后的内容(热部署关键)
3. 第三种方式:(不用写path,实际跟第二种差不多)
1. 在此路径下创建文件(文件名随意): conf/Catalina/localhost/demo2.xml
2. 在此文件夹中添加内容并图示:

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="C:\Users\Rodger\Desktop\Demo" reloadaable="true" />

在这里插入图片描述

3.4 配置连接池和数据源

  • JDBC操作数据库:
    1. 加载驱动
    2. 创建连接
    3. 执行SQL
    4. 释放连接

其中1,2,4步都是通用的,使用数据库连接池能保证较快的数据连接速度,并且更加安全可靠;

  • Tomcat的连接方式:

    • 独立的配置连接
    • 异步的配置连接
  • 操作(实际代码):

    • pom.xml: 引入依赖
<dependency>
	<groupId>org.apache.tomcat</groupId>
	<artifactId>tomcat-jdbc</artifactId>
	<version>7.0.90</version>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.46</version>
</dependency>
- Demo.java:
public class Demo {
public static void main(String[] args)throw Exception{
PoolProperties p=new PoolProperties();
p.setUtil("jdbc:mysql://192.168.199.130:3306/user?useSSL=false");			//数据库连接URL
p.setDriverClassName("com.mysql.jdbc.Driver");		//连接驱动
p.setUserName("demo");			//用户名
p.setPassword("Demo@1234");			//密码
p.setJmxEnabled(true);			//是否将连接注册到JMX中
p.setTestWhileIdle(false);			//是否被空闲连接回收期进行检测
p.setTestOnBorrow(true);		//是否在连接池中取出连接前进行检查
p.setValidationQuery("SELECT 1");			//SQL查询
p.setTestOnReturn(false);			//是否在归还前进行检查
p.setValidationINterval(30000);		//设置验证频率
p.setTimeBetweenEvicationRunsMillis(30000);			//回收期休眠时间
p.setMaxActive(100);			//最大活动连接
p.setInitialSize(10);			//初始化连接
p.setMaxWait(10000);			//最大等待时间
p.setMinIde(10);			//最小的空闲连接
p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;""org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");	//Jdbc拦截器,如不对可网上找
DataSource datasource=new DataSource();
datasource.setPoolProperties(p);
Connection con=null;
try{
con = datasource.getConnection();
Statement st=con.createStatement();
ResultSet rs=st.execfcuteQuery("select * from user;");
int cnt=1;
while(rs.next()){
	System.out.println((cnt++)+".id":"+rs.getString("id")+"username:"+rs.getString("username")+"poassword:"+rs.getString("password"));
}
	rs.close();
	st.close();
}finally{
	//关闭流,此处省略
}}}}
- 启动后显示结果:

在这里插入图片描述

- 使用context.xml进行配置:

在这里插入图片描述
在这里插入图片描述

将上面的配置放入context.xml中,如图所示:
在这里插入图片描述

  • 然后在web.xml中进行配置:
    在这里插入图片描述

将resource-ref标签及里面内容放入web.xml中[它相当于引用context.xml中刚刚配置的内容]

  • 测试配置的数据库连接池:
    在这里插入图片描述

四. Web管理

  • 管理界面功能简述
  • 使用tomcat管理界面发布项目
    • 比如weblogic: 可以用于管理Context,数据源,DataSource,初始化参数,项目的访问路径,多种数据库管理等,可以使用ftp等方式在web管理界面将项目上传到tomcat里面;
  • 操作:
    • 配置用户名密码
      在这里插入图片描述
    • 登录localhost:8081 然后点击Manager App输入用户名和密码
      在这里插入图片描述
    • 上传项目:
      在这里插入图片描述
    • 上传成功:
      在这里插入图片描述
    • 修改配置项(可修改文件上传最大值):
      在这里插入图片描述
    • 修改最大上传容量:
      在这里插入图片描述

如果不对此进行修改,当上传到额项目若大于50M则可能会上传失败;

五. 单点登录

5.1 概述:

  • 单点登录(Single Sign On): 简称为SSO,是目前比较流行的企业业务整合的解决方案之一;
  • 定义:SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统

5.2 CAS

  • 开源的企业级单点登录解决方案
  • CAS Server 和CAS Client
  • 图示:
    在这里插入图片描述

5.3 操作:

  • 地址: https://github.com/apereo/cas/release/tag/v4.1.7
  • 在tomcat的server.xml中进行配置:
    在这里插入图片描述
  • 将cas的war包放入tomcat的webapps目录下,然后点击启动,再访问端口:localhost/cas/login [这里没有写端口号是因为将端口号改为了443就可以进行省略,如果没有在server.xml中修改端口号的话需要再重新加上端口号进行访问]
    在这里插入图片描述
  • 登录,先找到账号密码,在tomcat的webapps目录下的WEB-INF的deployerConfigContext.xml文件中获取(105行左右):
    在这里插入图片描述
    在这里插入图片描述

key为登录名,value为登录密码

  • 登录成功
    在这里插入图片描述

这种方式是直接从配置文件中获取账号密码,然后进行登录的。在我们的企业级开发的时候,登录的账号密码通常是从数据库中进行获取,下面将介绍从数据库中获取账号密码的方式;

5.4 从数据库中获取CAS的账号密码

  1. 因为是从数据库中取数据,所以我们需要将三个依赖包加入cas的项目中
    在这里插入图片描述
  2. 找到webapps/cas/WEB-INF/lib目录下,将三个jar包粘贴进入(如果有已经存在的,直接替换即可)
    在这里插入图片描述
  3. 进入webapps/cas/WEB-INF/deployerConfigContext.xml在54行左右注释到 key-ref为primaryAuthenticationHandler的策略,并添加新的放在此处,如图所示:
    在这里插入图片描述
  4. 加入策略后需要再将被引用的数据源信息也放入里面,如图所示:
    在这里插入图片描述

这里面的数据源要根据自己的情况做对应变化,尤其是url地址,username和password等

  1. 重新启动tomcat,登录tomcat的web界面,输入数据库中所在表的保存的账号和密码进行尝试

5.5 多域名访问

  • 提高资源利用率

  • 如何配置多域名访问

    • 基于ip地址
    • 基于端口主机
  • 基于ip地址的多域名访问:
    在这里插入图片描述

  • 基于端口的多域名访问
    在这里插入图片描述

修改静态资源需要重新启动,这里面修改的是Tomcat里面的server.xml中进行配置;

六. Tomcat的安全配置

6.1 概述

  • Tomcat安全配置

    • 安装后初始化配置
    • 安全规范
  • 初始化配置

    • 关闭服务器端口
    • 隐藏版本信息
    • 禁用Tomcat管理页面
    • 自定义错误页面
    • AJP端口管理
    • 启用cookie的HttpOnly

6.2 修改shoudown命令

  • 概述: 通过此命令可以将tomcat服务给关闭掉;这个命令如果被其他人所使用,然后连接上了tomcat的ip地址和端口,是可以直接关掉服务的,这就是一个漏洞;我们可以通过修改showdown命令来改变;
  • 问题现象:
  • 登录tomcat图示:
    在这里插入图片描述

当连接上了之后,输入showdown就可以关掉tomcat服务,我们需要修改这个命令的

  • 解决方式:进入Tocmat的server.xml中进行修改关闭命令,如图所示:
    在这里插入图片描述

6.3 隐藏版本信息

  • 为什么要隐藏?

    • 因为有些黑客知道某些特定版本的漏洞,如果版本信息被发现了可能会被针对性攻击;所以我们需要隐藏Tomcat的版本信息,以达到安全的目的;
  • 如图为版本信息:
    在这里插入图片描述

  • 修改版本信息:
    在这里插入图片描述

先找到lib目录,找到catalina.jar包,用解压工具进入,进入catalina.jar/org/apache/catalina/util/ServerInfo.properties文件,然后点击修改server.info的值,将其替换成其他信息;

  • 未修改时:
    在这里插入图片描述

  • 修改后:
    在这里插入图片描述

  • 显示效果:
    在这里插入图片描述

6.4 禁用Tomcat页面

  • 概述:Tomcat的管理页面是通过webapps下的ROOT目录进行展示的,最简单的办法就是将ROOT文件目录重命名,然后重新创建一个新的ROOT目录(此ROOT目路为空的文件夹),这样在启动Tomcat后就没有管理页面了,也就相对比较安全了;
  • 图示:
    在这里插入图片描述

6.5 修改默认的错误页面

  • 概述:当我们使用Tomcat作为Web服务的时候,当出现比如404错误的时候,会展示一个原生的错误页面,我们可以通过一个自定义的错误页面,这样能比较友好的展示错误信息,提高用户的体验度;

  • 错误页面展示(未修改前):
    在这里插入图片描述

  • 操作:

    1. 首先我们写一个自定义的错误页面,做一个简单的错误页面演示:
      在这里插入图片描述
    2. 将错误页面放入ROOT目录下,如图示:
      在这里插入图片描述
    3. 进入conf/web.xml中进行配置关联:
      在这里插入图片描述
    4. 启动的时候,如果是触发了相对应的错误的时候,就会跳转相对应的页面:
      在这里插入图片描述

6.6 AJP协议

  • 概述:ajp13是一个二进制的TCP传输协议,相比HTTP这种纯文本的协议来说,效率和性能更高,也做了很多优化。显然,浏览器并不能直接支持AJP13协议,只支持HTTP协议。所以实际情况是,通过Apache的proxy_ajp模块进行反向代理,暴露成http协议给客户端访问。所以这么来看实际跟动静分离没一毛钱关系,你如果没做动静分离的设置,那么单纯反向代理AJP13协议也没太大的意义。其他支持AJP协议的代理服务器当然也可以用这种做法。但是实际情况是,支持AJP代理的服务器非常少,比如目前很火爆的Nginx就没这个模块。因此tomcat的配置大部分都是关闭AJP协议端口的,因为除了Apache之外别的http server几乎都不能反代AJP13协议,自然就没太大用处了。

  • 图示:
    在这里插入图片描述

如果前端使用apache的则必须使用这个协议,如果是使用Nginx的,我们可以注释掉这个协议;

6.7 修改Cookie的安全性

  • 启用Cookie的HttpOnly

  • 什么是Cookie?

    • 保存在客户端的纯文本文件
    • cookie实现离线购物车等功能,比如用户的账号密码的保存;

在Session 出现之前,都是通过cookie进行记录的保存

  • 黑客攻击的方式: XSS-跨站脚本攻击

    • 它是通过往浏览器中插入一段HTML代码,当用户浏览页面的时候,就会执行这段代码,就可以达到攻击用户的一个特殊目的;
    • 如果给Cookie设置了HttpOnly属性,那么黑客就无法读取Cookie里面的信息了,这样能够有效的防止XSS攻击
  • 操作:进入conf/context.xml中,对Context标签增加属性:useHttpOnly=“true”,图示如下:
    在这里插入图片描述

6.8 Tomcat的安全规范

  • 概述:

    • 账号管理、认证授权
    • 日志配置操作
    • 设备其他配置操作
    • 共享账号、无关账号
    • 口令密码
    • 用户权限
  • 权限和角色的配置,如图:
    在这里插入图片描述

  • 日志配置操作:[可以对用户登录的信息给予记录,比如用户账号,登录时间等等]
    在这里插入图片描述

将这段被标识被注释掉的内容取消注释即可启用日志功能;里面的Pattern表示日志记录的哪些数据,resloveHosts里面如果为true则会将用户请求的ip地址转换为主机名,如果为false则直接保存为ip地址;

  • 日志记录的成果:
    在这里插入图片描述

  • 设备其他配置操作,比如自定义退出时间,如图所示:
    在这里插入图片描述

七. 优化配置

7.1 概述

  • 缓存优化:
    • Nginx:网页静态
    • gzip:文件压缩
  • 运行模式:
    • BIO:tomcat7以下模式
    • NIO: 基于缓存区、非阻塞的I/O【WEB项目可以提高服务性能,增强高并发能力,推荐~】
    • APR:Tomcat7及以上默认模式【安装困难,但通过操作系统大幅提高性能】

7.2 谢谢观看加油

发布了127 篇原创文章 · 获赞 52 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_37128049/article/details/93396060