Tomcat服务部署及优化

31 阅读13分钟

一、Tomcat的概述

自 2017 年 11 月编程语言排行榜 Java 占比 13%,高居榜首,Tomcat 也一度成为 Java 开发人员的首选。其开源、占用系统资源少、跨平台等特性被深受喜爱。本章主要学习如何 部署 Tomcat 服务,根据生产环境实现多个虚拟主机的配置,最后的重点是进行压测,根据 压测结果如何优化 Tomcat 服务及常见的内存溢出如何处理。

Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。一般来说,Tomcat虽然和Apache或者Nginx这些Web服务器一样,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及Apache或者Nginx,所以Tomcat通常是作为一个Servlet和JSP容器,单独运行在后端。

二、B/S(Browser/Server)结构

最早出现了CGl (Common Gateway Interface)通用网关接口,通过浏览器中输入URL直接映射到一个服务器端的脚本程序执行,这个脚本可以查询数据库并返回结果给浏览器端。这种将用户请求使用程序动态生成的技术,称为动态网页技术。先后出现了ASP、PHP、JSP等技术,这些技术的使用不同语言编写的程序都运行在服务器端,所以称为WEB后端编程。有一部分程序员还是要编写HTML、CSS、JavaScript,这些代码运行在浏览器端,称为WEB前端编程。合起来称为Browser/Server编程,即B/S编程。

三、java基础

1. web架构

image-20230829161905623.png

PC端或移动端浏览器访问 从静态服务器请求HTML、CSS、JS等文件发送到浏览器端,浏览器端接收后渲染在浏览器上从图片服务器请求图片资源显示 从业务服务器访问动态内容,动态内容是请求后有后台服务访问数据库后得到的,最终返回到浏览器端。

手机App访问 内置了HTML和]S文件,不需要从静态WEB服务器下载JS或HTML。为的就是减少文件的发送,现代前端开发使用的S文件太多或太大了有必要就从图片服务器请求图片,从业务服务器请求动态数据 客户需求多样,更多的内容还是需要由业务服务器提供,业务服务器往往都是由一组服务器组成。

2. java历史

Java原指的是印度尼西亚的爪哇岛,人口众多,盛产咖啡、橡胶等。

Java语言最早是在1991年开始设计的,最初叫Oak项目,它初衷是跑在不同机顶盒设备中的。

1993年网景公司成立。Oak项目组很快他们发现了浏览器和动态网页技术这个巨大的市场,转向WEB方向。并首先发布了可以让网页动起来的Applet技术(浏览器中嵌入运行Java字节码的技术)。

在1995年,一杯爪哇岛咖啡成就了Java这个名字。

Sun公司第一个Java公开版本1.0发布于1996年。口号是"一次编写,到处运行"(Write once,Run anywhere),跨平台运行。

1999年,SUN公司发布了第二代Java平台(Java2)。

2009年4月20日,Oracle甲骨文公司宣布将以每股9.50美元,总计74亿美金收购SUN(计算机系统)公司。2010年1月成功收购

2010年,Java创始人之一的 James Gosling 离开了Oracle,去了Google。

2010年8月13日,Oracle在加利福尼亚地方法院起诉Google侵犯版权和专利权。Oracle声称

Google侵犯了Java 37个API和部分专利。地方法院的陪审团认为未侵犯专利,且API无版权。

2016年5月26日,地方法院二审陪审团认定未侵犯版权,对37个JAVA API的重新实现受到合理使用的保护。

2017年Oracle上诉美国联邦巡回上诉法院,2018年3月27日判决Oracle胜诉,Google应赔偿近90亿美金。

2019年1月Google想让美国最高法院撤销联邦法院裁决。谷歌表示裁决是"对软件业的毁灭性一击"。现任特朗普政府支持Oracle公司,但微软、Mozilla、 红帽支持Google。目前案件已经受理,但由于疫情推迟。有更多的企业和组织加入进来,包括IBM、计算机和通信协会、互联网协会、超过150名学者和教授。此案如果Oracle胜诉,将在美国形成判例,将深远广泛影响软件业。例如: POSIX接口, 是商用系统UNIX的兼容接口规范。

