Tomcat概述
Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件基金会的 Jakarta 项目中的一个
核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP
程序的首选。一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能
力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端执行动态请求和动态页面
特点:1.开源(可二次封装),免费,轻量级,
2.基于Java代码开发执行的,可配置性较强(根据需要进行自定义配置,端口号,虚拟主机等)
3.适用于小集群小服务小应用,不适用于大并发
4.安全性:本身自带安全机制,可以配置用户认证,授权,加密传输
5.部署应用快捷:tomcat会自动部署,自动运行(webapps)
web容器:完成web服务器的功能,即web应用
web--------->http(s)------------>访问页面---------->文件index.jsp
特点:在web容器里封装了一组的文件进行集中化管理,管理web的动态页面
servlet容器:处理servlet代码
1.就是来处理web请求(http)
2.生成动态内容的java类(主要是为了和数据库进行交互 )
3.会话管理:跟踪用户在不同请求之间的状态,通过管理可以在用户访问不同页面时保持用户的状态
4.与数据库进行交互,执行查询和更新操作
JSP:将动态页面翻译为servlet的代码,用标准格式,展示jsp的静态页面
java server pages 动态页面的开发技术,使用jsp标签index.jsp 在html页面当中插入java代码
jsp容器----->html页面当中的java代码翻译----->执行展示结果
功能组件:
connector:负责对外接收和响应请求,是tomcat与外界的交通枢纽,监听端口,也可以接收外界的请求,交给contaiker处理
container:负责对内处理业务逻辑
Engine:引擎,管理虚拟机一个service可以管理多个虚拟机(即一个service可以包含多个虚拟机),一个server里面只能有一个engine
Host:代表一个虚拟机,也可以叫做站点
Context:web应用,包含多个servlet
wrapper:封装器,最底层,每一个wrapper都封装一个servlet,负责对象实例的创建,执行,销毁
父子关系,工作方式为从上到下
Container 结构分析
tomcat请求过程
1、用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得;
2、Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;
3、请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等。
4、执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端。
Tomcat 服务部署
1.关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下
jdk-8u201-linux-x64.rpm
apache-tomcat-9.0.16.tar.gz
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.安装JDK
cd /opt
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 JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
suorce /etc/profile.d/java.sh
java -version
小知识
CLASSPATH:编译、运行Java程序时,JRE会去该变量指定的路径中搜索所需的类(.class)文件。
dt.jar:是关于运行环境的类库,主要是可视化的 swing 的包。
tools.jar:主要是一些jdk工具的类库,包括javac、java、javap(jdk自带的一个反编译工具)、javadoc等。
JDK :java development kit (java开发工具)
JRE :java runtime environment (java运行时环境)
JVM :java virtuak machine (java虚拟机),使java程序可以在多种平台上运行class文件。
4.测试jdk是否安装成功
vim编写java源代码,比如 Hello.java ;
在命令行中,输入命令:javac Hello.java,对源代码进行编译,生成 class 字节码文件;
编译完成后,如果没有报错信息,输入命令:java Hello,运行 class 字节码文件,由 JVM 对字节码进行解释和运行,打印 “Hello World”。
#类名、接口名命令:英文大小写字母、数字字符、$和_,不能使用关键字和数字开头;
一个单词命名时第一个单词的首字母要大写;多单词组成时,所有单词的首字母大写:XxxYyyZzz(驼峰命名法)
编写测试
vim Hello.java
public class Hello {
public static void main(String[] args){
System.out.println("Hello world!");
}
}
javac Hello.java
java Hello
5.安装启动Tomcat
cd /opt
tar zcxf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
##启动tomcat ##
#后台启动
/usr/lcoal/tomcat/bin/startup.sh
或
/usr/lcoal/tomcat/bin/catalina.sh strat
#前台启动
/usr/local/tomcat/bin/catalina.sh run
netatst -natp | gerp 8080
浏览器访问Tomcat的默认主页 http://IP地址:8080
优化tomcat启动速度
第一次启动tomcat可能会发现 Tomcat 启动很慢,默认情况下可能会需要几十秒,可以修改jdk参数进行改。
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
--117行--修改
securerandom.source=file:/dev/urandom
/dev/urandom是/dev/random的非阻塞版本,/dev/random的 random pool 依赖于系统中断,因此在系统的中断数不足时,/dev/random 设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用,/dev/random设备可以保证数据的随机性。 /dev/urandom不依赖系统的中断,也就不会造成进程忙等待,但是数据的随机性也不高,所以该随机数的安全性理论上不高。如果应用对安全性要求很高,那么应该使用/dev/random。
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
JVM优化(面试重点!!!)
JVM:java虚拟机,是java应用程序在计算机上运行的核心组件,JVM负责将编译后的java字节码解释或者编译
catelina:容器的配置
PS Eden Space :堆内存,存储新创建的对象
PS Old Gen :堆内存,存储长时间存活的的对象
PS Survivor Space:堆内存,存储创建之后,生命周期较短的对象
Code Cache:非堆内存,存储已经编译的代码
Compressed Class Space:非堆内存,存储已经压缩的类
Metaspace:非堆内存,存储类的元数据
-server:第一个参数值,必须放在第一个,指定内存池
-Xms 2048m:初始java堆的大小,即分配JVM的最小内存,主要是看CPU来进行分配
-Xmx 2048m:JAVA堆最大是多大,也是jvm的最大内存,和硬件内存挂钩,根据官方文档,起始值和最大值保持一致
内存可以设为物理内存的一半
-Xmn 768m:新生代的内存大小,官方推荐为整个堆大小的八分之三
-XX:ParallelGCThreads=2:配置并行收集器的线程数,同时可以有多少个线程进行垃圾回收
-XX:PermSize:设置持久内存的大小,默认为物理内存的四分之一
-XX:MaxPermSize=1024m:最大的非堆内存的大小,默认也是物理内存的四分之一设置成一样大,可以减轻伸缩堆大小的压力
-Djava.awt.headless=true:避免在linux环境下。web不能正常打开以正常显示图片
-XX:+DisableExplicitGC:避免jvm空间大起大落,影响系统的响应时间。响应速度会很慢
堆区当中:新生代 中生代 老年代
每一个新建的对象占用的空间,就是新生代
java垃圾回收机制对堆区进行资源回收,新生代中没有被回收的资源就是中生代
中生代没有被回收,就是老年代
JVM的大小:新生代大小+中生代大小+老年代大小
Tomcat 部署虚拟主机
一台服务器上在一个tomcat中部署多个虚拟机服务器,减少系统的资源消耗, 就需要使用到 Tomcat 虚拟主机。
例如现在新增两个域名 www.kgc.com 和 www.benet.com, 希望通过这两个域名访问到不同的项目内容
1.创建 kgc 和 benet 项目目录和文件
mkdir /usr/local/tomcat/webapps/kgc
mkdir /usr/local/tomcat/webapps/benet
echo "This is kgc page\!" > /usr/local/tomcat/webapps/kgc/index.jsp
echo "This is benet page\!" > /usr/local/tomcat/webapps/benet/index.jsp2.修改 Tomcat 主配置文件 server.xml
vim /usr/local/tomcat/conf/server.xml
--165行前--插入
<Host name="www.kgc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/kgc" 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>
Tomcat 优化(面试!!!)
1.优化tomcat启动速度
2.常用的优化相关参数
server.xml 针对主配置文件的优化
redirectPort:如果某连接支持的协议的是http,当接收客户端发来的请求https,就会启用此端口 8843
maxthreads:Tomcat使用线程处理请求,可以创建的最大线程数,也就是并发连接数,默认是200
minsparethreads:最小空闲线程数开启TOMCAT时会有多少线程
maxSparethreads:最大备用线程,一旦创建的线程超过这个值,tomcat会关闭不再需要的端口线程,默认为-1,也即是不限制,一般不进行指定
URIEncoding:URL的格式编码,默认为utf-8 需要分别进行指定,所以一般也不东
connectionTimeout:网络连接超市,单位毫秒。为0时永不超时,一般为20000毫秒
enablelookups:是否反向解析域名(IP-域名),主要目的为了能够获取远程主机的主机名,一般设置为false,直接返回IP地址,提高处理能力
disableUploadTimeout:上传超时时间,设置为true;
connectionUploadTimeout:因人而异,一分钟或者30S
acceptCount:所有可以使用的线程如果都被占用,可以传入连接请求的最大队列长度(默认100,超出范围直接丢弃不处理)
compression:是否开启页面和响应数据的压缩。off关 on开 force(所有的情况下都进行压缩;默认为off 建议on)
compressionMinsize : 压缩响应的最小值,等于或者小于不压缩
compressableMimeType:可以被压缩的MIME的类型
优化配置
vim /usr/local/tomcat/conf/server.xml
......
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
--71行--插入
minSpareThreads="50"
enableLookups="false"
disableUploadTimeout="true"
acceptCount="300"
maxThreads="500"
processorCache="500"
URIEncoding="UTF-8"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image /jpg,image/png"/>