Tomcat概述
Posted 礁之
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat概述相关的知识,希望对你有一定的参考价值。
一、Tomcat简介
(1)Tomcat概述
- tomcat是由apache软件基金会下属的jakarta项目开发的一个servlet容器,安装SunMicrosystems提供的技术规范,实现了对servlet和javaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能
- Tomcat可以解析静态页面也可以解析动态页面
(JSP页面)
,但是解析静态页面的效率没有apache好。可以解析动态页面是因为tomcat是java语言开发的,所以想要使用tomcat必须在服务器上安装JDK环境
(2)Tomcat和Apache的比较
- 两者的相同点:
- 两者都是由Apache组织开发的
- 两者都有HTTP服务器的功能
- 两者都是开源的
- 两者的不同点:
- Apache是专门用来提供HTTP服务的,以及相关配置的
(如虚拟主机、URL转发等HTTP服务器的基本功能)
,而Tomcat是Apache组织在符合Java EE的JSP、Servlet标准下开发的一个JSP服务器,所以按这个来说Tomcat只是有着HTTP服务的一些功能,并不是一个“专业”的HTTP服务 - Apache是一个Web服务器环境程序,启用Apache可以作为Web服务器来使用,不过只可以解析静态页面。如果想要解析动态页面
(JSP页面)
则需要一个解析动态页面的解释器,也就是一个中间件,而Tomcat就可以当这个中间件 - Apache侧重于HTTPServer,Tomcat侧重于servlet引擎,如果以Standalone方式运行,功能上与Apache相持平,支持JSP页面,但是对静态页面不太理想
- Apache是Web服务器,Tomcat是应用服务器,Tomcat只是一个servlet容器
(JSP也被翻译成servlet)
,可以认为是Apache的扩展,但是也可以独立运行
(3)Tomcat同类产品
- Resin服务器
- Jetty服务器
- JBoss服务器
- WebSphere服务器
- Weblogic服务器
在实际环境中,使用最多的一般是Tomcat和Weblogic
扩展:
Weblogic是Orcale公司的产品 (Orcale公司的产品都是收费的)
,可以进一步细分为Weblogic Server、Weblogic Enterprise和Weblogic Portal等系列,其中Weblogic Server的功能特别强大,Weblogic支持企业级的、多层次的和完全分布式的Web应用,并且服务器的配置简单,界面友好,对于那些正在寻找能够提供Java平台所拥有的一切应用服务器的用户来说,Weblogic是一个十分理想的选择
(4)Tocmat和JDK的关系
- JDK是开发人员开发使用,由java语言编写的,用来给java程序调用的
- JRE是用来运行Java程序的,也就是Java程序的运行环境
- JVM是整个Java实现跨平台运行的最核心部分,在运行java程序时,所有的Java程序会首先被编译成,class的类文件,这种类文件可以在虚拟机上执行,也就是说只要运行java的程序都是在JVM上面跑的
JDK包含JRE和JVM,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,这里的bin就是JVM,而lib中则是JVM工作所需要的类库,bin和lib两个文件夹合起来就是JRE。
JVM因为会与平台进行交互,所以使用c/c++和汇编语言编写的
JDK是java运行和编译的前提条件,而tomcat是web项目的运行容器是由java语言开发的,java没有JDK就没有办法进行编译和运行,必须依赖JDK的环境,所以安装Tomcat之前必须先安装JDK环境
(5)Tomcat和JDK版本对应图
二、Tomcat工作原理
(1)Tomcat整体架构
- Server服务器(Tomcat服务器)包含一个或多个Service服务。
- 而每个Service服务中又包含了Connector和Container两个核心组件和其他组件。
- 核心组件Connector包含一个或多个Connector。
- 核心组件Container包含一个Container。并且可以关联一个或者多个Connector
组件解析:
- Tomcat的有两个核心组件,相当于“心脏”,分别是Connector和Container
- 核心组件Connector是可以被替换的,这样会让Tomcat更加灵活
- 一个Container可以对应多个Connector,多个Connector和一个Container就形成了一个Service,有了Service就可以对外提供服务器,但是Service必须有一个可以生存的环境,而这个环境就是Server。Server可以控制Service的生命周期
- 在Service中,核心组件Connector主要负责对外交流也就是接受用户的请求,上面说到多个Connector是关联着一个Container的,而多个Connector接受的请求会发送给自己关联的Container,Container会处理这些请求,然后直接返回给Service
- 那么除了这两个核心组件之外,其他组件有什么用呢,其实两个核心组件提供的就是HTTP服务的基础功能,其他组件就像Apache、nginx的一些模组一样,说白了Service就像一个箱子,把这些组件装到一起然后对外提供服务
(2)Container组件详解:
-
Engine:负责处理Connector发过来的所有请求,处理后,会将处理结果直接返回给Service,而Connector是作为Service与Engine的中间媒介出现的。
一个Engine下可以配置一个默认主机和多个虚拟主机(Host),每个虚拟主机都有一个域名,当Engine获得一个请求时,他会把该请求匹配到某个虚拟主机host上,然后把请求交给该虚拟主机来处理。
Engine有一个默认主机,当获得的请求无法匹配到任何虚拟主机时,这个请求最终会交给默认主机
(默认Host)
来处理。Engine以线程的方式启动Host,也就是说有几个虚拟主机,Tomcat就会产生相应的线程数。
-
Host:代表一个虚拟主机,每个虚拟主机和某个网络域名(Domain Name)相匹配。
每个虚拟主机下都可以部署一个或多个Web应用,每个Web应用对应于一个Context,有一个Context path,当Host获得一个请求时,将把该请求匹配到某个Context上
-
Wrapper:代表一个Servlet容器,他负责管理一个Servlet,包括Servlet的装载、初始化、执行以及资源回收。
Wrapper是最底层的容器,他没有子容器了
(3)Tomcat处理请求过程
- 客户端发送请求给Tomcat的8080端口,Connector接受请求
- Connector接受请求后发送给Container处理请求,Container交给Engine
- Engine分配虚拟主机处理请求
- 虚拟主机分配请求给Context
- Context交给Servlet实例处理请求
- Servlet处理完后交给Context
- Context交给Host
- Host交给Engine
- Engine直接把处理好的请求交给Service
- Service返回请求给客户端
HTTP协议、HTTPS协议、AJP协议和其他协议的请求都是这个处理过程
(4)Tomcat中的连接器
Tomcat中支持两种协议的连接器:HTTP/1.1和AJP/1.3和一个用来关闭Tomcat的连接器
-
HTTP/1.1协议负责建立HTTP连接,web应用通过浏览器访问Tomcat服务器使用的就是这个连接器,默认监听的端口是TCP8080端口
-
AJP/1.3协议负载和其他HTTP服务器建立连接,监听的是TCP8009端口,比如Tomcat和apache或者iis(windows的web服务)建立连接时就会用到这个连接器
-
还有一个TCP8005的监听端口,这个的作用是用来关闭Tomcat的,所以说Tomcat中默认有三个连接器
(5)Tomcat的目录
目录 | 作用 |
---|---|
bin | 存放着启动和关闭tomcat的脚本 |
conf | 存放着不同的配置文件,server.xml是主配置文件 |
doc | 存放tomcat文档 |
lib/japser/common | 存放tomcat运行所需要的库文件 |
logs | 存放tomcat运行时产生的日志文件 |
src | 存放tomcat的源代码 |
webapps | tomcat默认的网页存放路径 |
work | 存放jsp编译后产生的class文件 |
- bin下的配置文件:
server.xml:Tomcat的主配置文件,包含Service、Connector、Engine、Redin、Valve、Hosts等组件的相关配置信息
web.xml:遵循Servlet规范标准的配置文,用于配置servlet,并为所有的web应用程序提供包括MIME等默认配置信息
(6)Tomcat常见日志
日志存放路径:/usr/local/tomcat/logs/
日志 | 作用 |
---|---|
localhost.log | 程序异常没有被捕获的时候抛出的地方,记录Tomcat异常状态**(常用)** |
catalina.out | 程序的输出、Tomcat的日志输出,记录所有类型的日志**(常用)** |
localhost_access_log.txt | Tomcat访问成功日志**(常用)** |
manager.log | 记录Tomcat根目录下webapps/manager项目所产生的日志 |
host-manager.log | 记录Tomcat根目录下webapps/host-manager项目所产生的日志 |
三、部署Tomcat
(1)实验环境
系统 | ip地址 | 主机名 | Tomcat版本 | JDK版本 |
---|---|---|---|---|
CentOS7.4 | 192.168.100.202 | rzy | apache-tomcat-8.5.16.tar.gz | jdk-8u91-linux-x64.tar.gz |
(2)实验目的
使客户端可以成功访问Tomcat
(3)实验步骤
******(1)先做基础配置
[root@Centos7 ~]# hostnamectl set-hostname rzy
[root@Centos7 ~]# su
[root@rzy ~]# systemctl stop firewalld
[root@rzy ~]# setenforce 0
setenforce: SELinux is disabled
[root@rzy ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
/dev/sr0 已经挂载到 /mnt 上
******(2)上传Tomcat和JDK的压缩包,先安装JDK环境
[root@rzy ~]# ll
总用量 182152
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 5147367 5月 7 17:49 apache-tomcat-8.5.16.tar.gz
-rw-r--r-- 1 root root 181367942 5月 7 17:49 jdk-8u91-linux-x64.tar.gz
[root@rzy ~]# rpm -qa | grep java #先查看本机是否有java
[root@rzy ~]# tar xf jdk-8u91-linux-x64.tar.gz #解压JDK包
[root@rzy ~]# mv jdk1.8.0_91/ /usr/local/java #移动解压后目录
[root@rzy ~]# ls /usr/local/java/ #确认是否移动成功
bin db javafx-src.zip lib man release THIRDPARTYLICENSEREADME-JAVAFX.txt
COPYRIGHT include jre LICENSE README.html src.zip THIRDPARTYLICENSEREADME.txt
[root@rzy ~]# cat <<a>> /etc/profile #往profile配置文件中修改全局变量PATH,增加JDK也就是java的根目录和bin命令目录
> export PATH=$PATH:/usr/local/java/bin:/usr/local/java
> a
[root@rzy ~]# source /etc/profile #执行脚本,使刚才操作生效
[root@rzy ~]# echo $PATH #查看是否成功添加路径(优化执行路径)
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/java/bin:/usr/local/java
[root@rzy ~]# java -version #查看java版本,可以成功查看说明已经成功添加java环境
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
******(3)安装完JDK后安装Tomcat
[root@rzy ~]# tar xf apache-tomcat-8.5.16.tar.gz
[root@rzy ~]# mv apache-tomcat-8.5.16 /usr/local/tomcat
[root@rzy ~]# ls /usr/local/tomcat/
bin conf lib LICENSE logs NOTICE RELEASE-NOTES RUNNING.txt temp webapps work
[root@rzy ~]# /usr/local/tomcat/bin/startup.sh #启动tomcat
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@rzy ~]# netstat -anpt | grep java #查看端口,发现三个监听端口,这个就是三个连接器
tcp6 0 0 :::8080 :::* LISTEN 1227/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1227/java
tcp6 0 0 :::8009 :::* LISTEN 1227/java
测试:(访问服务器的8080端口)
(4)扩展—安装mariadb数据库配置Tomcat的manager管理界面
******(1)继续上面的步骤
[root@rzy ~]# yum -y install mariadb-server mysql #使用yum安装
。。。。。。
完毕!
[root@rzy ~]# systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[root@rzy ~]# systemctl start mariadb
[root@rzy ~]# mysqladmin -u root -p password
Enter password:
New password:
Confirm new password:
[root@rzy ~]# mysql -u root -p123123
Welcome to the MariaDB monitor. Commands end with ; or \\g.
Your MariaDB connection id is 3
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
MariaDB [(none)]> exit
Bye
******(2)配置Tomcat的manager管理界面
[root@rzy ~]# vim /usr/local/tomcat/conf/tomcat-users.xml #末尾添加,要记得在</tomcat-users>项中添加,不然不会生效
。。。。。。
44 <role rolename="manager-gui"/> #添加管理页面的用户认证
45 <user username="tomcat" password="tomcat" roles="manager-gui"/> #添加用户名和密码
46 </tomcat-users>
。。。。。。
保存退出
[root@rzy ~]# vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
。。。。。。
17 -->
18 <Context antiResourceLocking="false" privileged="true" >
19 <Valve className="org.apache.catalina.valves.RemoteAddrValve"
20 allow="127\\.\\d+\\.\\d+\\.\\d+|::1|0:0:0:0:0:0:0:1|\\d+\\.\\d+\\.\\d+\\.\\d+" /> #添加所有网段都可用
21 <Manager sessionAttributeValueClassNameFilter="java\\.lang\\.(?:Boolean|Integer|Long|Number|String)|org\\.apache\\.catalina\\.filters\\.CsrfPreventionF ilter\\$LruCache(?:\\$1)?|java\\.util\\.(?:Linked)?HashMap"/>
22 </Context>
。。。。。。
完毕!
先进行访问:
现在重启tomcat
再次进行访问:
成功查看状态
(5)自定义页面
[root@rzy webapps]# mkdir -p /web/webapp/
[root@rzy webapps]# vim /web/webapp/index.jsp
<html>
<head>
<title>JSP TEST PAGE1 </title>
</head>
<body>
<% out.println("aaaaaaaaaaaaaaaa");%>
</body>
</html>
[root@rzy webapps]# vim /usr/local/tomcat/conf/server.xml #修改主配置文件,这里直接使用localhost,没有修改域名
。。。。。。#这里删除了注释所以是33行,不删除注释是150行
33 unpackWARs="true" autoDeploy="true">
34 <Context docBase="/web/webapp" path="" reloadable="false"></Context> #修改网页存放路径
35 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
36
。。。。。。
保存退出
测试,验证
(6)配置Tomcat虚拟主机
******(1)继续上面的操作,先创建虚拟主机的目录
[root@rzy ~]# mkdir -p /web2/webapp/
[root@rzy ~]# cp /web/webapp/index.jsp /web2/webapp/index.jsp
[root@rzy ~]# sed -i 's/a/b/g' /web2/webapp/index.jsp
[root@rzy ~]# cat /web2/webapp/index.jsp
<html>
<hebd>
<title>JSP TEST PAGE1 </title>
</hebd>
<body>
<% out.println("bbbbbbbbbbbbbbbb");%>
</body>
</html>
******(2)修改配置文件
[root@rzy ~]# vim /usr/local/tomcat/conf/server.xml #以<!-- 开头 -->结尾的都是注释,可以自行删除
。。。。。。 #复制Host区域,一个Host就是一个虚拟主机,域名不同然后把两个虚拟主机的网页存放路径指向不同的路径即可
32 <Host name="www.aaa.com" appBase="webapps"
33 unpackWARs="true" autoDeploy="true"> #设置自动识别war包,开启自动部署
34 <Context docBase="/web/webapp" path="" reloadable="false"></Context> #设置网页存放路径,tomcat把web应用程序映射为root URL路径,reloadable选项建议为false
35 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
36 prefix="localhost_access_log" suffix=".txt"
37 pattern="%h %l %u %t "%r" %s %b" />
38
39 </Host>
40 <Host name="www.bbb.com" appBase="webapps"
41 unpackWARs="true" autoDeploy="true">
42 <Context docBase="/web2/webapp" path="" reloadable="false"></Context>
43 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
44 prefix="localhost_access_log" suffix=".txt"
45 pattern="%h %l %u %t "%r" %s %b" />
46
47 </Host>
。。。。。。
#保存退出
[root@rzy ~]# /usr/local/tomcat/bin/shutdown.sh #重启tomcat
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@rzy ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
测试,修改hosts文件
访问不同的域名,要记得加端口号,发现出现两个不同的网页
(7)同一主机做两个实例的方法
- 在主配置文件中,直接把所有的Service区域复制一下,修改两个连接器的端口号不冲突即可
[root@rzy ~]# vim /usr/local/tomcat/conf/server.xml
。。。。。。
17 <Service name="Catalina">
18 <Connector port="8080" protocol="HTTP/1.1" #端口号不能相同,域名和网页存放路径也不能相同
19 connectionTimeout="20000"
20 redirectPort="8443" />
21 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> #8080和8009的端口
22 <Engine name="Catalina" defaultHost="localhost">
23 <Realm className="org.apache.catalina.realm.LockOutRealm">
24 <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
25 resourceName="UserDatabase"/>
26 </Realm>
27 <Host name="www.aaa.com" appBase="webapps"
28 unpackWARs="true" autoDeploy="true">
29 <Context docBase="/web/webapp" path="" reloadable="false"></Context>
30 </Host>
31 </Engine>
32 </Service>
33 <Service name="Catalina">
34 <Connector port="8081" protocol="HTTP/1.1" #改成8081和8010
35 connectionTimeout="20000"
36 redirectPort="8443" />
37 <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
38 <Engine name="Catalina" defaultHost="localhost">
39 <Realm className="org.apache.catalina.realm.LockOutRealm">
40 <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
41 resourceName="UserDatabase"/>
42 </Realm>
43 <Host name="www.bbb.com" appBase="webapps"
44 unpackWARs="true" autoDeploy="true">
45 <Context docBase="/web2/webapp" path="" reloadable="false"></Context>
46 </Host>
47 </Engine>
48 </Service>
49 </Server>
#保存退出
[root@rzy ~]# /usr/local/tomcat/bin/shutdown.sh #重新启动
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@rzy ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@rzy ~]# netstat -anpt | grep java #查看端口,发现有五个端口,一个8005是关闭tomcat的端口,另外四个就是两个实例的连接器的端口
tcp6 0 0 :::8080 :::* LISTEN 17004/java
tcp6 0 0 :::8081 :::* LISTEN 17004/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 17004/java
tcp6 0 0 :::8009 :::* LISTEN 17004/java
tcp6 0 0 :::8010 :::* LISTEN 17004/java
测试 (端口要注意修改)创建实例成功
- 第二种方法简单粗暴,直接装两台tomcat,路径不一样,修改端口和域名即可(略)
(8)Tomcat主机名(域名)
Tomcat在给虚拟主机配置域名之后,客户端只能访问域名,访问ip也是无法访问,这样可以防止恶意域名绑定,有的人会把自己的ip绑到某个服务器的域名,配置之后使用ip访问是无法正常访问的
以上是关于Tomcat概述的主要内容,如果未能解决你的问题,请参考以下文章