文章目录
一、什么是tomcat
1.1 tomcat简介
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
1.2 tomcat核心组件
1.3 tomcat处理请求的过程
请求过程
connector:连接器
一个Connector组件将在某个指定的端口上侦听客户请求,接收浏览器发过来的tcp连接请求,创建一个Request和一个Response对象分别用于和其你去端交换数据,然后会产生一个线程来处理这个请求并把产生的Request和Response对象传给Engine,从Engine中获得响应并返回给客户端。 Tomcat有两个经典的Connector,一个直接侦听来自浏览器的HTTP请求,另外一个侦听来自其他的WebServer的请求。Cotote HTTP/1.1 Connector在端口8080处侦听来自客户浏览器的HTTP请求,Coyote JK2 Connector在端口8009处侦听其他WebServer的Servlet/JSP请求。 Connector 最重要的功能就是接收连接请求然后分配线程让 Container来处理这个请求,所以这必然是多线程的,多线程的处理是 Connector 设计的核心。
container:容器
Container是容器的父接口,该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。通常一个Servlet class对应一个Wrapper,如果有多个Servlet则定义多个Wrapper,如果有多个Wrapper就要定义一个更高的Container,如Context。 Context定义在父容器 Host 中,其中Host 不是必须的,但是要运行 war 程序,就必须要 Host,因为 war 中必有 web.xml 文件,这个文件的解析就需要 Host 了,如果要有多个 Host 就要定义一个 top 容器 Engine 了。而 Engine 没有父容器了,一个 Engine 代表一个完整的 Servlet 引擎。
engine:引擎
Engine 容器比较简单,它只定义了一些基本的关联关系 Host 容器
host:虚拟主机
Host 是 Engine 的字容器,一个 Host 在 Engine 中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是 Context,它除了关联子容器外,还有就是保存一个主机应该有的信息
context:JSP前段页面
Context 代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host。Context 最重要的功能就是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 Wrapper 出现的,还有一点就是 Context 如何才能找到正确的 Servlet 来执行它呢? Tomcat5 以前是通过一个 Mapper 类来管理的,Tomcat5 以后这个功能被移到了 request 中,在前面的时序图中就可以发现获取子容器都是通过 request 来分配的
servlet:处理代码
详细步骤:
-
1.用户在浏览器中输入网址localhost:8080/test/index.jsp,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得;
-
2.Connector把该请求交给它所在的Service的Engine(Container)来处理,并等待Engine的回应;
-
3.Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host;
-
4.Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理);
-
5.path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到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对象返回给客户Browser
二、tomcat安装部署步骤
2.1 下载并安装JDK
- 1、JDK是Java语言的软件开发工具包
- 2、JDK是Tomcat运行的必要环境
- 3、根据计算机硬件配置,选择安装包
[root@server1 opt]# tar zxf jdk-8u91-linux-x64.tar.gz
[root@server1 opt]# mv jdk1.8.0_91/ /usr/local/java
[root@server1 opt]# cd /etc/profile.d/
[root@server1 profile.d]# vim java.sh
export JAVA_HOME=/usr/local/java ###设置java根目录
export PATH=$PATH:$JAVA_HOME/bin ###在PATH环境变量中添加JAVA根目录下的bin子目录
[root@server1 profile.d]# source java.sh ###java.sh脚本导入到环境变量中,使其生效
[root@server1 ~]# java -version ###查看版本
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
2.2 安装并启动tomcat
[root@server1 opt]# tar zxf apache-tomcat-8.5.16.tar.gz
[root@server1 opt]# mv apache-tomcat-8.5.16 /usr/local/tomcat8
[root@server1 opt]# /usr/local/tomcat8/bin/startup.sh ###启动tomcat
Using CATALINA_BASE: /usr/local/tomcat8
Using CATALINA_HOME: /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
Tomcat started.
[root@server1 opt]# /usr/local/tomcat8/bin/shutdown.sh ###关闭tomcat
Using CATALINA_BASE: /usr/local/tomcat8
Using CATALINA_HOME: /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
[root@server1 ~]# ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup ##优化执行路径
[root@server1 ~]# ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown
[root@server1 ~]# tomcatup
Using CATALINA_BASE: /usr/local/tomcat8
Using CATALINA_HOME: /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
Tomcat started.
[root@server1 ~]# netstat -anpt | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 48759/java
[root@server1 ~]# systemctl stop firewalld
[root@server1 ~]# setenforce 0
2.3 tomcat常用文件
●bin
存放启动和关闭Tomcat扽脚本文件,比较常用的是catalina.sh、startup.sh、shutdown.sh三个文件
●conf
存放Tomcat服务器的各种配置文件,比较常用的是server.xml、context.xml、tomcat-users.xml、web.xml四个文件
●lib
存放Tomcat服务器的jar包,一般不作任何改动,除非连接第三方服务,比如redis,那就需要添加相对应的jar包
●logs
存放tomcat日志
●temp
存放Tomcat运行时产生的文件
●webapps
存放项目资源的目录
●work
Tomcat工作目录,一般清除Tomcat缓存的时候会使用到
三、配置虚拟主机
3.1 基于端口
修改配置文件
[root@server1 ~]# vi /usr/local/tomcat8/conf/server.xml
</Service>
<Service name="Catalina">
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
<Host name="www.test2.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/webapp1/test2" path="" reloadable="false" />
</Host>
</Engine>
</Service>
</Server>
[root@server1 ~]# tomcatdown
[root@server1 ~]# tomcatup
[root@server1 ~]# netstat -anpt | grep 8080 ###查看8080端口是否开启
tcp6 0 0 :::8080 :::* LISTEN 51036/java
[root@server1 ~]# netstat -anpt | grep 8081 ###查看8081端口是否开启
tcp6 0 0 :::8081 :::* LISTEN 51036/java
3.2 基于域名
1、创建主页并修改主页内容
[root@server1 ~]# mkdir -p /web/webapp1/test1
[root@server1 ~]# mkdir -p /web/webapp1/test2
[root@server1 ~]# vi /web/webapp1/test1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("Welcome to test site,http://www.test1.com");%>
<div>动态页面</div><br/><img src="a.jpg">
</body>
</html>
[root@server1 ~]# vi /web/webapp1/test2/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<% out.println("Welcome to test site,http://www.test2.com");%>
<div>动态页面</div><br/><img src="b.jpg">
</body>
</html>
2、修改Tomcat主配置文件
[root@server1 ~]# vi /usr/local/tomcat8/conf/server.xml
<Host name="www.test1.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/webapp1/test1" path="" reloadable="false" />
</Host>
<Host name="www.test2.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/webapp1/test2" path="" reloadable="false" />
</Host>
[root@server1 ~]# tomcatdown
[root@server1 ~]# tomcatup
[root@server1 ~]# netstat -anpt | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 49329/java
3.本地增加映射
[root@server1 ~]# vi /etc/hosts
192.168.235.10 www.test1.com www.test2.com
4.验证