3. JDK

JDK:  Java Development Kit,即Java语言的软件开发工具包JDK协议基于JRL(JavaResearch License)协议。

4. 安装Oracle JDK的流程

Oracle JDK的rpm安装操作过程

1)将rpm软件包拖到opt下进行安装

image.png

2)rpm安装rpm软件包

image.png

3)在/etc/profile文件下添加文件配置

export JAVA_HOME=/usr/java/default
#指明自己java的根目录
export PATH=$JAVA_HOME/bin:$PATH
#java的启动文件

image.png

image.png

4)刷新/etc/profile文件

source /etc/profile
java -version

image.png

Oracle JDK的二进制文件安装操作过程

1)将二进制软件包拖到opt下进行安装

image.png

2)解压二进制软件包并切换到/usr/local目录

image.png

3)将二进制软件包做软链接

image.png

4)编写环境变量文件

vim /etc/profile.d/jdk.sh 
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=$JAVA_HOME/jre 
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/

image.png

5)初始化环境变量

. /etc/profile.d/jdk.sh
java -version

image.png

四、Tomcat的组件分层与分类

Tomcat 由一系列的组件构成,其中核心的组件有三个:

  • Web 容器:完成 Web 服务器的功能。
  • Servlet 容器:名字为 catalina,用于处理 Servlet 代码。
  • JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码

Tomcat(端口号:8080)组件:

image-20211114215310100.png

  • connector 连接器 :暴露监听端口,接收客户端发来的请求和返回响应消息给客户端。
  • container 容器:负责处理用户请求的业务逻辑,由4个容器组成(engine,host,context,wrapper)子容器之间是父子关系。

注释

  1. engine:引擎,管理多个虚拟主机,一个container只有一个engine。
  2. host:代表一个虚拟主机。
  3. context:管理web应用的路径。
  4. wrapper:servlet封装器,负责处理业务逻辑

多实例:多实例就是在一台服务器上同时开启多个不同的服务端口,同时运行多个服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供服务。

引擎:一般而言,引擎是一个程序或一套系统的支持部分。常见的程序引擎有游戏引擎、搜索引擎、杀毒引擎等。

安装目录文件:

目录文件功能
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存放项目资源的目录
workTomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到
  • bin

image.png

  • conf

image.png

  • lib

image.png

  • logs

image.png

  • temp

image.png

  • webapps

image.png

  • work

image.png

conf子目录文件:

文件名说明
server.xml主配置文件
web.xml每个webapp只有“部署"后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件

核心组件

核心组件说明
server服务器,Tomcat运行的进程实例,一个Server中可以有多个service,但通常就一个
service服务,用来组织Engine和Connector的对应关系,一个service中只有一个Engine
connector连接器,负责客户端的HTTP、HTTPS、AJP等协议连接。一个Connector只属于某一个Engine
Engine引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector
Host虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分
Context应用的上下文,配置特定url路径映射和目录的映射关系: url => directory
Wrapper每一Wrapper封装着 一个Servlet

注意:配置文件对于大小写敏感

通常意义上的 Web 服务器接受请求后,只是单纯地响应静态资源,如 HTML 文件,图片 文件等,不能在后端进行一定的处理操作。 Tomcat 是 Apache 下的一个子项目,它具备 Web 服务器的所有功能,不仅可以监听接受请求并响应静态资源,而且可以在后端运行特定规范 的 Java 代码 Servlet,同时将执行的结果以 HTML 代码的形式反回客户端。

