网站做一年了没做301,北京WordPress爱好者,企业网站设计概念,做外贸门户网站目录 一、Tomcat介绍
二、Tomcat核心组件
1、web容器#xff1a;完成web服务器的功能#xff0c;web应用
2、servlet容器#xff1a;名字#xff1a;catalina#xff0c;处理servlet代码
servlet的功能
3、jsp#xff1a;jsp动态页面翻译成servlet代码#xff0c;用…目录 一、Tomcat介绍
二、Tomcat核心组件
1、web容器完成web服务器的功能web应用
2、servlet容器名字catalina处理servlet代码
servlet的功能
3、jspjsp动态页面翻译成servlet代码用标准格式展示Jsp的静态页面
拓展
三、功能组件
四、Tomcat服务部署
编辑
Tomcat启动配置优化 Tomcat优化
内核优化
Tomcat配置JVM参数优化 一、Tomcat介绍 Tomcat 是一个开放源代码的web应用服务器基于java代码开发的。
tomcat 就是处理动态请求和基于java代码的页面开发
可以在html当中写入java代码tomcat可以解析html页面当中的java代码执行动态请求、动态页面。
机制有问题不对tomcat进行优化会出现在假死、停机。小集群小服务小应用使用于tomcat大并发的场景不适合。
1、免费
2、开源可以二次封装
3、可配置性强可以根据需要进行自定义配置包括端口号虚拟主机等等。
4、安全性tomcat自带安全机制可以配置用户认证、授权、加密传输。
5、部署应用非常快捷tomcat会自动部署自动运行。
webapps。 二、Tomcat核心组件
1、web容器完成web服务器的功能web应用
web-----http(s)-------访问页面------文件index.jsp
web容器中封装了一组文件在这一组文件中进行集中化管理。
管理的就是web动态页面
2、servlet容器名字catalina处理servlet代码
就是处理web请求(http)以及生成动态内容的java类
作用就是处理http请求
servlet的功能
1、处理http请求
2、生成动态内容为了和数据交互----用户发起的jsp当中的。
3、会话管理跟踪用户在不同请求之间的状态通过管理可以在用户访问不同页面时保持用户的状态(就是登录b站后就会一直保持登录状态没有退出就会一直保持登录状态)。
session
4、与数据库交互servlet可以连接到数据库执行查询和更新操作。这就是servlet能够生成动态内容的原因(可以从数据库中获得最新生成的数据发送给用户)
3、jspjsp动态页面翻译成servlet代码用标准格式展示Jsp的静态页面
全称java server pages。
是动态页面的开发技术使用jsp标签(index.jsp)支持在html页面中插入java代码。
jsp容器-----将html页面当中的java代码翻译-----执行-----展示结果
通常以 % 为开头以 % 为结尾。 大致的工作流程
(1)用户发送http请求
(2)servlet处理请求
(3)到web容器中去找请求的内容
(4)jsp容器翻译.jsp文件中的代码静态页面展示给用户
(5)发回给servlet
(6)最后到用户 拓展
面向对象是一种编程的范式或者思想 把客观存在的实体和他们之间的关系映射到计算机程序当中。
计算机程序会被组织成一组相互作用的对象每一个对象都有数据(属性)和行为(方法) 类和对象
类定义一组属性和方法。是用来创建对象(实例)的
封装对象的属性和方法捆绑在一块提供一个接口可以让其他对象使用
继承一个类可以继承另一个类父类和子类子类可以重用父类的代码而且还在不修改的情况下进行扩展。
多态不同类的对象对相同的消息可以做出不同的响应。 三、功能组件
Server是最顶级的组件代表Tomcat的运行实例在一个JVM中只包含一个在Server的整个生命周期中不同阶段会有不同
Service是服务的抽象它代表请求从接收到处理的所有组件的集合。设计上Server可以包含多个Service组件每个Service组件都包含若干用于接收客户端消息的Connector组件和用于处理请求的Engine组件。
connector负责对外接收和响应请求是tomcat与外界的交通枢纽。监听端口也可以接收外界请求交给container处理。
container负责对内处理业务逻辑。
Engine引擎管理虚拟机 (service一个service里面可以包含多个虚拟主机。)可以管理多个虚拟主机但是每个service只能有一个Engine
Host代表一个虚拟机也可以叫站点
Contextweb应用可以包含多个servlet
wrapper封装器最底层每一个wrapper都封装一个servlet。负责对象实例的创建、执行以及销毁。
Engine、Host、Context、wrapper这四个组件是父子关系工作方式也是从上到下的。
工作流程 1、输入网址请求发送请求发送到8080端口被监听的connector获得
2、connector会把请求转发到container功能组件中的Engine(管理虚拟主机,你要访问哪一个虚拟主机)组件中处理并等待来自Engine的回应并返回给客户。Engine从Connector那里获得该对应的请求localhost:8080/test/index.jsp,并进行匹配该对应的虚拟主机Host(主机站点包含要请求页面的位置webapps)
3、匹配到名为localhost的Host(主机站点包含要请求页面的位置webapps)后。
4.localhost Host获得请求/test/index.jsp并匹配其所拥有的context就是index.jsp里面的内容-------wrapper(servlet响应解析处理这些请求)-----jsp翻译官-------页面展示
5、匹配到路径为/test的Context并获得请求/test/index.jsp并在其mapping table中寻找对应的ServletContext匹配到URL PATTERN后缀名为.jsp的Servlet对应于JSPServlet类。
6、构造HttpServletRequest对象和HttpServletResponse对象作为参数调用JspServlet的doGet或doPost方法。
7、Context将执行完毕之后的HttpServletResponse对象返回给Host
8、Host将HttpServletResponse对象返回给Engine
9、Engine将HttpServletResponse对象返回给Connector
10、Connector将HttpServletResponse对象返回给客户浏览器
总结用户发起请求到连接器通过8080转发到container再到引擎engine再到Host,再到context再到servlet也就是wrapper把.jsp文件的内容解析出来再反过来一层一层发回。 四、Tomcat服务部署
在部署 Tomcat 之前必须安装好 jdk因为 jdk 是 Tomcat 运行的必要环境。
1.关闭防火墙将安装 Tomcat 所需软件包传到/opt目录下
jdk-8u201-linux-x64.rpm
apache-tomcat-9.0.16.tar.gzsystemctl stop firewalld
systemctl disable firewalld
setenforce 02.安装JDK
cd /opt
rpm -ivh jdk-8u201-linux-x64.rpm
java -version3.设置JDK环境变量
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:$PATHexport JAVA_HOME/usr/java/jdk1.8.0_201-amd64:
这个命令设置了一个名为JAVA_HOME的环境变量它指向Java JDK的安装路径。
这对于告诉系统和其他应用程序Java的安装位置非常重要。你需要将路径替换为你实际安装Java的路径。export CLASSPATH.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:
这个命令设置了一个名为CLASSPATH的环境变量它用于指定Java类的搜索路径。
在这个命令中.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar 表示当前目录.
以及Java工具库tools.jar和Java远程调试库dt.jar的路径。这些库通常包含一些Java开发所需的类。export PATH$JAVA_HOME/bin:$PATH:
这个命令将Java可执行文件的路径添加到系统的PATH环境变量中。
这使得你可以在终端中直接运行Java工具而不需要输入完整的路径。
这将Java的bin目录添加到了PATH中使得java、javac等命令可以直接运行。source /etc/profile.d/java.sh
java -version----------------------------------------------------------------------------------------------------------
CLASSPATH编译、运行Java程序时JRE会去该变量指定的路径中搜索所需的类.class文件。
dt.jar是关于运行环境的类库主要是可视化的 swing 的包。
tools.jar主要是一些jdk工具的类库包括javac、java、javapjdk自带的一个反编译工具、javadoc等。
JDK (Java Development Kit)JDK是Java开发工具包它是用于开发Java应用程序的软件包。
JDK包括了编译器javac、调试器、各种工具、Java标准类库Java API、以及Java文档等。
JDK是开发者用来创建、编译和运行Java应用程序的重要组件。JRE (Java Runtime Environment)JRE是Java运行时环境它是用于执行Java应用程序的部分。
JRE包括了Java虚拟机JVM以及Java类库Java API这使得用户能够在计算机上运行已编译的Java程序
而不需要进行开发。JRE是终端用户需要安装的部分以便能够运行Java应用程序。JVM (Java Virtual Machine)JVM是Java虚拟机它是Java应用程序在计算机上运行的核心组件。
JVM负责将编译后的Java字节码.class文件解释或编译成本地机器码以便计算机能够执行它。
JVM提供了内存管理、垃圾回收、线程管理等功能以确保Java程序在不同平台上具有相似的行为。
----------------------------------------------------------------------------------------------------------首先使用文本工具编写java源代码比如 Hello.java
在命令行中输入命令javac Hello.java对源代码进行编译生成 class 字节码文件
编译完成后如果没有报错信息输入命令java Hello运行 class 字节码文件由 JVM 对字节码进行解释和运行
打印 “Hello World”。vim Hello.javapublic class Hello { public static void main(String[] args){System.out.println(Hello world!);}
}javac Hello.java
java Hellopublic: 这是一个访问修饰符表示类是公共的可以从其他地方访问。
class: 关键字用于定义一个类。
Hello: 这是类的名称这里是一个叫做 Hello 的类。public static void main(String[] args){
public: 访问修饰符表示这个方法是公共的可以从其他地方访问。
static: 静态修饰符表示这个方法属于类而不是实例可以通过类名直接调用。
void: 这是方法的返回类型void 表示方法没有返回值。
main: 这是方法的名称是程序的入口点当程序运行时会从这里开始执行。
(String[] args): 这是方法的参数列表args 是一个字符串数组可以在命令行传递参数给程序。System.out.println(Hello world!);
System.out: System 是一个类out 是这个类的一个静态成员它代表标准输出流。
println: 这是输出方法的名称它会在控制台输出一行内容。
Hello world!: 这是要输出的内容是一个字符串。4.安装启动Tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
##启动tomcat ##
#后台启动
/usr/local/tomcat/bin/startup.sh
或
/usr/local/tomcat/bin/catalina.sh start#前台启动
/usr/local/tomcat/bin/catalina.sh run netstat -natp | grep 8080浏览器访问Tomcat的默认主页 http://192.168.233.21:80805.优化tomcat启动速度
第一次启动tomcat可能会发现 Tomcat 启动很慢默认情况下可能会需要几十秒可以修改jdk参数进行改。
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
--117行--修改
securerandom.sourcefile:/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 ll /usr/local/tomcat/
------主要目录说明----------------------------------------------------------------------------------------------
●bin:存放启动和关闭Tomcat的脚本文件比较常用的是 catalina.sh、startup.sh、shutdown.sh三个文件
●conf存放Tomcat 服务器的各种配置文件比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。
① server.xml: Tomcat的主配置文件包含ServiceConnectorEngineRealmValve,Hosts主组件的相关配置信息;
② context.xml:所有host的默认配置信息;
③ tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息Tomcat自带的manager默认情况下会用到此文件在Tomcat中添加/删除用户为用户指|定角色等将通过编辑此文件实现;
④ web.xml:遵循Servlet规范标准的配置文件用于配置servlet并为所有的web应用程序提供包括MIME映射等默认配置信息;
●lib存放Tomcat运行需要的库文件的jar 包一般不作任何改动除非连接第三方服务比如 redis那就需要添加相对应的jar 包
●logs存放 Tomcat 执行时的日志
●temp存放 Tomcat 运行时产生的文件
●webapps存放 Tomcat 默认的 Web 应用部署目录
●workTomcat工作日录存放jsp编译后产生的class文件一般清除Tomcat缓存的时候会使用到
●src:存放Tomcat 的源代码
●doc:存放Tomcat文档
----------------------------------------------------------------------------------------------------------
查看manager文件
cd /usr/local/tomcat/webapps/manager/META-INF
vim context.xmlContext antiResourceLockingfalse privilegedtrue Valve classNameorg.apache.catalina.valves.RemoteAddrValveallow.* / #允许所有主机访问。在conf,tomcat-users.xml中添加账户密码
role rolenamemanager-gui/
user usernametomcat passwordtomcat rolesmanager-gui/
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 namewww.kgc.com appBasewebapps unpackWARstrue autoDeploytrue xmlValidationfalse xmlNamespaceAwarefalseContext docBase/usr/local/tomcat/webapps/kgc path reloadabletrue /
/Host Host namewww.benet.com appBasewebapps unpackWARstrue autoDeploytrue xmlValidationfalse xmlNamespaceAwarefalseContext docBase/usr/local/tomcat/webapps/benet path reloadabletrue /
/Host----------------------------------------------------------------------------------------------------------
Host name主机名
appBaseTomcat程序工作目录即存放web应用程序的目录相对路径为webapps绝对路径为 /usr/local/tomcat/webapps
unpackWARs在启用此webapps时是否对WAR格式的归档文件先进行展开默认为true
autoDeploy在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy默认为true
xmlValidation是否验证xml文件执行有效性检验的标志
xmlNamespaceAware是否启用xml命名空间设置该值与xmlValidation为true表示对web.xml文件执行有效性检验docBase相应的Web应用程序的存放位置也可以使用相对路径起始路径为此Context所属Host中appBase定义的路径
path相对于Web服务器根路径而言的URI如果为空“”则表示为此webapp的根路径 /
reloadable是否允许重新加载此context相关的Web应用程序的类默认为false
----------------------------------------------------------------------------------------------------------/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh3.客户端浏览器访问验证
echo 192.168.233.71 www.kgc.com www.benet.com /etc/hosts浏览器访问 http://www.kgc.com:8080/ 页面显示This is kgc page\!
浏览器访问 http://www.benet.com:8080/ 页面显示This is benet page\!----------------------------------------------------------------------------------------------------------
HTTP 请求过程
1Connector 连接器监听的端口是 8080。由于请求的端口和监听的端口一致连接器接受了该请求。
2因为引擎的默认虚拟主机是 www.kgc.com并且虚拟主机的目录是webapps。
所以请求找到了 tomcat/webapps 目录。
3访问的路径为根路径URI 为空即空是 Web 程序的应用名也就是 context。
此时请求找到 /usr/local/tomcat/webapps/kgc 目录解析 index.jsp 并返回。
----------------------------------------------------------------------------------------------------------Tomcat优化
Tomcat 配置文件参数优化
vim /usr/local/tomcat/conf/server.xml
......
Connector port8080 protocolHTTP/1.1
connectionTimeout20000
redirectPort8443
--71行--插入
minSpareThreads50
enableLookupsfalse
disableUploadTimeouttrue
acceptCount300
maxThreads500
processorCache500
URIEncodingUTF-8
compressionon
compressionMinSize2048
compressableMimeTypetext/html,text/xml,text/javascript,text/css,text/plain,image/gif,image /jpg,image/png/ Tomcat的Connector的配置信息minSpareThreads: 空闲线程的最小数量不运行线程时默认都会有此值设置的线程数。用于处理请求。开启tomcat时会有多少线程默认是10。enableLookups: 是否启用DNS反向解析。当设置为false时请求将不会被解析为主机名。disableUploadTimeout: 是否禁用上传超时即设置连接不会在上传期间超时。acceptCount: 当所有线程都在忙碌时可以排队等待处理的请求数量。maxThreads: Tomcat可以创建的最大线程数。processorCache: 连接器可以缓存的最大处理器数。URIEncoding: URI的字符编码。compression: 是否启用响应内容压缩。compressionMinSize: 响应内容压缩的最小大小。超过此值才可以进行压缩。compressableMimeType: 可以被压缩的MIME类型列表。
浏览器和其他互联网应用程序之间处理文件的协议和需要处理的Mime文档的性质和格式。
文本text/html,text/plain
图像image/jpg image/gif
音频audio/wav aduio/mp3
视频video/mp4 video/avi
应用程序application/pdf application/json. Tomcat启动配置优化
启动速度优化
第一次启动tomcat会发现启动速度很慢10几秒-1分钟
jdk的参数vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
117行修改
securerandom.sourcefile:/dev/urandom Tomcat内核优化
永久配置注意设置保存后需要重新ssh连接才会看到配置更改的变化
vim /etc/security/limits.conf
# 65535 为Linux系统最大打开文件数
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535 最大进程数软限制为 65535即可以使用 ulimit -u 命令查看和修改的值。 * hard nproc 65535 最大进程数硬限制为 65535即最大可分配的进程数。 * soft nofile 65535最大打开文件数软限制为 65535即可以使用 ulimit -n 命令查看和修改的值。 * hard nofile 65535最大打开文件数硬限制为 65535即最大可分配的文件数。 这里使用的通配符 * 表示对所有用户生效。 Tomcat配置JVM参数优化
JAVA_OPTS$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads2 -xx:PermSize1024m -XX:MaxPermSize1024m -Djava.awt.headlesstrue -XX:DisableExplicitGC
-server第一个参数指定内存池一定要放在第一个
-Xms2048m初始java堆的大小也就是分配JVM的最小内存。看cpu的性能高这个值可以设置高一点。
-Xmx2048mJAVA堆最大能多大JVM的最大内存和硬件内存挂钩。根据官方文档起始值和最大值要保持一致。Xms和Xmx设为一样的内存可以设为物理内存的一半
-Xmn768m新生代的内存大小官方推荐为了整个堆大小的3/8(八分之三)
-XX:ParallalGCThreads2配置并行收集器的线程数同时可以有多少个线程进行垃圾回收
-xx:PermSize设置持久内存的大小默认设置是物理内存的1/4(四分之一)
-xx:MaxPermSize1024m最大的非堆内存的大小默认也是物理内存的1/4
-xx:PermSize1024m -XX:MaxPermSize1024m
非堆内存是不会被垃圾回收机制处理的-XX:PermSize持久代内存与最大非堆内存不能超出操作系统可用的内存。设置成一样大可用减轻伸缩堆大小的压力。
-Djava.awt.headlesstrue避免在Linux环境下web不能正常打开以正常显示图片。
-XX:DisableExplicitGC避免JVM空间大起大落影响系统的响应时间。大起大落会导致响应速度会很慢。
-Xss: 设置线程栈的大小。例如-Xss256k表示设置线程栈的大小为256KB。 JVM优化
vim /usr/local/tomcat/bin/catalina.sh#在119行中插入以下内容
JAVA_OPTS$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads2 -xx:PermSize1024m -XX:MaxPermSize1024m -Djava.awt.headlesstrue -XX:DisableExplicitGC./shutdown.sh./startup.sh
JVM就是java的虚拟机是java应用程序再计算机上运行的核心组件jvm负责将编译后的java字节码(.class文件)解释或则和编译成本地的机器码计算机能够执行它。JVM还提供了内存管理垃圾回收线程管理。确保java的程序在不同平台可以有一致性的功能。 堆就是用来工作的非堆就是存储缓存的(存储垃圾的) 内存不够会炸。所以要优化
catalina.sh 就是servlet代码以及容器的配置。
PS Eden Space堆内存存储新创建的对象
PS Old Gen堆内存存储长时间存活的对象
PS Survivor Space堆内存存储创建之后生命周期较短的对象
Code Cache非堆内存存储已经编译的代码
Compressed Class Space非堆内存存储已经压缩的类
Metaspace非堆内存存储类的元数据 堆区当中会进一步细分新生代 中生代 老年代
每一个新创建的对象占用的空间就是新生代
java垃圾回收机制会对堆区进行资源回收。资源回收之后新生代中没有被回收的资源就是中生代。
中生代没有被回收就是老年代。
JVM大小新生代中生代老年代永久代 ajp-nio-8009
ajp-nio连接器的类型 ajp使用ajp协议。nio进行异步非阻塞。
8009连接器正在监听的端口号。是connector中的一种
ajp将tomcat服务器与前端web服务器进行连接。提供负载均衡和高效的请求转发
tomcat8009是用来和nginx通信的 “http-nio-8080”
处理http请求和客户端通信的端口。