Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器。Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 java开发的JSP 动态页面程序的首选。一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端。
- Tomcat 可以作为Web应用服务器,处理静态的Web页面,如html页面,但性能一般。
- Tomcat 还可以作为servlet/jsp容器,处理java语言开发的jsp动态页面程序,这也是tomcat的主要应用场景
Tomcat 由一系列的组件构成,其中核心的组件有三个
(1)Web 容器:完成 Web 服务器的功能。
(2)Servlet 容器:名字为 catalina,用于处理 Servlet 代码。
(3)JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码。因此 Tomcat 是 Web 应用服务器,也是一个 Servlet/JSP 容器。Tomcat 作为 Servlet 容器,负责处理客户请求,把请求传送给 Servlet,并将 Servlet 的响应传送回给客户。
什么是 servlet?
Servlet 是Java Servlet 的简称,可以理解为是一个服务连接器,是用 Java 编写的服务器端程序,具有独立于平台和协议的特性, 简单的理解:servlet 就是一个中间件,包含了接口和方法,将客户端和数据库连接,从而实现动态网页的创建。什么是 JSP?
JSP 全称 Java Server Pages,是一种动态网页开发技术。它使用 JSP 标签在HTML网页中插入 Java 代码。标签通常以 <% 开头,以 %> 结束。
JSP 是一种 Java servlet,主要用于实现 Java web 应用程序的用户界面部分。
JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
Tomcat 功能组件结构
Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。 其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。
每个 Tomcat 服务器可以管理多个 Service。tomcat与NGINX,Apache不同,可以通过部署多个tomcat服务,达成一台服务器多个站点的目的。也可以和nginx,Apache的server虚拟站点一样,使用host虚拟站点。
- connector连接器:暴露监听端口,接收客户端发来的请求和返回响应消息给客户端
- container容器:负责处理用户的业务请求。由四个子容器engine、host、context、wrapper组成,且他们是父子关系。↓
- engine:引擎,管理多个虚拟主机,一个container只有一个engine
- host:代表一个虚拟主机 相当于nginx的server
- context:管理web应用的路径 相当于不同的网页
- wrapper:servlet封装器,负责处理业务逻辑
Tomcat 请求过程
1、用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得;
2、Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;
3、Engine(Container)根据域名发送给对应的虚拟主机 Host根据用户的访问URL路径 发送给 Context根据URL路径的Web应用 发送给Wrapper(servlet)根据应用程序处理业务逻辑。 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等。
4、执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端。
在部署 Tomcat 之前必须安装好 jdk,因为 jdk 是 Tomcat 运行的必要环境。
jdk包通常会包含 JDK、JRE、JVM
- JDK: java development kit java开发工具
- JRE:java runtime environment java编译、运行时环境
- JVM:java virtuak machine java虚拟机,可使java程序在不同平台上运行class文件
1.关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下
jdk-8u201-linux-x64.rpm
apache-tomcat-9.0.16.tar.gzsystemctl stop firewalld systemctl disable firewalld setenforce 0
2.安装JDK
cd /opt rpm -qpl jdk-8u201-linux-x64.rpm rpm -ivh jdk-8u201-linux-x64.rpm java -version
3.设置JDK环境变量
在/etc/profile的子目录编写脚本,达到自动加载效果
vim /etc/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 #必要
重载配置
source /etc/profile.d/java.sh
查看java版本
java -version
CLASSPATH:告诉jvm要使用或执行的class放在什么路径上,便于JVM加载class文件。
tools.jar:是系统用来编译一个类的时候用到的,即执行javac的时候用到。
dt.jar:dt.jar是关于运行环境的类库,主要是swing包。验证安装的JAVA是否生效
首先使用文本工具编写java源代码,比如 Hello.java ;
在命令行中,输入命令:javac Hello.java,对源代码进行编译,生成 class 字节码文件;
编译完成后,如果没有报错信息,输入命令:java Hello,运行 class 字节码文件,由 JVM 对字节码进行解释和运行,打印 “Hello World”。vim Hello.java //类名、接口名命令:英文大小写字母、数字字符、$和_,不能使用关键字和数字开头; //一个单词命名时第一个单词的首字母要大写;多单词组成时,所有单词的首字母大写:XxxYyyZzz(大驼峰命名法) public class Hello { public static void main(String[] args){ System.out.println("Hello world!"); } }
javac Hello.java java Hello
4.安装启动Tomcat 支持systemctl指令启动tomcat
cd /opt tar zxvf apache-tomcat-9.0.16.tar.gz mv apache-tomcat-9.0.16 /usr/local/tomcat
后台启动
/usr/local/tomcat/bin/startup.sh 或 /usr/local/tomcat/bin/catalina.sh start
前台启动
/usr/local/tomcat/bin/catalina.sh run
关闭服务
/usr/local/tomcat/bin/shutdown.sh
启动情况
netstat -natp | grep 8080 或 jps #java自带查看进程命令
tcp 8080 负责处理http请求连接 8443 负责处理https请求连接
8005 关闭tomcat服务使用
8009 AJP协议端口,与apache连接使用,apache可通过AJP协议访问tomcat的8009端口如何通过进程号查看文件?(面试题)
lsof -p [pid]
如何通过端口号查看进程?(面试题)
lsof -i :8080 netstat -natp | grep 8080
编写脚本支持systemctl指令启动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
systemctl daemon-reload #重载配置
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 启动慢的原因是随机数产生遭到阻塞,遭到阻塞的原因是 熵池大小 。
●/dev/random:阻塞型,读取它就会产生随机数据,但该数据取决于熵池噪声,当熵池空了,对/dev/random 的读操作也将会被阻塞。
●/dev/urandom:非阻塞的随机数产生器,它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。
●Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。
----------------------------------------------------------------------------------------------------------
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 应用代码生成和编译文件
----------------------------------------------------------------------------------------------------------
很多时候公司会有多个项目需要运行,一般不会是在一台服务器上运行多个 Tomcat 服务,这样会消耗太多的系统资源。此时, 就需要使用到 Tomcat 虚拟主机。
例如现在新增两个域名 www.xue.com 和 www.benet.com, 希望通过这两个域名访问到不同的项目内容。tomcat是java编写所以内存占用多,类似2核4g 4核8g。
虚拟主机在指定的资源内运行多个站点服务(资源少并发小使用),而多实例则提供更多的连接数。(资源多并发大使用)
1.在 webapps 目录中添加 各个站点的网页根目录,准备测试网页文件(创建 kgc 和 benet 项目目录和文件)
mkdir /usr/local/tomcat/webapps/xue mkdir /usr/local/tomcat/webapps/benet echo "This is xue page\!" > /usr/local/tomcat/webapps/xue/index.jsp echo "This is benet page\!" > /usr/local/tomcat/webapps/benet/index.jsp
2.修改 Tomcat 主配置文件 server.xml
在Engine(容器)配置段下面添加多个 host 配置段,设置不同的虚拟主机配置参数
在host配置段下面添加context配置段,设置每个虚拟机主机的网页根目录配置参数vim /usr/local/tomcat/conf/server.xml --165行前--插入
path选项代表根目录位置,不同的path选项影响如下↓
docBase="/usr/local/tomcat/webapps/xue" path=""
http://www.xue.com:8080/test/abc.html → /usr/local/tomcat/webapps/xue/test/abc.html
docBase="/usr/local/tomcat/webapps/xue" path="/test" #当网址访问/test目录,转到/usr/local/tomcat/webapps/xue
http://www.xue.com:8080/test/abc.html → /usr/local/tomcat/webapps/xue/abc.html----------------------------------------------------------------------------------------------------------
Host
name:主机名
appBase:Tomcat程序工作目录,即存放web应用程序的目录;相对路径为webapps,绝对路径为 /usr/local/tomcat/webapps
unpackWARs:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true
autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true
xmlValidation:是否验证xml文件执行有效性检验的标志
xmlNamespaceAware:是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验Context
docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;
path:相对于Web服务器根路径而言的URI;如果为空"",则表示为此webapp的根路径 / ;
reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false
----------------------------------------------------------------------------------------------------------重启服务
/usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh
3.客户端浏览器访问验证
echo "192.168.80.101 www.xue.com www.benet.com" >> /etc/hosts
浏览器访问 http://www.xue.com:8080/ 页面显示This is xue page\!
浏览器访问 http://www.benet.com:8080/ 页面显示This is benet page\!----------------------------------------------------------------------------------------------------------
HTTP 请求过程:
(1)Connector 连接器监听的端口是 8080。由于请求的端口和监听的端口一致,连接器接受了该请求。
(2)因为引擎的默认虚拟主机是 www.xue.com,并且虚拟主机的目录是webapps。所以请求找到了 tomcat/webapps 目录。
(3)访问的路径为根路径,URI 为空,即空是 Web 程序的应用名,也就是 context。此时请求找到 /usr/local/tomcat/webapps/xue 目录,解析 index.jsp 并返回。
----------------------------------------------------------------------------------------------------------
虚拟主机在指定的资源内运行多个站点服务(资源少并发小使用),而多实例则提供更多的连接数。(资源多并发大使用)
1.安装好 jdk
2.安装 两个 tomcat服务 到不同目录
cd /opt tar zxvf apache-tomcat-9.0.16.tar.gz mkdir /usr/local/tomcat mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1 cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2
3.编写脚本,定义两个tomcat服务定义两个路径 设置环境变量
这里是将不同的路径写入两个服务器不同的CATALINA_HOME等变量
以便下面第五步启停脚本中直接调用(如果路径有更改,直接更改tomcat.sh即可,无需在start.sh更改)当然这一步不做,在第五步的启停脚本中直接写路径也行。
vim /etc/profile.d/tomcat.sh #tomcat1 export CATALINA_HOME1=/usr/local/tomcat/tomcat1 export CATALINA_BASE1=/usr/local/tomcat/tomcat1 export TOMCAT_HOME1=/usr/local/tomcat/tomcat1 #tomcat2 export CATALINA_HOME2=/usr/local/tomcat/tomcat2 export CATALINA_BASE2=/usr/local/tomcat/tomcat2 export TOMCAT_HOME2=/usr/local/tomcat/tomcat2
运行脚本刷新变量
source /etc/profile.d/tomcat.sh
4.修改 tomcat2 中的 server.xml 文件中的 三个 端口号 8080 8005 8009,要求各 tomcat 实例配置不能有重复的端口号
vim /usr/local/tomcat/tomcat2/conf/server.xml
#22行,修改Server prot,默认为8005 -> 修改为8006 修改为8081 #116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010 ----------------------------------------------------------------------------------------------------------
第一个连接器默认监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
第二个连接器默认监听8009端口,AJP端口,即容器使用,如Apache能通过AJP协议访问Tomcat的8009端口。
----------------------------------------------------------------------------------------------------------tcp 8080 负责处理http请求连接 8443 负责处理https请求连接
8005 关闭tomcat服务使用
8009 AJP协议端口,与apache连接使用,apache可通过AJP协议访问tomcat的8009端口
5.修改各 tomcat 实例中的启动停止脚本 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量 export CATALINA_HOME CATALINA_BASE TOMCAT_HOME 都指向实例自己的工作目录
不同的Tomcat服务启动需要指定不同的环境变量路径,以区分开来。
这里引用第三步中预先写好的环境变量的路径的值。当然直接写相应的路径也可以,区分开即可。
更改Tomcat 实例1的启停配置中环境变量,指定自己所在的目录
vim /usr/local/tomcat/tomcat1/bin/startup.sh # ----------------------------------------------------------------------------- # Start Script for the CATALINA Server # ----------------------------------------------------------------------------- ##添加以下内容 export CATALINA_BASE=$CATALINA_BASE1 export CATALINA_HOME=$CATALINA_HOME1 export TOMCAT_HOME=$TOMCAT_HOME1
vim /usr/local/tomcat/tomcat1/bin/shutdown.sh # ----------------------------------------------------------------------------- # Stop script for the CATALINA Server # ----------------------------------------------------------------------------- export CATALINA_BASE=$CATALINA_BASE1 export CATALINA_HOME=$CATALINA_HOME1 export TOMCAT_HOME=$TOMCAT_HOME1
更改Tomcat 实例2的启停配置中环境变量,指定自己所在的目录
vim /usr/local/tomcat/tomcat2/bin/startup.sh # ----------------------------------------------------------------------------- # Start Script for the CATALINA Server # ----------------------------------------------------------------------------- ##添加以下内容 export CATALINA_BASE=$CATALINA_BASE2 export CATALINA_HOME=$CATALINA_HOME2 export TOMCAT_HOME=$TOMCAT_HOME2
vim /usr/local/tomcat/tomcat2/bin/shutdown.sh # ----------------------------------------------------------------------------- # Stop script for the CATALINA Server # ----------------------------------------------------------------------------- export CATALINA_BASE=$CATALINA_BASE2 export CATALINA_HOME=$CATALINA_HOME2 export TOMCAT_HOME=$TOMCAT_HOME2
6.启动各 tomcat 中的 /bin/startup.sh
/usr/local/tomcat/tomcat1/bin/startup.sh /usr/local/tomcat/tomcat2/bin/startup.sh netstat -natp | grep java
7.浏览器访问测试
http://192.168.80.101:8080
http://192.168.80.101:8081