五、Tomcat的顶层架构

  • Tomcat中最顶层的容器是Server,代表着整个服务器,一个Server可以包含至少一个Service,用于具体提供服务。

  • Service主要包含两个部分:Connector和Container。Tomcat的心脏就是这两个组件,这两个组件的作用:Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化; Conta iner用于封装和管理Servlet,以及具体处理Request请求。

  • 一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但是可以有多个Connectors,因为一个服务可以有多个连接,如同时提供Http和Https链接,也可以提供向相同协议不同端口的连接。

  • 多个Connector和一个Container就形成了一个Service,有了Service就可以对外提供服务了,但是Service还要一个生存的环境,必须要有人能够给它生命、掌握其生死大权,那就非Server莫属了!所以整个Tomcat的生命周期由Server控制。另外,上述的包含关系或者说是父子关系,都可以在tomcat的conf目录下的server .xml配置文件中看出。

  • server.xm1中定义【Server port="8005" shutdown="SHUTDOWN"】这会让Tomcat6启动一个server实例(即一个JVM),它监听在8005端口以接收“SHUTDOWN”命令,如果接收到了就会关闭Tomcat。各Server的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个Server实例,必须配置它们使用不同的端口。

六、Tomcat的处理请求过程

  • 用户在浏览器中输入该网址,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得;
  • Connector把该请求交给它所在的Service的Engine (Container) 来处理,并等待Engine的回应;
  • Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host;
  • Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhostHost获得请求/test/index.jsp,匹配它所拥有的所有Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“”的Context去处理);
  • path="/test"的Context获得请求/ index. jsp,在它的mapping table中寻找出对应的Servlet。Context 匹配到URLPattern为* .jsp的Servlet,对应于JspServlet类;
  • 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost(),执行业务逻辑、数据存储等
  • Context把执行完之后的HttpServletResponse对象返回给Host;
  • Host把HttpServletResponse对象返回给Engine;
  • Engine把HttpServletResponse对象返回Connector;
  • Connector把HttpServletResponse对象返回给客户Browser。

七、安装Tomcat软件的操作过程

1.先rpm安装JDK

1)将rpm软件包拖到opt下进行安装

image.png

2)rpm安装rpm软件包

image.png

3)在/etc/profile文件下添加文件配置

export JAVA_HOME=/usr/java/default
#指明自己java的根目录
export PATH=$JAVA_HOME/bin:$PATH
#java的启动文件

image.png

image.png

4)刷新/etc/profile文件

source /etc/profile
java -version

image.png

2.再安装Tomcat

1)将Tomcat压缩包拖到opt下进行解压安装

image.png

2)将Tomcat做软链接到/usr/local下,方便管理

ln -s /opt/apache-tomcat-9.0.16 /usr/local/tomcat

image.png

3)切换到/usr/local/tomcat/bin下启动文件

image.png

方法1:执行自带脚本,不推荐!

[root@localhost bin]# ./catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/default
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@localhost bin]# ss -natp |grep 8080
LISTEN     0      100         :::8080                    :::*                   users:(("java",pid=56282,fd=54))

image.png

注意

启动方法1:路径启动tomcat

后台启动:

 tomcat  /bin/startup.sh
 tomcat  /bin/catalina.sh

前台启动:

  tomcat  /bin/catalina.sh run

关闭服务:

 tomcat  /bin/shutdown.sh

启动方法2: 编写tomcat.service文件

 编写tomcat.service文件:vim /usr/lib/systemd/system/tomcat.service

4)开启tomcat

image.png

5)去浏览器查看

image.png

6)创建一个用户,把tomcat里面的文件,属主属组改变成新的用户

useradd -s /sbin/nologin tomcat   //新建用户
chown tomcat:tomcat tomcat/ -R    //修改属主和属组

image.png

image.png

7)编写一个systemd服务文件

#vim /etc/systemd/system/tomcat.service
#编写tomcat.service文件
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

image.png

8)刷新和重启服务

systemctl daemon-reload
systemctl start tomcat
ss -natp |grep 8080

image.png

image.png

八、实现java项目

  • .war:WebApp打包,类zip格式文件,通常包括一个应用的所有资源,比如jsp,html,配置文件等
  • .jar:EJB类文件的打包压缩类zip格式文件,,包括很多的class文件, 网景公司发明
  • .rar:资源适配器类打包文件,目前已不常用
  • .ear:企业级WebApp打包,目前已不常用

