Tomcat
|-----------------------------------------------------------------------------------------|
| 他是一个开源的web应用服务器,区别nginx,nginx主要处理静态页面,而动态请求(连接数据库,页面动态),并不是nginx处理的长处,动态请求会交给tomcat进行处理 |
| 通过nginx ----- 转发动态请求 -----tomcat |
Tomcat 的功能
|------------------|-----------------------------------------------------------------------------------------------------------------------|
| 1 (实际工作中主要使用的功能) | 处理动态页面 |
| 2 (实际工作中主要使用的功能) | 处理后端请求(调用数据库服务器) |
| 3 | 易部署,tomcat会自动识别配置文件,自动部署运行 |
| 4 | 轻量级的服务软件,一般来处理中小架构的网站可以满足,大型的交互需求就不是tomcat的长处了,有些公司会使用python,node.js,容器化来处理,在容器化部署的项目架构中是不使用tomcat的,都是用jar包直接运行,包括k8s |
Tomcat的核心组件
|---------|------------------------------------------------------------------------------------------|
| web容器 | 主要是完成web功能,处理请求也是nginx转发的http(https也有)请求,处理的是一个动态的页面(它是基于java代理编译的页面),处理后端的请求(转发到数据库的请求) |
| servlet | catalina是整个tomcat处理的底层逻辑,既处理web请求的动页面,也处理后端请求(数据库) |
| jsp | jsp会把动态翻译成servlet的代码,用编译后的规则,显示代码的静态页面 |
静态页面
html
动态页面
1.php inex.php
2.Jsp index.jsp ----java 格式写成的代码,靠jsp翻译,servlet执行编译的代码,最后展示结果
Servlet jsp 解释
容器是什么
|----|----------------------------------------------------------------------------------------------------------------|
| 容器 | 容器通常指的是一种虚拟化的技术,运行在当前的操作系统中虚拟化的运行多个独立的环境,独立运行的环境就是我们说的容器,彼此之间相互隔离,拥有自己的一套系统资源,宿主,容器寄生在宿主身上,实际使用的就是宿主的资源,docker |
Servlet容器
|-----------|---------------------------------------------------------------------------|
| servlet容器 | 用于开发web应用程序的关键组件,处理http请求,生产动态内容以及客户端之间的交互,前端交互,后端数据库服务器交互,和redis缓存交互 |
| 1 | 处理http请求 |
| 2 | 生成动态页面内容 |
| 3 | 会话管理,可以处理用户会话,跟踪用户在不同请求之间的状态,servlet可以在用户访问不同页面时,保持用户的状态信息,购物车同步,用户同步登录等等 |
类:java当中,用来调用各种方法,由开发人员自定义的
Jsp
|-------------------|------------------------------------------------|
| java server pages | 动态页面的开发技术,使用jsp的标签可以在HTML(html)的网页当中可以插入java代码 |
| 格式 | <%:开头 %>:结尾 |
| jsp | 可以实现java应用程序的访问界面(用户界面),或者访问数据库,生成页面内容 |
Tomcat的核心功能
功能部分由两个块组成
|----|------------------------|
| 1. | 接收和响应外部请求的连接器connector |
| 2. | 负责处理请求的container |
四个工作组件
|----------|--------------------------------|
| engine引擎 | 管理多个虚拟主机,一个tomcat里面只能有一个engine |
| host | 代表站点,也就是虚拟机,一个engine可以有多个host |
| context | 一个context执行一个web应用 |
| wrapper | 最底层,处理和变异代码,然后运行结果,最后层层返回上级到用户 |
JDK:开发工具包,开发java的应用程序,jdk包括:编译器,调试器,等等以及java的类库
开发者用来创建,编译运行java程序的重要组件
Jvm:java的虚拟机,主要负责编译后的java字节码,变成本地的机器码,运行java的代码
Jvm:内存管理,垃圾回收机制,线程管理,
Tomcat文件作用
|------------|----------------------------------------------|
| bin | 存放启动或关闭tomcat的脚本文件,如startup.sh , shutdown.sh |
| server.Xml | tomcat的主配置文件 |
| logs | catalina.out tomcat的日志文件 |
| webapps | tomcat默认的web应用的部署目录 |
| work | tomcat的工作目录,存放jsp里面代码编译之后产生的class文件,清缓存会用到 |
bash
1.systemctl stop firewalld
2.setenforce 0
#关防火墙
3.cd /opt
4.rpm -ivh jdk-8u201-linux-x64.rpm
#安装
5.java -version
6.tar -xf apache-tomcat-9.0.16 /usr/local/tomcat
#解压到 /usr/local/tomcat
7.vim /etc/profile.d/java.sh
export JAVA HOME=/usr/java/jdk1.8.0 201-amd64
#设置java home的环境变量,指向Jdk,也就是java的工作目录
export CLASSPATH=.:$JAVA HOME/ b/tools.jar:$JAVA HOME/Lib/dt.jar
#java类的搜索路径
export PATH=$JAVA HOME/bin:$PATH
#把java的可执行命令添加到系统的环境变量当中。
8.cd /usr/local/tomcat/conf
9.cd /usr/local/tomcat/bin
10.netstat -antp | grep 8080
#端口没起
11../startup.sh
#启动
启动成功
Tomcat配置虚拟主机
- 配置工作目录
- 在公司当中会运行多个项目,一台部署tomcat太多会浪费资源,所以会在tomcat中配置多个主机,通过不同域名访问不同的内容
- 请求连接到连接器,连接的端口是8080,连接器接受请求
- www,kgc,com 引擎管理虚拟机----host----www,kgc,com------context---访问www,kgc,com该主机的工作目录----webapps/kgc--------index.jsp-----wrapper-----servletl来解析index.jsp内容
- 响应的内容返回到客户端
bash
1.cd /usr/local/tomcat/webapps
2.mkdir kgc benet
3.vim usr/local/tomcat/webapps/kgc或benet/index.jsp
#分别进入kgc与benet目录编辑文件输入内容保存
4.echo "192.168.233.xx www.kgc.com www.benet.com"
#配置本地域名映射
5.cd /usr/local/tomcat/bin
6../shutdown.sh
7../startup.sh
#到虚拟机里打开浏览器输入:www.kgc或benet.com:8080
重点
Tomcat的优化
Tomcat不是很好用,默认配置并不适合生产环境,以默认环境运行会频繁出现假死。
需要通过压力测试不断优化,提高稳定。
优化有三个方面
- 配置文件优化
- Jvm优化
- 操作系统优化(内核优化)
Tomcat配置文件优化
-
- maxThreads="200" ,
tomcat 使用线程来处理接收的每个请求,可以创建的最大线程数,支持最大的并发连接数 200
minSpareThreads
#最小空闲线程数,tomcat启动时的初始化线程数,表示没人请求,也要打开这些空的线程等待请求10
maxSpareThreads
最大备用线程数,创建线程超过这个值,tomcat会关闭不再需要的线程,默认是-1(不做限制)
connnectiontimeout
#网络连接超时,一般设置为20000毫秒
enableLookups="fals"
#是否反查反向解析域名,一般不做解析,所以写成fals,提高效率
disableUploadTimeout="true"
#上传文件时,是否启用超时限制
connectionUploadTimeout="15000"
#上传比下载要耗时,根据需求自定义
accpetCount="100"
#所以得可以使用的线程都被占用,可以传入的队列长度的最大值,默认是100个等待数
compression="on" 或"off" 或"force" (所有的情况都进行压缩),
#是否对响应的数据进行gzip压缩,on压缩之后的页面大小可以减少1/3,
noCompressionUserAgents="gozilla chrom"
#对指定访问的浏览器,不进行压缩
jvm优化
Xmn768m:新生代内存的大小,光放推荐整个堆大小的3/8
新生代:java中每新建一个新的对象,占用的内存就是新生代
中生代:对象创建完毕之后,占用的内存就是中生代
老年代:java垃圾回收机制进行资源回收之后,中生代中剩余的部分,就是老年代
-XX:parallelGCThreads=2
#配置并行收集器的线程数,有多少个线程一起进行垃圾回收,官方推荐,与cpu数量相同
-XX:PermSize=1024m
#设置非堆内存的初始值,持久代内存的大小,一般设置为物理内存的1/4
-XX:MaxPermSize=1024m
#最大非非内存的大小,持久代内存的最大值,一般设置为物理内存的1/4
堆:存储新创建的对象
非堆:存储编译之后的代码,或者是压缩后的类,或者是类(调用的方法)的元数据
ajp-nio-8009
连接器当中的一种类型:ajp:协议名称就叫ajp.nio:一步非阻塞通信 8009是ajp协议的监听端口
Ajp:tomcat服务器和前端web服务器(apache nginx)进行连接,提供一个负载均衡,和请求转发,而且是高效的请求转发,提高并发的处理能力
http-nio-8080
用于处理http协议的网络请求端口号为8080