一.Tomcat
1.1Tomcat介绍
Tomcat是Java语言开发的,Tomcat服务器是一个免费的开放源代码的Web应用服务器,是Apache软件基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其他一些公司及个人共同开发而成。
- 可以作为Web应用服务器,处理静态的Web页面,如html页面,但是性能一般
- 还可以作为`servlet/jsp``容器,处理JAVA语言开发的Jsp动态页面程序,这也是tomcat的主要应用程序
Tomcat由一系列的组件构成,其中核心组件有三个:
(1)Web容器:完成Web服务器的功能;
(2)Serviet容器:名字为catalina
,用于处理Serviet代码;
(3)JSP容器:用于讲JSP动态网页翻译成Serviet代码;
Tomcat 功能组件结构:
Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。 其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service。
- Connector:负责对外接收和响应请求。它是Tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界。
- Container:负责对内处理业务逻辑。其内部由 Engine、Host、Context和Wrapper 四个容器组成,用于管理和调用 Servlet 相关逻辑。
- Service:对外提供的 Web 服务。主要包含 Connector 和 Container 两个核心组件,以及其他功能组件。Tomcat 可以管理多个 Service,且各 Service 之间相互独立。
Container 结构分析:
每个 Service 会包含一个 Container 容器。在 Container 内部包含了 4 个子容器:
4个子容器的作用分别是:
(1)Engine:引擎,用来管理多个虚拟主机,一个 Service 最多只能有一个 Engine;
(2)Host:代表一个虚拟主机,也可以叫站点,通过配置 Host 就可以添加站点;
(3)Context:代表一个 Web 应用,包含多个 Servlet 封装器;
(4)Wrapper:封装器,容器的最底层。每一 Wrapper 封装着一个 Servlet,负责对象实例的创建、执行和销毁功能。
Engine、Host、Context 和 Wrapper,这四个容器之间属于父子关系。
Tomcat 请求过程:
1、用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得;
2、Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;
3、请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等。
4、执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端。
1.2Tomcat服务部署
在部署 Tomcat 之前必须安装好 jdk,因为 jdk 是 Tomcat 运行的必要环境。
1.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.安装JDK
cd /opt
拉入软件包
java -version
3.使用rpm -ivh 来进行解压包
rpm -ivh jdk-8u201-linux-x64.rpm
#安装好的话,可以使用以下命令进行解压升级安装
查看jave 的解压文件放在哪个目录里
rpm -qpl jdk-8u201-linux-x64.rpm
#可以查看到Java 的配置文件在哪个目录里
设置JDK环境变量
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
source /etc/profile.d/java.sh #重新加载一下配置
echo $PATH #查看环境变量有没有设置成功
java -version #查看版本
- JDK :java development kit (java开发工具)
- JRE :java runtime environment (java运行时环境)
- JVM :java virtuak machine (java虚拟机),使java程序可以在多种平台上运行class文件。
- CLASSPATH:告诉jvm要使用或执行的class放在什么路径上,便于JVM加载class文件。
- tools.jar:是系统用来编译一个类的时候用到的,即执行javac的时候用到。
- dt.jar:dt.jar是关于运行环境的类库,主要是swing包。
首先使用文本工具编写java源代码,比如 Hello.java ;
在命令行中,输入命令:javac Hello.java,对源代码进行编译,生成 class 字节码文件;
编译完成后,如果没有报错信息,输入命令:java Hello,运行 class 字节码文件,由 JVM 对字节码进行解释和运行,打印 “Hello World”。
public class Hello {
public static void mian(String[] args) {
System.out.println("Hello World");
}
}
4.安装启动Tomcat
cd /opt/
tar xf apache-tomcat-8.5.16.tar.gz
mv apache-tomcat-8.5.16 /usr/local/tomcat
安装启动Tomcat
后台启动:
前台启动:
测试结果:
关闭服务
开启后台启动
到该目录里创建配置文件,实现开启和关闭
vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=tomcat server
Wants=network-online.target
After=network.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/java/jdk1.8.0_201-amd64"
Environment="PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
Environment="CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
实现输入命令进行开启和关闭服务:
5.优化tomcat启动速度
第一次启动tomcat可能会发现 Tomcat 启动很慢,默认情况下可能会需要几十秒,可以修改jdk参数进行改。
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
--117行--修改
securerandom.source=file:/dev/urandom
修改完配置文件后进行重现启动tomcat:
主要目录说明:
ll /usr/local/tomcat/
文件名 | 作用 |
---|---|
bin | 存放启动和关闭 Tomcat 的脚本文件,如 catalina.sh、startup.sh、shutdown.sh |
conf | 存放 Tomcat 服务器的各种配置文件,如主配置文件 server.xml 和 应用默认的部署描述文件 web.xml |
lib | 存放 Tomcat 运行需要的库文件的 jar 包,一般不作任何改动 |
logs | 存放 Tomcat 执行时的日志 |
temp | 存放 Tomcat 运行时产生的文件 |
webapps | 存放 Tomcat 默认的 Web 应用项目资源的目录 |
work | Tomcat 的工作目录,存放 Web 应用代码生成和编译文件 |
登入虚拟机修改并测试;
配置文件1
配置文件2
测试实验结果:
二.Tomcat优化
Tomcat默认安装下的缺省配置并不适合生产环境,它可能会频繁出现假死现象需要重启,只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面,分别为操作系统优化(内核参数优化),Tomcat配置文件参数优化,Java虚拟机(JVM)调优。
参数说明:
参数 | 说明 |
---|---|
-server | 一定要作为第一个参数,在多个CPU时性能佳 |
-Xms | 堆内存的初始大小,是分配JVM的初始内存,默认为物理内存的1/64。一般来讲,此值设的大点,程序会启动的快一点。 |
-Xmx | 堆内存的最大大小,是分配JVM的最大内存,默认为物理内存的1/4。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。 |
-Xmn | 堆内新生代的大小,通过这个值也可以得到老生代的大小:-Xmx减去-Xmn。官方推荐配置为整个堆的 3/8。 |
-Xss | 设置每个线程可使用的内存大小,即栈的大小。一般情况下,设置256k就足够了,此配置将会影响此进程中并发线程数的大小。 |
-XX:ParallelGCThreads | 配置并行收集器的线程数,即:同时有多少个线程一起进行垃圾回收。当 CPU 数量小于8,此值建议配置等于 CPU 数量。 |
-XX:PermSize | 设置非堆内存初始值,即持久代内存大小,默认是物理内存的1/4 |
-XX:MaxPermSize | 最大非堆内存的大小,即最大持久代内存大小,默认是物理内存的1/4 |
-XX:+HeapDumpOnOutOfMemoryError | 表示当JVM发生OOM时,自动生成DUMP文件 |
-XX:HeapDumpPath | 表示生成DUMP文件的路径 |
-XX:+UseParNewGC | 对新生代采用多线程并行回收,缩短垃圾收集的时间 |
-XX:+UseConcMarkSweepGC | 并发标记清除收集器,它是老年代的收集算法,缩短垃圾收集的时间 |
-XX:+DisableExplicitGC | 禁止调用System.gc(),防止误调用gc方法导致系统的 JVM 大起大落而使系统响应时间严重降低。 |
-Djava.awt.headless=true | 免避在 Linux/Unix 环境下 Web 网页不能正常显示图片 |
-XX:+CMSParallelRemarkEnabled | 启用并行标记,降低标记停顿 |
-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 | 这两个参数默认值就是这样的,表示触发FullGC时压缩堆,优化内存碎片 |
-XX:CMSInitiatingOccupancyFraction=70 | 在应用程序使用70%完内存后开始CMS垃圾收集 |
知识点:
- 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。
- 因此建议-Xms与-Xmx设成一样的值,均设为物理内存的一半。其目的是为了避免在java每次GC(垃圾回收机制清理堆区)后需要重新调整堆的大小而浪费资源。
- 堆区进一步细化分为:新生代、中生代、老生代。
- java中每新new一个对象所占用的内存空间就是新生代的空间,当java垃圾回收机制对堆区进行资源回收后,那些新生代中没有被回收的资源将被转移到中生代,中生代的被转移到老生代。
- 整个JVM堆大小 = 新生代大小 + 老生代大小 + 永久代大小
- 非堆区内存是不会被java垃圾回收机制进行处理的,且最大堆内存与最大非堆内存的和不能超出操作系统的可用内存。
- XMX和XMS设置一样大,MaxPermSize和MinPermSize设置一样大,这样可以减轻伸缩堆大小带来的压力。