传统应用开发测试后,通常打包为war格式,这种文件部署到Tomcat的webapps目录下,并默认会自动

conf/server.xml中文件配置
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

1.手动部署 jar 包

[root@localhost ~]# cd /data
[root@localhost data]# mkdir app1
[root@localhost data]# cd app1/
[root@localhost app1]# vim test.html
[root@localhost app1]# cat test.html 
<h1> test </h1>
[root@localhost app1]# vim test.jsp
[root@localhost app1]# cat test.jsp 
//直接复制
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<! DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>jsp例子</title>
</head>
<body>   //后面的内容是服务器端动态生成字符串,最后拼接在一起
<%
out.println ("test jsp");
%>
%%<br>
%<%=request.getRequestURL()%>
%</body>
%</html>
[root@localhost app1]# jar cvf /opt/app1.war *    //打包
已添加清单
正在添加: test.html(输入 = 16) (输出 = 16)(压缩了 0%)
正在添加: test.jsp(输入 = 270) (输出 = 205)(压缩了 24%)
[root@localhost app1]# cd /opt
[root@localhost opt]# ls
apache-tomcat-9.0.16  apache-tomcat-9.0.16.tar.gz  app1.war  jdk-8u201-linux-x64.rpm  rh
[root@localhost opt]# cp app1.war /usr/local/tomcat/webapps/
[root@localhost opt]# ll /usr/local/tomcat/webapps/
总用量 8
drwxr-x---.  3 tomcat tomcat   55 6月  28 14:58 app1
-rw-r--r--.  1 root   root    781 6月  28 14:58 app1.war
drwxr-x---. 14 tomcat tomcat 4096 6月  28 12:05 docs
drwxr-x---.  6 tomcat tomcat   83 6月  28 12:05 examples
drwxr-x---.  5 tomcat tomcat   87 6月  28 12:05 host-manager
drwxr-x---.  5 tomcat tomcat  103 6月  28 12:05 manager
drwxr-x---.  3 tomcat tomcat  283 6月  28 12:05 ROOT
[root@localhost opt]# cd /usr/local/tomcat/webapps/
[root@localhost webapps]# ls
app1  app1.war  docs  examples  host-manager  manager  ROOT
//这里可以看到app1.war自动解压为app1

浏览器访问192.168.100.20:8080/app1/test.html进行验证
浏览器访问192.168.100.20:8080/app1/test.jsp进行验证

image.png

image.png

image.png

image.png

注意:更新时记得清除缓存

[root@localhost opt]# cd /usr/local/tomcat/work/
[root@localhost work]# ls
Catalina
[root@localhost work]# tree Catalina/
Catalina/
└── localhost
    ├── app1
    │   └── org
    │       └── apache
    │           └── jsp
    │               ├── test_jsp.class   //缓存
    │               └── test_jsp.java    //缓存
    ├── docs
    ├── examples
    ├── host-manager
    ├── manager
    └── ROOT
        └── org
            └── apache
                └── jsp
                    ├── index_jsp.class
                    └── index_jsp.java

13 directories, 4 files

image.png

2.Tomcat安装博客

[root@localhost tomcat]# cd webapps/
[root@localhost webapps]# rz -E
rz waiting to receive.
[root@localhost webapps]# ls
app1      docs      host-manager   jpress-v3.2.1.war  ROOT
app1.war  examples  jpress-v3.2.1  manager
[root@localhost webapps]# ln -s jpress-v3.2.1 jpress
[root@localhost webapps]# cat >/etc/yum.repos.d/mysql.repo <<EOF
> [mysql57-community]
> name=MySQL 5.7 Community Server
> baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/
> enabled=1
> gpgcheck=0
> EOF
[root@localhost webapps]# yum install mysql-community-server -y
[root@localhost webapps]# systemctl start mysqld
[root@localhost webapps]# grep password /var/log/mysqld.log
2024-06-28T07:51:05.218788Z 1 [Note] A temporary password is generated for root@localhost: Ektrt5%QJJo0
[root@localhost webapps]# mysql -u root -p'Ektrt5%QJJo0'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> set global validate_password_policy=0;   //修改密码策略
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_length=1;   //修改密码策略
Query OK, 0 rows affected (0.00 sec)

