一、tomcat是一个开源的web应用服务器,nginx主要处理静态页面,那么静态请求(连接数据库,动态页面)并不是nginx的强项,动态的请求会交给Tomcat进行处理,tomcat是用java代码写的程序,运行的是java的web应用程序。tomcat的并发处理能力不强,大项目不适应tomcat做为转发动态的中间件,一般是小项目才使用tomcat。
nginx------转发动态请求------Tomcat
php处理的是.php文件
nginx处理的是.html文件
tomcat处理的是.jsp文件
1、Tomcat作用:
处理动态页面(基于http的请求)
处理后端请求(调用数据库服务)
易部署:Tomcat会自动识别配置文件。自动部署运行
Tomcat的缺点:是一个轻量级的服务软件,处理中小架构的网站可以满足需要,大型的交互需求,Tomcat就非长相了
可以替换为Python和node.js、容器化来处理大型架构网站
在容器化部署的项目架构中是不使用Tomcat的,都是jar包直接运行,包括k8s
2、Tomcat的核心组件:
1、web容器:完成web功能,处理的请求也是nginx转发的http(https)请求,处理的是动态页面(基于Java代码编译的页面)
也可以处理后端的请求(转发到数据库的请求)
servlet:cataline是整个Tomcat处理的底层逻辑。处理web请求的动态页面,也处理后端请求(数据库)
jsp:jsp会把动态翻译成serlvet的代码。用编译后的规则,显示代码的静态页面。
静态页面:html
动态页面:php index.php
jsp index.jsp ------由java格式写成的代码,靠jsp翻译,servlet执行编译后的代理,最后在展示结果
容器:容器通常指的是一种虚拟化技术,允许在当前的操作系统中虚拟化的运行多个独立的环境。独立运行的环境就是我们说的容器,彼此之间相互隔离,拥有自己的系统资源。宿主,容器寄生在宿主中,使用的是宿主的资源。
servlet容器:用于开发web应用程序的关键组件
处理http请求,生成动态内容以及与客户端之间的交互、和前端交互 、后端数据库服务器交互、和redis缓存交互
类:Java当中调用各种方法,由开发人员自定义
3、servlet作用:
根据类中的方法处理http请求
生成动态页面内容
会话管理,处理用户对话,跟踪用户在互通请求之间的状态。servlet可以在用户访问不同页面时保持用户的状态信息(购物车同步,用户同步登录)
JSP:java server pages 动态网页的开发技术,使用JSP的标签可以在html的网页当中插入java代码。
<% 开头
%> 结尾
实现一个基于Java web应用程序的访问界面。用户界面。或者访问数据库生成页面内容
4、Tomcat的核心功能:
功能部分由两个块组成:
由接收和响应外部请求的连接器connector和负责处理请求的 container组成
engine:引擎,管理多个虚拟主机,一个service里面只能有一个engine
host:代表站点,也就是虚拟主机,一个engine可以有多个host
context:一个context指向一个web应用
wrapper:最底层,处理和编译代码,运行结果。运行出来的结果在往上层反馈到连接器,最后到用户
service:对外提供外部服务,包含connector和container。
tomcat可以有多个service,每个service之间相互是独立的。
5.Java组件:
JDK:开发工具包,开发Java的应用程序。jdk包括编译器、调试器、等等以及java的类库
是开发者用来创建、编译、运行java程序的重要组件
JVM:java的虚拟机负责编译后的java字节码编程本地的机器码。主要就是运行java的代码
运行完之后jvm提供内存管理、垃圾回收机制、线程管理。
二、tomcat的安装:
1.安装软件包:apache-tomcat-9.0.16.tar.gz jdk-8u201-linux-x64.rpm
2.关闭防火墙及安全机制:systemctl stop firewalld
setenforce 0
3.安装java的依赖环境:rpm -ivh jdk-8u201-linux-x64.rpm
4.设置java的环境变量:vim /etc/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
5.刷新:source /etc/profile.d/java.sh
6.解压tomcat软件包:tar -xf apache-tomcat-9.0.16.tar.gz
7.将解压的apache-tomcat-9.0.16改名为tomcat:mv apache-tomcat-9.0.16 tomcat
8.将改名后的tomcat的路劲移到/usr/local下:mv tomcat/ /usr/local/
9.启动tomcat:
10.查看端口是否也启动:
11.进行访问:
12.如何打开访问网页的Manager APP页面:
13.打开页面
二、tomcat的优化
1.tomcat自身优化:默认配置不适合生产环境,可能频繁出现假死,需要不停的重启;根据生产的实际情况,自行测试。
http默认端口8080
https默认端口443
maxThreads:tomcat使用线程来处理接受请求的个数,也就是tomcat最多可以创建多少个线程,默认是200个,一般设置500-1000个。
minSpsreThreads:tomcat最小空闲线程数,tomcat开启后没人使用的情况下也会有线程待命,默认值是10个,一般设置为20个。
maxSpareThreads:最大空闲线程数,一旦线程总数超过这个值,tomcat就会关闭不再需要的线程,默认就是-1,不限制,一般这个值不会设置。
connectionTimeout=20000:网络连接超时时间,单位为毫秒,设置为0就是永不超时,一般不会设置为0的,平时设置的就是默认20000毫秒。
enableLookups:是否支持反向解析,true禁用,false开启;一般设置为false开启可以提高速度。
disableUplaodTimeout:上传时是否使用超时机制,一般设置为false开启。
connectionUploadTimeout:设置上传的超时时间,默认为10秒,一般设置为20秒。
acceptCount:当所有可以使用处理请求的线程数都被使用时,可以接入请求的最大队列长度,超过了这个数字的请求将被不予处理将会直接丢弃,默认100个。
compression:是否对相应数据进行压缩,on时开启,off关闭,开启压缩之后,可以有效的减少页面的大小,对文本无效,只对图片音频及视频有用,一般可以减少三分之一,默认是off。
compressionMinsize:表示压缩的最小值,只有响应的报文大于这个值才会进行压缩,如果开启了压缩,默认是2048。
noCompressionUserAgents:表示浏览器名称,对于这些浏览器不启用压缩。
compressableMimeType:压缩类型,指定对哪些类型的文件进行压缩。
常用的页面压缩类型:
文本类型:text/plain,text/html,text/css,text/javascript
图像类型:image/jpg,image/jpeg,image/gif
音频类型:audio/ogg,audio/wav,audio/mpeg
视频类型:video/mp4,video/webm,video/rmvb,video/quicktime
应用程序:application/pdf,applicable/json,applicable/xml
2.内核优化:
内核的配置文件:vim/etc/security/limits.conf:打开文件数的限制,系统初始化第一步要做的事情。
vim/etc/sysctl.conf:内核参数文件
以下为内核参数文件的重要的内容:
net.ipv4.ip_forward=0/1:禁用或者开启数据包的转发功能,要做路由器必须要打开,0是关,1是开。
net.ipv4.tcp_max_tw_buckets=2000:允许timewait的最大数量。
net.ipv4.tcp_sack=1:启用有选择的应答,提高tcp的处理性能。
net.core.netdev_max_backlog=262144:网络接收数据包队列的最大的数值。
vm.swappiness=0:关闭内存的交换行为,不适用交换分区,k8s默认就不能使用交换分区,否则会报错。
net.ipv4_max_orphans:系统允许的最大的tcp最大的连接数量。
net.ipv4.ip_local_port_range=1024-65000:设定系统的端口范围。
net.ipv4.tcp_fin_timeout=10:设置tcp关闭连接的超时时间。
net.ipv4.tcp_keepalive_time:设置tcp的keepalive包的发送频率,用于检测连接状态。
3.JVM优化
-Xms2048m:java初始化堆的大小,分配jvm的最小内存,cpu的性能比较高,可以分配高一些。
-Xmx2048m :java堆的最大值,也就是jvm最大内存,取决于物理内存的大小,官方建议设置成xms一样的值,设置成物理内存的一半。
-Xmn768m:新生代内存的大小,官方推荐,设置成jvm内存最大值的3/8,java自带垃圾回收机制,java进行垃圾回收之后不需要重新计算堆区的大小。
堆区:新生代,中生代,老年代。
每生成一个新的对象,对象占用的内存空间就是新生代空间;垃圾回收对堆区当中的资源进行回收之后,新生代没有被回收的资源就转移到中生代;中生代的就会转移到老年代。
整个ivm堆的大小:新生代+老生代+永久代(系统自带的)
-XX:ParallelGcThreads=2 配置并行收集器的线程数,同时有多少个线程一起进行垃圾回收,配置成cpu的一半。
-XX:PermSize=1024m 设置非堆内存的初始值,也就是java中的持久代内存的大小,默认是物理内存的1/4.建议设置成整个ivm内存的一半,在非堆区内存中的不会被垃圾机制回收。
-XX:MaxPermSize=1024m:非堆内存的最大值,和初始值一致即可。
-Djava.awt.headless=true:防止在linux环境的访问下web页面无法打开。
-XX:+DisableExplicitGC" :老年代的收集算法,缩短垃圾回收机制的时间。
PS Eden space 堆内存 创建一个新的对象都在堆内存中万恒。
PS Old Gen 堆内存,长期存活的对象,永生代。
PS Survivor Space 堆内存,PS Eden Space和PS Old Gen之间的存活对象,中生代
Code cache 非堆内存,存储已经编译的代码
Compressed Class space 非堆内存 存储已经压缩过的类定义
Metaspace 非堆内存,存储元数据的区域。
ajp-nio-8009:ajp-nio:连接器的类型,ajp是协议,nio是异步非阻塞的通信方式。
ajp协议:tomcat服务器和web服务器之间进行连接的协议,可以提供负载均衡和高效转发;nio可以提高并发的处理能力;8009就是ajp的默认端口
4.优化tomcat的启动速度:
urandom:非阻塞的版本,不宜俩系统终端,进程忙也不会进入等待状态,所以处理速度相对较快,如果对应用的安全性要求比较高则使用/dev/random