一、Tomcat概述
Tomcat是一个开源的web应用服务器
- 1、处理动态页面(基于http的请求)
- 2、处理后端请求(主要指调用数据库服务器)
- 3、易部署,tomcat会自动识别配置文件,自动部署运行
- 4、轻量级服务软件,处理中小架构的网站可以满足需要,大型的交互需求,tomcat就非长项了,在容器化部署的项目架构中是不适用tomcat的,都是用jar包直接运行,包括k8s
Tomcat与Nginx的区别
- nginx主要处理静态页面,动态请求(连接数据库、动态页面)并不是nginx处理的长项
- 动态的请求会通过nginx转发动态请求交给tomcat进行处
二、Tomcat核心组件
1、Web容器:完成web服务器的功能。处理的请求是nginx转发的http(s)请求,此时处理的是动态页面(基于Java代理编译的页面),也处理后端的请求(转发到数据库的请求)
2、Servlet容器:名字是catalina,是整个tomcat处理的底层逻辑。既处理web请求的动态页面,也处理后端请求(数据库)
3、JSP容器:jsp会把动态页面翻译成servlet的代码,用编译后的规则显示代码的静态页面
容器:容器通常指的是一种虚拟化技术,允许在当前的操作系统当中虚拟化地运行多个独立的环境。这些独立运行的环境就是我们说的容器,但是它们彼此之间相互隔离,各自拥有自己的一套系统资源。容器寄生在宿主上,实际使用的是宿主的资源。
Servlet容器
- 是用于开发web应用程序的关键组件
- 生成动态页面内容
- 主要负责处理http请求,生成动态内容与客户端之间的交互,包括前端交互、与后端数据库服务器交互、和redis缓存交互
- 还可以对会话进行管理可以处理用户会话,跟踪用户在不同请求之间的状态。会话保持是指可以在用户访问不同页面时保持用户的状态信息
JSP容器
Jsp:java server pages,是一种动态网页的开发技术,使用JSP的标签可以在HTML的网页当中插入java代码。标签通常以 <% 开头,以 %> 结尾。
实现java、web应用程序的访问界面,用户界面,或者访问数据库,生成页面内容
三、Tomcat的功能组件结构
Tomcat的核心功能部分由两个块组成:
- Connector:接收和响应外部请求的连接器,默认端口8080
- Container:负责处理请求
1、用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得
2、Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应
3、请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等
4、执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端
Engine:引擎,管理多个虚拟主机,一个tomcat里面只能有一个Engine
host:代表站点,也就是虚拟主机,一个engine可以有多个host
context:一个context指向一个web应用
wrapper:最底层,处理和编译代码,运行结果
四、Tomcat 服务部署
1、关闭防火墙
[root@tomcat1 conf]# systemctl stop firewalld
[root@tomcat1 conf]# setenforce 0
2、安装JDK
JDK:开发工具包,开发java的应用程序,jdk包括:编译器、调试器等等以及java的类库
开发者用来创建、编译、运行java程序的重要组件
cd /opt
--传入安装Toncat所需软件包--
rpm -qpl jdk-8u201-linux-x64.rpm
rpm -ivh jdk-8u201-linux-x64.rpm
java -version
3、设置JDK环境变量
vim /ect/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
suorce /etc/profile.d/java.sh
java -version
-------------------------------------------------------------------------------------------
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
#设置java_home的环境变量,指向java工作目录jdk
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
#java类的搜索路径
export PATH=$JAVA_HOME/bin:$PATH
#将java的可执行命令添加到系统的环境变量当中
4、部署Tomcat
cd /opt
tar -xf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
浏览器访问20.0.0.71:8080
- bin:存放启动或者关闭tomcat的脚本文件,start.up shoutdown down.sh
- conf:存放的是配置文件,server.xml就是tomcat的主配置文件
- webpass:tomcat默认的web应用的部署目录
- work:tomcat的工作目录,存放jsp编译之后产生的class文件,清理缓存会用到
五、Tomcat配置虚拟主机
在公司当中会运行多个项目,一台部署tomcat太多会浪费资源,所以会在tomcat中配置多个主机通过不同域名访问不同的内容
[root@tomcat1 ~]# cd /usr/local/tomcat/webapps/
[root@tomcat1 webapps]# mkdir pup benet
[root@tomcat1 webapps]# cd pup/
[root@tomcat1 pup]# vim index.jsp
this is pup page\!
[root@tomcat1 pup]# cd ..
[root@tomcat1 webapps]# cd benet/
[root@tomcat1 benet]# vim index.jsp
this is benet page\!
[root@tomcat1 webapps]# cd ..
[root@tomcat1 tomcat]# cd conf/
[root@tomcat1 conf]# vim server.xml
--删除148,149行--
--添加--
<Host name="www.pup.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/pup" path="" reloadable="true" />
</Host>
<Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />
</Host>
----------------------------------------------------------------------------------------
Host name="www.pup.com" 指定站点,虚拟主机的域名
appBase="webapps" 站点的工作目录在webapps,存放web应用的目录
unpackWARs="true" 启动webapps,对war包进行展开
autoDeploy="true" 防止在默认应用目录的程序文件自动进行部署
xmlValidation="false" 是否验证XML文件执行的有效性标志
xmlNamespaceAware="false" 是否启动xml命令空间
docBase="/usr/local/tomcat/webapps/pup" web应用程序的具体部署位置,也就是context所属的host中的具体工作目录
path="" 为空,默认就是webapps
reloadable="true" 允许重新加载context相关的web应用程序的类
[root@tomcat1 conf]# echo "20.0.0.71 www.pup.com www.benet.com" >> /etc/hosts
[root@tomcat1 conf]# cd /usr/local/tomcat/bin/
[root@tomcat1 bin]# ./shutdown.sh
[root@tomcat1 bin]# ./startup.sh
工作流程:
1、请求到连接器:连接的端口是8080,连接器接收请求
2、www.pup.com 引擎管理虚拟主机--host--www.kgc.com--context--访问www.pup.com该主机的工作目录--webapps/pup--index.jsp--wrapper--servlet来解析index.jsp内容
3、响应的内容返回到客户端
六、Tomcat优化
Tomcat的优化方案
- 1、配置文件优化
- 2、jvm优化
- 3、操作系统优化
1、配置文件优化
[root@tomcat1 conf]# vim server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-------------------------------------------------------------------------------------------
maxThreads="200"
tomcat使用线程来处理接收的每个请求可以创建的最大线程数,支持的最大并发连接数为200
minSpareThreads=200
最小空闲线程数,tomcat启动时的初始化的线程数,表示没人请求,也要打开这些空的线程等待请求
maxSpareThreads
最大备用线程数,创建的线程超过这个值,tomcat会关闭不再需要的线程,默认是1(不做限制)
connectionTimeout="20000"
网络连接超时,一般设置为20000ms
enableLookups="false"
是否反向解析域名,此处为不解析,提高处理效率
disableUploadTimeout="true"
上传文件时是否启用超时限制
connectionUploadTimeout
上传比下载要耗时,根据需求自定义
accpetCount="100"
所有的可以使用的线程都被占用,可以列入的队列长度的最大值,默认100
compression="on" (off禁止压缩,false强制压缩)
是否对相应的数据进行gzip压缩(压缩之后的页面大小可以减少1/3)
noCompressionUserAgents="gozilla chrom"
对指定访问的浏览器不进行压缩
-------------------------------------------------------------------------------------------
[root@tomcat1 conf]# cd /usr/local/tomcat/bin/
[root@tomcat1 bin]# ./shutdown.sh
[root@tomcat1 bin]# ./startup.sh
2、Jvm优化
[root@tomcat1 tomcat]# cd webapps/manager/META-INF/
[root@tomcat1 META-INF]# vim context.xml
--22行修改--
allow=".*" />
[root@tomcat1 tomcat]# cd conf/
[root@tomcat1 conf]# vim tomcat-users.xml
--21行之后插入--
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
[root@tomcat1 conf]# cd ..
[root@tomcat1 tomcat]# cd bin/
[root@tomcat1 bin]# ./shutdown.sh
[root@tomcat1 bin]# ./startup.sh
[root@tomcat1 bin]# vim catalina.sh
--插入--
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmn2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:PermSize=1024m -XX:MaxPermSize=1024m -Djava.awt.headless=true -XX:+DisableExplicitGC"
-------------------------------------------------------------------------------------------
-server:一定要作为第一个参数
-Xms2048m:java初始化堆的大小,是分配jvm的最小内存。cpu性能高,可以值再设高一点
-Xmx2048m:最大java堆的大小,是分配jvm的最大内存,取决于物理内存有多大。建议-xms和xmx的值设置成一样,推荐是你物理内存的一半
目的:java的垃圾回收机制清理完堆区后,不需要重新分隔计算堆区的大小
-Xmn768m:新生代内存的大小,官方推荐整个堆大小的3/8
新生代:java中没新建一个新的对象,占用的内存就是新生代
中生代:对象创建完毕之后,占用的内存就是中生代
老年代:java垃圾回收机制进行资源回收之后,中生代中剩余的部分就是老年代
-XX:ParallelGCThreads=2
配置并行收集器的线程数,有多少个线程一起进行垃圾回收,官方推荐与cpu数量相同
-XX:PermSize=1024m
设置非堆内存的初始值,持久代内存的大小,一般设置为物理内存的1/4
-XX:MaxPermSize=1024m
最大非堆内存的大小,持久代内存的最大值
-Djava.awt.headless=true
避免在linux环境下,web不能展示图片
-XX:+DisableExplicitGC
禁止调用system.gc()这个方法,误调用了gc方法,会导致整个jvm的响应速度降低
-------------------------------------------------------------------------------------------
堆:存储新创建的对象
非堆:存储编译之后的代码或者是压缩后的类,或者是类的元数据
[root@tomcat1 bin]# ./shutdown.sh
[root@tomcat1 bin]# ./startup.sh
ajp-nio-8009
ajp:tomcat服务器和前端web服务器(APACHE/nginx)进行连接,提供负载均衡和高效的请求转发
连接器当中的一种类型,协议名称就叫ajp
nio:异步非阻塞通信
8009是ajp协议的监听端口
http-nio-8080
用于处理http协议的网络请求
端口:8080