mysql> alter user root@'localhost' identified by 'Admin@123';   //修改密码
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE DATABASE blog;    //创建数据库
Query OK, 1 row affected (0.00 sec)

mysql> GRANT all ON blog.* TO 'bloguser'@'%' IDENTIFIED BY 'admin123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

浏览器访问192.168.100.20:8080/jpress/install进行验证

image.png

image.png

在浏览器上去创建用户

image.png

写好数据库的信息,点击下一步

image.png

创建用户

image.png

输入账号密码,进入博客

image.png

image.png

九、状态页

  • server status 状态页
  • manger app 管理项目 (不建议开启)
  • host manger 配置虚拟主机的设置 (不建议开启

image.png

image.png

1.启用状态页 (只能本地访问)

默认的管理页面被禁用,修改用户认证的配置文件conf/tomcat-users.xml,将状态页启用。

[root@localhost tomcat]# cd conf/
[root@localhost conf]# ls
Catalina         catalina.properties  jaspic-providers.xml  logging.properties  tomcat-users.xml  web.xml
catalina.policy  context.xml          jaspic-providers.xsd  server.xml          tomcat-users.xsd
[root@localhost conf]# vim tomcat-users.xml
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
#加下面两行,指定用户和密码
 <role rolename="manager-gui"/>
 <user username="lhey" password="123123" roles="manager-gui"/>
[root@localhost conf]# systemctl restart tomcat.service

image.png

image.png

注意:此时只能通过本地访问,不能进行远程访问

本地登录方法:虚拟机中,打开火狐浏览器,访问127.0.0.1:8080,输入用户名lhey、密码123123,即可登录成功。

image.png

image.png

image.png

2.开启允许远程状态页

[root@localhost tomcat]# cd /usr/local/tomcat/webapps/manager/
[root@localhost manager]# ls
images  index.jsp  META-INF  status.xsd  WEB-INF  xform.xsl
[root@localhost manager]# cd META-INF/
[root@localhost META-INF]# ls
context.xml
[root@localhost META-INF]# vim context.xml 
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
 在此处下方修改
 allow="192\.\d+\.\d+\.\d+|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />     //添加允许的主机地址

[root@localhost META-INF]# systemctl restart tomcat.service 

1719719496669.jpg

image.png

image.png

浏览器访问192.168.100.20:8080/manager/status,输入用户名lhey、密码123123,即可登录成功。

image.png

image.png

3. host manger

[root@localhost tomcat]# cd conf/
[root@localhost conf]# ls
Catalina         catalina.properties  jaspic-providers.xml  logging.properties  tomcat-users.xml  web.xml
catalina.policy  context.xml          jaspic-providers.xsd  server.xml          tomcat-users.xsd
[root@localhost conf]# vim tomcat-users.xml 
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>   //在此处添加
<user username="lhey" password="123123" roles="manager-gui,admin-gui"/>    //在此处添加admin-gui
[root@localhost conf]# cd ..
[root@localhost tomcat]# cd webapps/host-manager/
[root@localhost host-manager]# ls
images  index.jsp  manager.xml  META-INF  WEB-INF
[root@localhost host-manager]# vim META-INF/context.xml 
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
在此处下方修改
allow="192\.\d+\.\d+\.\d+|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />     //添加允许的主机地址

[root@localhost host-manager]# systemctl restart tomcat.service

image.png

image.png

image.png

image.png

image.png

浏览器访问192.168.100.20:8080/host-manager/html,输入用户名lhey、密码123123,即可登录成功。

image.png

十、Tomcat的端口号

8080: 默认接收 http 请求的端口

8005: 安全端口,可以关闭tomcat

8009: apache 和 tomcat 联动 AJP 协议

十一、端口8005/tcp安全配置管理

image.png

image.png

image.png

image.png

8005是Tomcat的管理端口,默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个字符串,tomcat接收到后就会关闭此Server。

此管理功能建议禁用,可将SHUTDOWN改为一串猜不出的字符串实现或者port修改成 0,会使用随机端口如:36913

port设为-1等无效端口,将关闭此功能此行不能被注释,否则无法启动tomcat服务

示例

<Server port="8005" shutdown="44ba3c71d57f494992641b258b965f28">

十二、虚拟主机配置

  • 创建虚拟主机前,必须先创建相关目录。
[root@localhost data]# ls
app1
[root@localhost data]# mkdir web{1,2,3}/ROOT -pv
mkdir: 已创建目录 "web1"
mkdir: 已创建目录 "web1/ROOT"
mkdir: 已创建目录 "web2"
mkdir: 已创建目录 "web2/ROOT"
mkdir: 已创建目录 "web3"
mkdir: 已创建目录 "web3/ROOT"
[root@localhost data]# echo "web1 web1" > /data/web1/ROOT/index.jsp
[root@localhost data]# echo "web2 web2" > /data/web2/ROOT/index.jsp
[root@localhost data]# echo "web3 web3" > /data/web3/ROOT/index.jsp
[root@localhost data]# chown -R tomcat.tomcat /data/
[root@localhost data]# vim /usr/local/tomcat/conf/server.xml 
#找到host主机项,注意在根目录中,一定要有ROOT,这是默认 的主目录
#注意默认的结束</HOST>这段要在默认结束的后面加上

 <Host name="www.a.com"  appBase="/data/web1"
            unpackWARs="true" autoDeploy="true">
            </Host>

      <Host name="www.b.com"  appBase="/data/web2"
            unpackWARs="true" autoDeploy="true">
            </Host>

      <Host name="www.c.com"  appBase="/data/web3"
            unpackWARs="true" autoDeploy="true">
            </Host>
            
[root@localhost data]# systemctl restart tomcat.service

image.png

image.png

image.png

使用另外一台主机去测试一下,先添加hosts文件。

image.png

使用curl去测试,输入不同的域名可以得到不同的页面信息。

image.png

十三、context配置

Context作用:

  • 路径映射:将url映射至指定路径,而非使用appBase下的物理目录,实现虚拟目录功能
  • 应用独立配置,例如单独配置应用日志、单独配置应用访问控制
//映射指定路径
<Context path="/test" docBase="/data/test" reloadable="true" />

//映射站点的根目录
<Context path="/" docBase="/data/website" reloadable="true" />

//还可以添加日志等独立的配置
<Context path="/test" docBase="/data/test" reloadable="true" >
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_test_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Context>

详解

  • path:指的是访问的URL路径,如果path与appBase下面的子目录同名,context的docBase路径优先更高
  • docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)
  • reloadable:true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB应用重新加载。生产环境中,建议使用false来禁用。
[root@localhost data]# cd /usr/local/tomcat/conf/
[root@localhost conf]# ls
Catalina         catalina.properties  jaspic-providers.xml  logging.properties  tomcat-users.xml  web.xml
catalina.policy  context.xml          jaspic-providers.xsd  server.xml          tomcat-users.xsd
[root@localhost conf]# vim server.xml
     <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
在下方添加
      <Host name="www.a.com"  appBase="/data/web1"
            unpackWARs="true" autoDeploy="true">
      <Context path="/test" docBase="/data/test" reloadable="false" />
            </Host>
[root@localhost conf]# cd /data
[root@localhost data]# mkdir test
[root@localhost data]# cd test/
[root@localhost test]# echo "hello world" > index.jsp
[root@localhost test]# chown -R tomcat.tomcat /data/
[root@localhost test]# systemctl restart tomcat.service

[root@localhost ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.20 www.a.com    //添加

[root@localhost ~]# curl www.a.com:8080/test/ //验证 
hello world //置换为/data/test/内容