Tomcat是Java语言开发的,Tomcat服务器是一个免费的开放源代码的Web应用服务器,是Apache软件基金会的Jakarta项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。
Tomcat属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。一般来说,Tomcat虽然和Apache或者Nginx这些Web服务器一样,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及Apache或者Nginx,所以Tomcat通常是作为一个Servlet和JSP容器,单独运行在后端+。
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。
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,这四个容器之间属于父子关系。
容器由一个引擎可以管理多个虚拟主机。每个虚拟主机可以管理多个 Web应用。每个Web应用会有多个Servlet封装器。
(1)用户在浏览器中输入网址,请求被发送到本机端口8080,被在那里监听的Connector获得;
(2)Connector把该请求交给它所在的Service的Engine(Container)来处理,并等待Engine的回应;
(3)请求在Engine、Host、Context和Wrapper这四个容器之间层层调用,最后在Servlet中执行对应的业务逻辑、数据存储等。
(4)执行完之后的请求响应在Context、Host、Engin容器之间层层返回,最后返回给Connector,并通过Connector返回给客户端。
在部署tomcat之前必须安装jdk,因为==jdk是tomcat运行的必要。
(1)关闭防火墙,将安装Tomcat所需软件包传到/opt目录下
[root@clr ~]# systemctl stop firewalld
[root@clr ~]# systemctl disable firewalld
[root@clr ~]# setenforce 0
[root@clr ~]# cd /opt
[root@clr /opt]# rz -E
[root@clr /opt]# ls
apache-tomcat-9.0.16.tar.gz jdk-8u201-linux-x64.rpm rh
(2)安装JDK
[root@clr /opt]# rpm -qpl jdk-8u201-linux-x64.rpm #查询指定软件包的文件列表
/usr/java/jdk1.8.0_201-amd64/release
/usr/java/jdk1.8.0_201-amd64/src.zip
[root@clr /opt]# rpm -ivh jdk-8u201-linux-x64.rpm #安装一个新的RPM软件包
[root@clr /opt]# java -version #查看新安装的java版本信息
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
(3)设置JDK环境变量
[root@clr /etc/profile.d]# vim 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
#JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
#JRE_HOME=/usr/java/jdk1.8.0_201-amd64/jre
#CLASSPATH=.:/usr/java/jdk1.8.0_201-amd64/lib:/usr/java/jdk1.8.0_201-amd64/jre/lib
#PATH=/usr/java/jdk1.8.0_201-amd64/bin:/usr/java/jdk1.8.0_201-amd64/jre/bin:$PATH
[root@clr /etc/profile.d]# source /etc/profile.d/java.sh #启动java.sh脚本
[root@clr /etc/profile.d]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
验证JDK环境变量是否安装成功:
首先使用文本工具编写java源代码,比如Hello.java ;在命令行中,输入命令:javac Hello.java,对源代码进行编译,生成class字节码文件;编译完成后,如果没有报错信息,输入命令:java Hello,运行class字节码文件,由JVM对字节码进行解释和运行,打印 “Hello World”。
[root@clr /etc/profile.d]# vim Hello.java
vim Hllello.java
#类名、接口名命令:英文大小写字母、数字字符、$和_,不能使用关键字和数字开头;
一个单词命名时第一个单词的首字母要大写;多单词组成时,所有单词的首字母大写:XxxYyyZzz(大驼峰命名法)
public class Hello {
public static void main(String[] args){
System.out.println("Hello gzy,mygirl!");
}
}
[root@clr /etc/profile.d]# javac Hello.java
[root@clr /etc/profile.d]# java Hello
(4)安装启动Tomcat
将apache-tomcat-9.0.16压缩包移动到/usr/local/tomcat目录下;
[root@clr /etc/profile.d]# cd /opt
[root@clr /opt]# ls
apache-tomcat-9.0.16.tar.gz jdk-8u201-linux-x64.rpm rh
[root@clr /opt]# tar xf apache-tomcat-9.0.16.tar.gz
[root@clr /opt]# ls
apache-tomcat-9.0.16 apache-tomcat-9.0.16.tar.gz jdk-8u201-linux-x64.rpm rh
[root@clr /opt]# mv apache-tomcat-9.0.16 /usr/local/tomcat
启动tomcat;
#后台启动
[root@clr /opt]# /usr/local/tomcat/bin/startup.sh
或
[root@clr /opt]# /usr/local/tomcat/bin/catalina.sh start
#前台启动
[root@clr /opt]# /usr/local/tomcat/bin/catalina.sh run
[root@clr /opt]# netstat -natp | grep 8080
#后台关闭tomcat服务
[root@clr /usr/local/tomcat/bin]# ./catalina.sh stop
添加tomcat.service系统服务;
[root@clr /opt] 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
[root@clr /usr/lib/systemd/system]# systemctl daemon-reload #重新加载
[root@clr /usr/lib/systemd/system]# systemctl start tomcat #启动tomcat服务
[root@clr /usr/lib/systemd/system]# netstat -lntp | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 7271/java
[root@clr /usr/lib/systemd/system]# systemctl stop tomcat
[root@clr /usr/lib/systemd/system]# netstat -lntp | grep 8080
浏览器访问tomcat的默认主页 http://192.168.80.40:8080
(5)优化tomcat启动速度
第一次启动tomcat可能会发现Tomcat启动很慢,默认情况下可能会需要几十秒,可以修改jdk参数进行改。
[root@clr /usr/lib/systemd/system]# vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
securerandom.source=file:/dev/urandom #--117行--修改
[root@clr /usr/lib/systemd/system]# /usr/local/tomcat/bin/shutdown.sh
[root@clr /usr/lib/systemd/system]# /usr/local/tomcat/bin/startup.sh
securerandom.source=file:/dev/urandom
/usr/local/tomcat/中主要目录说明:
目录名称 | 功能作用 |
---|---|
bin | 存放启动和关闭 tomcat的脚本文件,如catalina.sh、startup.sh、shutdown.sh |
conf | u存放 Tomcat 服务器的各种配置文件,如主配置文件 server.xml 和 应用默认的部署描述文件 web.xml |
lib | 存放 Tomcat 运行需要的库文件的 jar 包,一般不作任何改动 |
logs | 存放 Tomcat 执行时的日志 |
temp | 存放 Tomcat 运行时产生的文件 |
webapps | 存放 Tomcat 默认的 Web 应用项目资源的目录 |
work | Tomcat 的工作目录,存放 Web 应用代码生成和编译文件 |
很多时候公司会有多个项目需要运行,一般不会是在一台服务器上运行多个tomcat服务,这样会消耗太多的系统资源。此时,就需要使用到tomcat虚拟主机。
例如:现在新增两个域名www.kgc.com 和www.benet.com,希望通过这两个域名访问到不同的项目内容。
(1)创建kgc和benet项目目录和文件
[root@clr /usr/lib/systemd/system]# cd /usr/local/tomcat/webapps/
[root@clr /usr/local/tomcat/webapps]# ls
docs examples host-manager manager ROOT
[root@clr /usr/local/tomcat/webapps]# mkdir kgc
[root@clr /usr/local/tomcat/webapps]# mkdir accp
[root@clr /usr/local/tomcat/webapps]# echo "this is kgc de tomcat web\!" > ./kgc/index.jsp
[root@clr /usr/local/tomcat/webapps]# echo "this is accp de tomcat web\!" > ./accp/index.jsp
(2)修改tomcat主配置文件
[root@clr /usr/local/tomcat/conf]# vim server.xml
--165行前--插入
[root@clr /usr/local/tomcat/conf]# /usr/local/tomcat/bin/shutdown.sh
[root@clr /usr/local/tomcat/conf]# /usr/local/tomcat/bin/startup.sh
关键字名称 | 功能作用 |
---|---|
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 |
(3)客户端浏览器访问验证
echo "192.168.80.0 www.kgc.com www.benet.com" >> /etc/hosts
浏览器访问
http://www.kgc.com:8080/
浏览器访问
http://www.accp.com:8080/
HTTP请求过程
(1)Connector连接器监听的端口是8080。由于请求的端口和监听的端口一致,连接器接受了该请求。
(2)因为引擎的默认虚拟主机是www.kgc.com,并且虚拟主机的目录是webapps。所以请求找到了tomcat/webapps目录。
(3)访问的路径为根路径,URI为空,即空是Web程序的应用名,也就是context。此时请求找到 /usr/local/tomcat/webapps/kgc目录,解析index.jsp 并返回==。
(1)安装jdk和tomcat
[root@clr ~]# cd /opt
[root@clr /opt]# ls
apache-tomcat-9.0.16.tar.gz jdk-8u91-linux-x64.tar.gz rh
[root@clr /opt]# tar xf jdk-8u91-linux-x64.tar.gz
[root@clr /opt]# tar xf apache-tomcat-9.0.16.tar.gz
[root@clr /opt]# ls
apache-tomcat-9.0.16 apache-tomcat-9.0.16.tar.gz jdk1.8.0_91 jdk-8u91-linux-x64.tar.gz rh
[root@clr /opt]# mv jdk1.8.0_91/ /usr/local
[root@clr /opt]# mkdir /usr/local/tomcat
[root@clr /opt]# cp -r apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
[root@clr /opt]# cp -r apache-tomcat-9.0.16 /usr/local/tomcat/tomcat2
(2)配置tomcat环境变量
[root@clr /usr/local/tomcat]# 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
[root@clr /usr/local/tomcat]# source /etc/profile.d/tomcat.sh
(3)修改tomcat2中的server.xml文件,要求各tomcat实例配置不能有重复的端口号
[root@clr ~]# vim /usr/local/tomcat/tomcat2/conf/server.xml
#22行,修改Server prot,默认为8005 -> 修改为8006
修改为8081
#116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010
第一个连接器Connector默认监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
第二个连接器Container默认监听8009端口,AJP端口,即容器使用,如Apache能通过AJP协议访问Tomcat的8009端口。
(4)修改各tomcat实例中的startup.sh和shutdown.sh文件,并添加tomcat环境变量
修改tomcat1实例中的startup.sh文件;
[root@clr ~]# 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
修改tomcat1实例中的shutdown.sh文件;
[root@clr ~]# 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
修改tomcat2实例中的startup.sh文件;
[root@clr ~]# 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
修改tomcat2实例中的shutdown.sh文件;
[root@clr ~]# 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
(5)启动各tomcat中的/bin/startup.sh
[root@clr ~]# /usr/local/tomcat/tomcat1/bin/startup.sh
[root@clr ~]# /usr/local/tomcat/tomcat2/bin/startup.sh
[root@clr ~]# netstat -natp | grep java
(6)浏览器访问测试
http://192.168.80.40:8080
http://192.168.80.40:8081