一. 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:
- 地址:hppts://tomcat.apache.org/download-70.cgi
- 图示:
- 安装Tomcat:
- 解压tomcat
- 点击startup.bat 运行 (可成功启动,但此时没有放入项目)
- 将war包的项目放入Tomcat的webapps目录下,再点击startup.bat运行
2.2 Linux环境下安装Tomcat
- 校验是否已经安装过Java的Jdk java -version
- 进入JDK安装包所在的路径 cd /usr/local/java
- 解压JDK tar -zxvf jdk-8u161-linux-x64.tar.gz
以上操作图示如下:
- 配置环境变量: vi /etc/profile
- 在peofile文件的最下方添加:
这里的环境变量地址JAVA_HOME每个人的不一定一致,我们在安装JDK的时候可以使用PWD命令获取JDK安装地址,然后对应修改第一行的export JAVA_HOME内容;
-
测试命令: java -version [刚创建的环境变量可会立即生效,可断开连接后重新测试]
-
创建Tomcat文件夹,图示如下:
- cd /usr/local/
- mkdir tomcat
- 进入tomcat目录,并将tomcat的安装包放入:
- 进入Bin目录,并启动Tomcat运行
- 退出到日志目录,并查看启动日志:
-
通过启动日志中显示的端口号,打开浏览器输入: 192.168.199.130:8080
-
将项目war包放入Tomcat的webapps目录下:
- 启动项目,并打开项目中的接口进行测试:
14. 测试结果:
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
- 修改操作:
- 打开文件: 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 热部署
- 什么是热部署
- 不用重新启动应用就可以动态加载项目
- 如何配置热部署
- 第一种方式:直接将war包放入webapps
- 第二种方式:
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操作数据库:
- 加载驱动
- 创建连接
- 执行SQL
- 释放连接
其中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 操作:
- 地址: github.com/apereo/cas/…
- 在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的账号密码
- 因为是从数据库中取数据,所以我们需要将三个依赖包加入cas的项目中
2. 找到webapps/cas/WEB-INF/lib目录下,将三个jar包粘贴进入(如果有已经存在的,直接替换即可)
3. 进入webapps/cas/WEB-INF/deployerConfigContext.xml在54行左右注释到 key-ref为primaryAuthenticationHandler的策略,并添加新的放在此处,如图所示:
4. 加入策略后需要再将被引用的数据源信息也放入里面,如图所示:
这里面的数据源要根据自己的情况做对应变化,尤其是url地址,username和password等
- 重新启动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错误的时候,会展示一个原生的错误页面,我们可以通过一个自定义的错误页面,这样能比较友好的展示错误信息,提高用户的体验度;
- 错误页面展示(未修改前):
- 操作:
- 首先我们写一个自定义的错误页面,做一个简单的错误页面演示:
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及以上默认模式【安装困难,但通过操作系统大幅提高性能】